aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstonedDiscord <stoned@derpymail.org>2019-07-16 18:19:40 +0200
committerGitHub <noreply@github.com>2019-07-16 18:19:40 +0200
commitb0394289a591417ed2300b076da205b3fa03750d (patch)
tree6dd502e5d7e09123f3f107d820ec176782a8b6a0
parent93a4462c3c2f333f9bc54296847d628d6d46bdb1 (diff)
parentc4c754944c209fc365e04aa17e6bd3a73c504e26 (diff)
Merge pull request #4 from AttorneyOnline/master
i'm sure there is a way to do this correctly
-rw-r--r--.eslintrc.js22
-rw-r--r--README.md24
-rw-r--r--package.json17
-rw-r--r--webAO/backgrounds.js25
-rw-r--r--webAO/client.b.js2
-rw-r--r--webAO/client.b.js.map2
-rw-r--r--webAO/client.css300
-rw-r--r--webAO/client.html395
-rw-r--r--webAO/client.js1591
-rw-r--r--webAO/evidence.js10
-rw-r--r--webAO/fingerprint.b.js2
-rw-r--r--webAO/fingerprint.b.js.map1
-rw-r--r--webAO/fingerprint.js1192
-rw-r--r--webAO/golden/css/goldenlayout.css3
-rw-r--r--webAO/lib/gify.min.js1
-rw-r--r--webAO/lib/jdataview.min.js50
-rw-r--r--webAO/lib/jquery.ui.touch-punch.min.js11
-rw-r--r--webAO/master.html6
-rw-r--r--webAO/master.js115
-rw-r--r--webAO/misc/character_change.pngbin0 -> 1229 bytes
-rw-r--r--webAO/misc/character_random.pngbin0 -> 1277 bytes
-rw-r--r--webAO/misc/crossexamination.gifbin0 -> 88834 bytes
-rw-r--r--webAO/misc/empty.pngbin0 -> 343 bytes
-rw-r--r--webAO/misc/evidence_add.pngbin0 -> 987 bytes
-rw-r--r--webAO/misc/evidence_cancel.pngbin0 -> 1037 bytes
-rw-r--r--webAO/misc/evidence_edit.pngbin0 -> 956 bytes
-rw-r--r--webAO/misc/evidence_remove.pngbin0 -> 1079 bytes
-rw-r--r--webAO/misc/evidence_selector.pngbin0 -> 931 bytes
-rw-r--r--webAO/misc/flash.pngbin0 -> 1731 bytes
-rw-r--r--webAO/misc/flip.pngbin0 -> 1576 bytes
-rw-r--r--webAO/misc/holdit.gifbin0 -> 40518 bytes
-rw-r--r--webAO/misc/location_change.pngbin0 -> 1091 bytes
-rw-r--r--webAO/misc/objection.gifbin0 -> 44417 bytes
-rw-r--r--webAO/misc/placeholder.gifbin9168 -> 338 bytes
-rw-r--r--webAO/misc/shake.pngbin0 -> 2018 bytes
-rw-r--r--webAO/misc/takethat.gifbin0 -> 42063 bytes
-rw-r--r--webAO/misc/witnesstestimony.gifbin0 -> 105223 bytes
-rw-r--r--webAO/sounds/general/sfx-testimony.wavbin0 -> 71436 bytes
-rw-r--r--webAO/sounds/general/sfx-testimony2.wavbin0 -> 132764 bytes
-rw-r--r--webAO/ui.b.js2
-rw-r--r--webAO/ui.b.js.map2
-rw-r--r--webAO/ui.js153
-rw-r--r--webpack.config.js20
43 files changed, 3301 insertions, 645 deletions
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..3cd51ec
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,22 @@
+module.exports = {
+ "env": {
+ "browser": true,
+ "es6": true,
+ "jquery": true
+ },
+ "extends": "eslint:recommended",
+ "globals": {
+ "Atomics": "readonly",
+ "SharedArrayBuffer": "readonly"
+ },
+ "parserOptions": {
+ "ecmaVersion": 2018,
+ "sourceType": "module"
+ },
+ "rules": {
+ "no-console": "off",
+ "no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }],
+ "eqeqeq": ["error", "smart"],
+ "semi": ["error", "always"]
+ }
+}; \ No newline at end of file
diff --git a/README.md b/README.md
index ffbcd76..f9c6d79 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,22 @@
-# Attorney Online Web Client
+# webAO
-Link to the client in this repo: http://stoneddiscord.github.io/webAO/master.html
+This is a client for the Attorney Online roleplaying chatroom written in HTML and JavaScript.
+It works with the tsuserver3/serverD software when the server has WebSockets enabled.
-Guide to installing it locally: https://docs.google.com/document/d/1X4OjG0tfoTZayqY9MM6fqzL_aGMKFAECg7NSQRYafAU/edit
+webAO-only features:
+ - BBcode
+ - Screen shake
+ - Asset URLs
+ - Automated testimony control
+
+Desktop-only features:
+ - Pairing
+ - 2.6+ markup
+ - Non-interrupting preanimations
+ - Guilty/not guilty
-This is a client for the Attorney Online roleplaying chatroom written in HTML and Javascript.
-It works with the serverD software when the server has WebSockets enabled.
+In short, webAO is in disrepair. Again.
+
+Link to the client in this repo: http://web.aceattorneyonline.com/
+
+Guide to installing it locally: https://docs.google.com/document/d/1X4OjG0tfoTZayqY9MM6fqzL_aGMKFAECg7NSQRYafAU/edit
diff --git a/package.json b/package.json
index d72b6f0..57d6ba8 100644
--- a/package.json
+++ b/package.json
@@ -20,11 +20,16 @@
},
"homepage": "https://github.com/stonedDiscord/stonedDiscord.github.io#readme",
"devDependencies": {
- "@babel/core": "^7.3.4",
- "@babel/preset-env": "^7.3.4",
- "babel-loader": "^8.0.5",
- "webpack": "^4.29.6",
- "webpack-cli": "^3.3.0"
+ "@babel/core": "^7.4.5",
+ "@babel/preset-env": "^7.4.5",
+ "babel-loader": "^8.0.6",
+ "eslint": "^6.0.1",
+ "golden-layout": "^1.5.9",
+ "webpack": "^4.35.2",
+ "webpack-cli": "^3.3.5"
},
- "dependencies": {}
+ "dependencies": {
+ "core-js": "^3.1.4",
+ "regenerator-runtime": "^0.13.2"
+ }
}
diff --git a/webAO/backgrounds.js b/webAO/backgrounds.js
new file mode 100644
index 0000000..4d5a726
--- /dev/null
+++ b/webAO/backgrounds.js
@@ -0,0 +1,25 @@
+export default [
+ "Anime",
+ "birthday",
+ "Christmas",
+ "CountyCourt",
+ "CruiseCourt",
+ "default",
+ "DGDEnglishCourt",
+ "DGSJapanCourt",
+ "DualDestinies",
+ "EnglishCourt",
+ "gs4",
+ "GS4Night",
+ "HD",
+ "Khura'in",
+ "mlp",
+ "NewCourt",
+ "RuinedCourt",
+ "Sky",
+ "SpaceCourt",
+ "Themis",
+ "TouhouCourt",
+ "WitchTrialCourt",
+ "Zetta"
+]; \ No newline at end of file
diff --git a/webAO/client.b.js b/webAO/client.b.js
index f1d2850..ddd5abb 100644
--- a/webAO/client.b.js
+++ b/webAO/client.b.js
@@ -1,2 +1,2 @@
-!function(e){var t={};function n(c){if(t[c])return t[c].exports;var i=t[c]={i:c,l:!1,exports:{}};return e[c].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,c){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:c})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var c=Object.create(null);if(n.r(c),Object.defineProperty(c,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(c,i,function(t){return e[t]}.bind(null,i));return c},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}({3:function(e,t,n){"use strict";function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n<t.length;n++){var c=t[n];c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(e,c.key,c)}}function o(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}n.r(t),n.d(t,"onOOCEnter",function(){return y}),n.d(t,"onEnter",function(){return v}),n.d(t,"musiclist_click",function(){return E}),n.d(t,"changeMusicVolume",function(){return _}),n.d(t,"changeSFXVolume",function(){return I}),n.d(t,"changeBlipVolume",function(){return B}),n.d(t,"changeCharacter",function(){return b}),n.d(t,"imgError",function(){return k}),n.d(t,"demoError",function(){return w}),n.d(t,"ReconnectButton",function(){return x}),n.d(t,"RetryButton",function(){return T}),n.d(t,"pickchar",function(){return S}),n.d(t,"pickemotion",function(){return O}),n.d(t,"toggleshout",function(){return D});var s={};location.search.substr(1).split("&").forEach(function(e){s[e.split("=")[0]]=e.split("=")[1]});var a=s.ip,r=s.mode,l=s.asset||"http://assets.aceattorneyonline.com/base/",u=l+"sounds/music/",d=!1;/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)&&(d=!0);var h=0,m=new Date(0),p=function(){function e(t){var n=this;c(this,e),this.serv=new WebSocket("ws://"+t),this.serv.onopen=function(e){return n.onOpen(e)},this.serv.onclose=function(e){return n.onClose(e)},this.serv.onmessage=function(e){return n.onMessage(e)},this.serv.onerror=function(e){return n.onError(e)},this.playerID=1,this.charID=-1,this.chars=[],this.emotes=[],this.selectedEmote=-1,this.checkUpdater=null,this.musicList=Object(),this.handlers={MS:function(e){return n.handleMS(e)},CT:function(e){return n.handleCT(e)},MC:function(e){return n.handleMC(e)},RMC:function(e){return n.handleRMC(e)},CI:function(e){return n.handleCI(e)},SC:function(e){return n.handleSC(e)},EI:function(e){return n.handleEI(e)},EM:function(e){return n.handleEM(e)},SM:function(e){return n.handleSM(e)},BD:function(e){return n.handleBD(e)},music:function(e){return n.handlemusic(e)},DONE:function(e){return n.handleDONE(e)},BN:function(e){return n.handleBN(e)},NBG:function(e){return n.handleNBG(e)},HP:function(e){return n.handleHP(e)},ID:function(e){return n.handleID(e)},PN:function(e){return n.handlePN(e)},SI:function(e){return n.handleSI(e)},CharsCheck:function(e){return n.handleCharsCheck(e)},PV:function(e){return n.handlePV(e)},CHECK:function(e){}},this._lastTimeICReceived=new Date(0)}return o(e,[{key:"me",value:function(){return this.chars[this.charID]}},{key:"myEmote",value:function(){return this.emotes[this.selectedEmote]}},{key:"sendOOC",value:function(e){this.serv.send("CT#web".concat(this.playerID,"#").concat(H(e),"#%"))}},{key:"sendIC",value:function(e,t,n,c,i,o,s,a,r){this.serv.send("MS#chat#".concat(e,"#").concat(t,"#").concat(n)+"#".concat(H(c),"#").concat(i,"#").concat(o,"#").concat(s)+"#".concat(this.charID,"#").concat(a,"#").concat(h,"#0#0#0#0#%"))}},{key:"sendMusicChange",value:function(e){this.serv.send("MC#".concat(e,"#").concat(this.charID,"#%"))}},{key:"sendLeaveRoom",value:function(){this.serv.send("FC#%")}},{key:"joinServer",value:function(){var e=this;this.serv.send("HI#".concat(navigator.userAgent.hashCode(),"#%")),this.serv.send("ID#webAO#2.4.5#%"),this.checkUpdater=setInterval(function(){return e.sendCheck()},5e3)}},{key:"sendCharacter",value:function(e){this.serv.send("CC#".concat(this.playerID,"#").concat(e,"#web#%"))}},{key:"sendMusic",value:function(e){this.serv.send("MC#".concat(e))}},{key:"sendCheck",value:function(){this.serv.send("CH#".concat(this.charID,"#%"))}},{key:"onOpen",value:function(e){"watch"===r?(document.getElementById("client_loading").style.display="none",document.getElementById("client_charselect").style.display="none"):L.joinServer()}},{key:"onClose",value:function(e){console.error("The connection was closed: ".concat(e.reason," (").concat(e.code,")")),1001!==e.code&&(document.getElementById("client_error").style.display="block",document.getElementById("error_id").textContent=e.code,this.cleanup())}},{key:"onMessage",value:function(e){var t=e.data;console.debug(t);var n=t.split("%")[0].split("#"),c=n[0],i=this.handlers[c];void 0!==i?i(n):console.warn("Invalid packet header ".concat(c))}},{key:"onError",value:function(e){console.error("A network error occurred: ".concat(e.reason," (").concat(e.code,")")),document.getElementById("client_error").style.display="block",document.getElementById("error_id").textContent=e.code,this.cleanup()}},{key:"cleanup",value:function(){try{this.serv.close(1001)}catch(e){}clearInterval(this.checkUpdater)}},{key:"handleMS",value:function(e){if(e[4]!=N.chatmsg.content){document.getElementById("client_inner_chat").innerHTML="";for(var t={pre:escape(e[2]),character:-1,preanim:escape(e[2]),nameplate:e[3],name:e[3],speaking:"(b)"+escape(e[4]),silent:"(a)"+escape(e[4]),content:e[5],side:e[6],sound:escape(e[7]),type:e[8],snddelay:e[10],objection:e[11],evidence:e[12],flash:e[14],color:e[15],isnew:!0},n=0;n<this.chars.length;n++)if(this.chars[n].name==e[3]){t.character=n;break}t.character==this.charID&&(document.getElementById("client_inputbox").value="",h&&(document.getElementById("button_"+h).className="client_button",h=0)),N.say(t)}}},{key:"handleCT",value:function(e){var t=document.getElementById("client_ooclog");t.innerHTML+="".concat(e[1],": ").concat(e[2],"\r\n"),t.scrollTop>t.scrollHeight-60&&(t.scrollTop=t.scrollHeight)}},{key:"handleMC",value:function(e){var t=N.music;if(t.pause(),t.src=u+e[1],t.play(),e[2]>=0){var n=this.chars[e[2]].name;M("".concat(n," changed music to ").concat(e[1]))}else M("The music was changed to ".concat(e[1]))}},{key:"handleRMC",value:function(e){N.music.pause(),N.music=new Audio(this.musicList[e[1]]);var t=N.music;t.totime=e[1],t.offset=(new Date).getTime()/1e3,t.addEventListener("loadedmetadata",function(){t.currentTime+=parseFloat(t.totime+((new Date).getTime()/1e3-t.offset)).toFixed(3),t.play()},!1)}},{key:"handleCI",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Character "+e[1],this.serv.send("AN#"+(e[1]/10+1)+"#%");for(var t=2;t<e.length-1;t++)if(t%2==0){var n=e[t].split("&");this.chars[e[t-1]]={name:n[0],desc:n[1],evidence:n[3],icon:l+"characters/"+escape(n[0])+"/char_icon.png"}}}},{key:"handleSC",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Characters";for(var t=1;t<e.length-1;t++){var n=e[t].split("&");this.chars[t-1]={name:n[0],desc:n[1],evidence:n[3],icon:l+"characters/"+escape(n[0])+"/char_icon.png"}}this.serv.send("RM#%")}},{key:"handleEI",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Evidence "+e[1],this.serv.send("RM#%")}},{key:"handleEM",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Music "+e[1],this.serv.send("AM#"+(e[1]/10+1)+"#%");for(var t=document.getElementById("client_musiclist"),n=2;n<e.length-1;n++)if(n%2==0){var c=document.createElement("OPTION");c.text=e[n],t.options.add(c)}}},{key:"handleSM",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Music ";for(var t=document.getElementById("client_musiclist"),n=1;n<e.length-1;n++){var c=document.createElement("OPTION");c.text=e[n],t.options.add(c)}this.serv.send("RD#%")}},{key:"handleBD",value:function(e){document.getElementById("client_loadingtext").innerHTML="Banned: "+e[1]}},{key:"handlemusic",value:function(e){for(var t=0;t<e.length/2;t++)this.musicList[e[2*t]]=e[2*t+1]}},{key:"handleDONE",value:function(e){document.getElementById("client_loading").style.display="none",document.getElementById("client_charselect").style.display="block"}},{key:"handleBN",value:function(e){N.bgname=escape(e[1])}},{key:"handleNBG",value:function(e){}},{key:"handleHP",value:function(e){1==e[1]?document.getElementById("client_defense_hp").style.clip="rect(0px,"+90*e[2]/10+"px,20px,0px)":document.getElementById("client_prosecutor_hp").style.clip="rect(0px,"+90*e[2]/10+"px,20px,0px)"}},{key:"handleID",value:function(e){this.playerID=e[1]}},{key:"handlePN",value:function(e){this.serv.send("askchaa#%")}},{key:"handleSI",value:function(e){d?this.serv.send("askchar2#%"):this.serv.send("RC#%")}},{key:"handleCharsCheck",value:function(e){document.getElementById("client_chartable").innerHTML="";for(var t=0;t<this.chars.length;t++){if(t%8==0)var n=document.createElement("TR");var c=document.createElement("TD"),i=void 0,o=this.chars[t].icon;i="-1"==e[t+1]?" dark":"",c.innerHTML="<img class='demothing".concat(i,"' id='demo_").concat(t,"' ")+"src='".concat(o,"' alt='").concat(this.chars[t].name,"' onclick='pickchar(").concat(t,")' ")+"onerror='demoError(this);'>",n.appendChild(c),t%8==0&&document.getElementById("client_chartable").appendChild(n)}C("def")}},{key:"handlePV",value:function(e){this.charID=e[3],document.getElementById("client_charselect").style.display="none";var t=this.me(),n=this.emotes,c=new XMLHttpRequest;c.open("GET",l+"characters/"+escape(this.me().name)+"/char.ini",!0),c.responseType="text",c.onload=function(e){if(200==this.status){var c=this.responseText,i=f.parse(c);t.side=i.Options.side;for(var o=1;o<i.Emotions.number;o++){var s=i.Emotions[o].split("#"),a="0",r="0";void 0!==i.SoundN&&(a=i.SoundN[o]),void 0!==i.SoundT&&(r=i.SoundT[o]),n[o]={desc:s[0],speaking:s[1],silent:s[2],zoom:s[3],sfx:a,sfxdelay:r,button_off:l+"characters/"+escape(t.name)+"/emotions/button"+o+"_off.png",button_on:l+"characters/"+escape(t.name)+"/emotions/button"+o+"_on.png"},document.getElementById("client_emo").innerHTML+="<img src='"+n[o].button_off+"' id='emo_"+o+"' alt='"+n[o].desc+"' class='client_button' onclick='pickemotion("+o+")'>"}O(1)}},c.send()}}]),e}(),g=function(){function e(){c(this,e),this.textnow="",this.chatmsg={isnew:!1,content:"",objection:"0",sound:"",startspeaking:!1,side:null,color:"0",snddelay:0},this.blip=new Audio(l+"sounds/general/sfx-blipmale.wav"),this.blip.volume=.5,this.blipChannels=new Array(6);for(var t=0;t<this.blipChannels.length;t++)this.blipChannels[t]=new Audio(l+"sounds/general/sfx-blipmale.wav"),this.blipChannels[t].volume=.5;this.currentBlipChannel=0,this.sfxaudio=new Audio(l+"sounds/general/sfx-blipmale.wav"),this.sfxplayed=0,this.music=new Audio,this.music.play(),this.updater=null,this.bgname="gs4",this.shoutTimer=0,this.textTimer=0,this._animating=!1}return o(e,[{key:"isAnimating",value:function(){return this._animating}},{key:"setBlipVolume",value:function(e){for(var t=0;t<this.blipChannels.length;t++)this.blipChannels[t].volume=e}},{key:"bgFolder",value:function(){return"".concat(l,"background/").concat(this.bgname,"/")}},{key:"say",value:function(e){var t=this;this.chatmsg=e,M(e.content,e.nameplate),C(e.side),this.textnow="",this.sfxplayed=0,this.textTimer=0,this._animating=!0,clearTimeout(this.updater),this.updater=setTimeout(function(){return t.updateText()},65)}},{key:"updateText",value:function(){var e=this;if(""==this.chatmsg.content.trim()?(document.getElementById("client_name").style.display="none",document.getElementById("client_chat").style.display="none"):(document.getElementById("client_name").style.display="block",document.getElementById("client_chat").style.display="block"),this._animating&&(this.updater=setTimeout(function(){return e.updateText()},65)),this.chatmsg.isnew){var t={1:"holdit",2:"takethat",3:"objection"}[this.chatmsg.objection];void 0!==t?(document.getElementById("client_char").src=l+"misc/"+t+".gif",new Audio("".concat(l,"/characters/").concat(this.chatmsg.name,"/").concat(t,".wav")).play(),this.shoutTimer=800):this.shoutTimer=0,this.chatmsg.isnew=!1,this.chatmsg.startspeaking=!0}if(this.textTimer>=this.shoutTimer)if(this.chatmsg.startspeaking){C(this.chatmsg.side),document.getElementById("client_char").src=l+"characters/"+escape(this.chatmsg.name)+"/"+this.chatmsg.speaking+".gif",document.getElementById("client_name").style.fontSize=.7*document.getElementById("client_name").offsetHeight+"px",document.getElementById("client_chat").style.fontSize=.25*document.getElementById("client_chat").offsetHeight+"px",document.getElementById("client_name").innerHTML="<p>"+this.chatmsg.nameplate.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")+"</p>";var n="color: "+({0:"#ffffff",1:"#00ff00",2:"#ff0000",3:"#ffaa00",4:"#0000ff",5:"#ffff00",6:"#aa00aa"}[this.chatmsg.color]||"#ffffff");document.getElementById("client_inner_chat").style=n,this.chatmsg.startspeaking=!1,this.textnow==this.chatmsg.content&&(document.getElementById("client_char").src=l+"characters/"+escape(this.chatmsg.name)+"/"+this.chatmsg.silent+".gif",this._animating=!1,clearTimeout(this.updater))}else this.textnow!=this.chatmsg.content&&(" "!=this.chatmsg.content.charAt(this.textnow.length)&&(this.blipChannels[this.currentBlipChannel].play(),this.currentBlipChannel++,this.currentBlipChannel%=this.blipChannels.length),this.textnow=this.chatmsg.content.substring(0,this.textnow.length+1),document.getElementById("client_inner_chat").innerHTML=this.textnow,this.textnow==this.chatmsg.content&&(this.textTimer=0,this._animating=!1,document.getElementById("client_char").src=l+"characters/"+escape(this.chatmsg.name)+"/"+this.chatmsg.silent+".gif",clearTimeout(this.updater)));!this.sfxplayed&&this.chatmsg.snddelay+this.shoutTimer>=this.textTimer&&(this.sfxaudio.pause(),this.sfxplayed=1,"0"!=this.chatmsg.sound&&"1"!=this.chatmsg.sound&&(this.sfxaudio.src=l+"sounds/general/"+escape(this.chatmsg.sound)+".wav",this.sfxaudio.play())),this.textTimer=this.textTimer+65}}]),e}(),f=function(){function e(){c(this,e)}return o(e,null,[{key:"parse",value:function(e){var t={section:/^\s*\[\s*([^\]]*)\s*\]\s*$/,param:/^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/,comment:/^\s*;.*$/},n={},c=e.split(/\r\n|\r|\n/),i=null;return c.forEach(function(e){if(!t.comment.test(e)&&0!=e.length)if(t.param.test(e)){var c=e.match(t.param);i?n[i][c[1]]=c[2]:n[c[1]]=c[2]}else if(t.section.test(e)){var o=e.match(t.section);n[o[1]]={},i=o[1]}}),n}}]),e}();function y(e){13==e.keyCode&&(L.sendOOC(document.getElementById("client_oocinputbox").value),document.getElementById("client_oocinputbox").value="")}function v(e){if(13==e.keyCode){var t=L.me(),n=L.myEmote(),c="0",i="0";document.getElementById("sendsfx").checked&&(c=n.sfx,i=n.sfxdelay),L.sendIC(n.speaking,t.name,n.silent,document.getElementById("client_inputbox").value,t.side,c,n.zoom,i,h)}}function E(e){var t=document.getElementById("client_musiclist").value;L.sendMusicChange(t)}function _(){N.music.volume=document.getElementById("client_mvolume").value/100}function I(){N.sfxaudio.volume=document.getElementById("client_svolume").value/100}function B(){N.setBlipVolume(document.getElementById("client_bvolume").value/100)}function b(e){L.sendLeaveRoom(),document.getElementById("client_charselect").style.display="block",document.getElementById("client_emo").innerHTML=""}function k(e){return e.onerror="",e.src="/misc/placeholder.gif",!0}function w(e){return e.onerror="",e.src="/misc/placeholder.png",!0}function C(e){var t,n=N.bgFolder();switch(document.getElementById("client_fg").style.display="none",document.getElementById("client_bench").style.display="none",e){case"def":document.getElementById("client_court").src=n+"defenseempty.png",document.getElementById("client_bench").style.display="block",document.getElementById("client_bench").src=n+"defensedesk.png",t="defense";break;case"pro":document.getElementById("client_court").src=n+"prosecutorempty.png",document.getElementById("client_bench").style.display="block",document.getElementById("client_bench").src=n+"prosecutiondesk.png",t="prosecution";break;case"hld":document.getElementById("client_court").src=n+"helperstand.png",t="defense";break;case"hlp":document.getElementById("client_court").src=n+"prohelperstand.png",t="prosecution";break;case"wit":document.getElementById("client_court").src=n+"witnessempty.png",document.getElementById("client_bench").style.display="block",document.getElementById("client_bench").src=n+"estrado.png",t="prosecution";break;case"jud":document.getElementById("client_court").src=n+"judgestand.png",t="prosecution"}5==N.chatmsg.type&&(document.getElementById("client_bench").style.display="none",document.getElementById("client_court").src=l+"themes/default/"+t+"_speedlines.gif")}function x(){L.cleanup(),(L=new p(a))&&(r="join",document.getElementById("client_error").style.display="none")}function T(){L.joinServer()}function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Date,c=document.createElement("p"),i=document.createElement("span");if(i.id="iclog_name",i.appendChild(document.createTextNode(t)),c.appendChild(i),c.appendChild(document.createTextNode(e)),m.getMinutes()!==n.getMinutes()){var o=document.createElement("span");o.id="iclog_time",o.innerText=n.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"}),c.appendChild(o)}var s=document.getElementById("client_log");s.appendChild(c),s.scrollTop>s.scrollHeight-600&&(s.scrollTop=s.scrollHeight),m=new Date}function S(e){e<1e3?L.sendCharacter(e):(document.getElementById("client_charselect").style.display="none",document.getElementById("client_inputbox").style.display="none",document.getElementById("client_emo").style.display="none")}function O(e){-1!=L.selectedEmote&&(document.getElementById("emo_"+L.selectedEmote).src=L.myEmote().button_off),L.selectedEmote=e,document.getElementById("emo_"+e).src=L.myEmote().button_on}function D(e){e==h?(document.getElementById("button_"+e).className="client_button",h=0):(document.getElementById("button_"+e).className="client_button dark",h&&(document.getElementById("button_"+h).className="client_button"),h=e)}function H(e){return e.replace(/#/g,"<pound>").replace(/&/g,"<and>").replace(/%/g,"<percent>").replace(/\$/g,"<dollar>")}window.onOOCEnter=y,window.onEnter=v,window.musiclist_click=E,window.changeMusicVolume=_,window.changeSFXVolume=I,window.changeBlipVolume=B,window.changeCharacter=b,window.imgError=k,window.demoError=w,window.ReconnectButton=x,window.RetryButton=T,window.pickchar=S,window.pickemotion=O,window.toggleshout=D,void 0===String.prototype.trim&&(String.prototype.trim=function(){return String(this).replace(/^\s+|\s+$/g,"")}),String.prototype.hashCode=function(){var e,t=0;if(0===this.length)return t;for(e=0;e<this.length;e++)t=(t<<5)-t+this.charCodeAt(e),t|=0;return t};var L=new p(a),N=new g}});
+!function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}({3:function(e,t,n){"use strict";n.r(t);var i=["Anime","birthday","Christmas","CountyCourt","CruiseCourt","default","DGDEnglishCourt","DGSJapanCourt","DualDestinies","EnglishCourt","gs4","GS4Night","HD","Khura'in","mlp","NewCourt","RuinedCourt","Sky","SpaceCourt","Themis","TouhouCourt","WitchTrialCourt","Zetta"],o=["1.png","2.png","3.png","4.png","5.png","6.png","empty.png","lawyerbadge.png"];function c(e){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var a=function e(t){var n,i;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),n=Array.prototype.forEach,i=Array.prototype.map,this.each=function(e,t,i){if(null!==e)if(n&&e.forEach===n)e.forEach(t,i);else if(e.length===+e.length){for(var o=0,c=e.length;o<c;o++)if(t.call(i,e[o],o,e)==={})return}else for(var a in e)if(e.hasOwnProperty(a)&&t.call(i,e[a],a,e)==={})return},this.map=function(e,t,n){var o=[];return null==e?o:i&&e.map===i?e.map(t,n):(this.each(e,function(e,i,c){o[o.length]=t.call(n,e,i,c)}),o)},"object"==c(t)?(this.hasher=t.hasher,this.screen_resolution=t.screen_resolution,this.screen_orientation=t.screen_orientation,this.canvas=t.canvas,this.ie_activex=t.ie_activex):"function"==typeof t&&(this.hasher=t)};a.prototype={get:function(){var e=[];(e.push(navigator.userAgent),e.push(navigator.language),e.push(screen.colorDepth),this.screen_resolution)&&(void 0!==this.getScreenResolution()&&e.push(this.getScreenResolution().join("x")));return e.push((new Date).getTimezoneOffset()),e.push(this.hasSessionStorage()),e.push(this.hasLocalStorage()),e.push(!!window.indexedDB),document.body?e.push(c(document.body.addBehavior)):e.push("undefined"),e.push(c(window.openDatabase)),e.push(navigator.cpuClass),e.push(navigator.platform),e.push(navigator.doNotTrack),e.push(this.getPluginsString()),this.canvas&&this.isCanvasSupported()&&e.push(this.getCanvasFingerprint()),this.hasher?this.hasher(e.join("###"),31):this.murmurhash3_32_gc(e.join("###"),31)},murmurhash3_32_gc:function(e,t){var n,i,o,c,a,s,r,l;for(n=3&e.length,i=e.length-n,o=t,a=3432918353,s=461845907,l=0;l<i;)r=255&e.charCodeAt(l)|(255&e.charCodeAt(++l))<<8|(255&e.charCodeAt(++l))<<16|(255&e.charCodeAt(++l))<<24,++l,o=27492+(65535&(c=5*(65535&(o=(o^=r=(65535&(r=(r=(65535&r)*a+(((r>>>16)*a&65535)<<16)&4294967295)<<15|r>>>17))*s+(((r>>>16)*s&65535)<<16)&4294967295)<<13|o>>>19))+((5*(o>>>16)&65535)<<16)&4294967295))+((58964+(c>>>16)&65535)<<16);switch(r=0,n){case 3:r^=(255&e.charCodeAt(l+2))<<16;case 2:r^=(255&e.charCodeAt(l+1))<<8;case 1:o^=r=(65535&(r=(r=(65535&(r^=255&e.charCodeAt(l)))*a+(((r>>>16)*a&65535)<<16)&4294967295)<<15|r>>>17))*s+(((r>>>16)*s&65535)<<16)&4294967295}return o^=e.length,o=2246822507*(65535&(o^=o>>>16))+((2246822507*(o>>>16)&65535)<<16)&4294967295,o=3266489909*(65535&(o^=o>>>13))+((3266489909*(o>>>16)&65535)<<16)&4294967295,(o^=o>>>16)>>>0},hasLocalStorage:function(){try{return!!window.localStorage}catch(e){return!0}},hasSessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},isCanvasSupported:function(){var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))},isIE:function(){return"Microsoft Internet Explorer"===navigator.appName||!("Netscape"!==navigator.appName||!/Trident/.test(navigator.userAgent))},getPluginsString:function(){return this.isIE()&&this.ie_activex?this.getIEPluginsString():this.getRegularPluginsString()},getRegularPluginsString:function(){return this.map(navigator.plugins,function(e){var t=this.map(e,function(e){return[e.type,e.suffixes].join("~")}).join(",");return[e.name,e.description,t].join("::")},this).join(";")},getIEPluginsString:function(){if(window.ActiveXObject){return this.map(["ShockwaveFlash.ShockwaveFlash","AcroPDF.PDF","PDF.PdfCtrl","QuickTime.QuickTime","rmocx.RealPlayer G2 Control","rmocx.RealPlayer G2 Control.1","RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)","RealVideo.RealVideo(tm) ActiveX Control (32-bit)","RealPlayer","SWCtl.SWCtl","WMPlayer.OCX","AgControl.AgControl","Skype.Detection"],function(e){try{return new ActiveXObject(e),e}catch(e){return null}}).join(";")}return""},getScreenResolution:function(){return this.screen_orientation?screen.height>screen.width?[screen.height,screen.width]:[screen.width,screen.height]:[screen.height,screen.width]},getCanvasFingerprint:function(){var e=document.createElement("canvas"),t=e.getContext("2d"),n='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}|[]:"<>?;,.';return t.textBaseline="top",t.font="14px 'Arial'",t.textBaseline="alphabetic",t.fillStyle="#f60",t.fillRect(125,1,62,20),t.fillStyle="#069",t.fillText(n,2,15),t.fillStyle="rgba(102, 204, 0, 0.7)",t.fillText(n,4,17),e.toDataURL()}};function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function l(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}n.d(t,"onOOCEnter",function(){return C}),n.d(t,"onEnter",function(){return B}),n.d(t,"musiclist_click",function(){return k}),n.d(t,"area_click",function(){return x}),n.d(t,"changeMusicVolume",function(){return T}),n.d(t,"changeSFXVolume",function(){return S}),n.d(t,"changeBlipVolume",function(){return L}),n.d(t,"changeCharacter",function(){return O}),n.d(t,"imgError",function(){return P}),n.d(t,"demoError",function(){return M}),n.d(t,"ReconnectButton",function(){return R}),n.d(t,"RetryButton",function(){return H}),n.d(t,"pickChar",function(){return F}),n.d(t,"pickEmotion",function(){return U}),n.d(t,"pickEvidence",function(){return Z}),n.d(t,"addEvidence",function(){return X}),n.d(t,"editEvidence",function(){return G}),n.d(t,"deleteEvidence",function(){return V}),n.d(t,"cancelEvidence",function(){return z}),n.d(t,"getIndexFromSelect",function(){return W}),n.d(t,"updateEvidenceIcon",function(){return q}),n.d(t,"updateActionCommands",function(){return K}),n.d(t,"changeBackgroundOOC",function(){return Q}),n.d(t,"changeRoleOOC",function(){return J}),n.d(t,"randomCharacterOOC",function(){return Y}),n.d(t,"callMod",function(){return ee}),n.d(t,"initWT",function(){return te}),n.d(t,"initCE",function(){return ne}),n.d(t,"addHPD",function(){return ie}),n.d(t,"redHPD",function(){return oe}),n.d(t,"addHPP",function(){return ce}),n.d(t,"redHPP",function(){return ae}),n.d(t,"updateBackgroundPreview",function(){return se}),n.d(t,"toggleEffect",function(){return re}),n.d(t,"toggleFlip",function(){return le}),n.d(t,"togglePresent",function(){return de}),n.d(t,"toggleMenu",function(){return ue}),n.d(t,"toggleShout",function(){return me});var d={};location.search.substr(1).split("&").forEach(function(e){d[e.split("=")[0]]=e.split("=")[1]});var u=d.ip,m=d.mode,h=d.asset||"http://s3.wasabisys.com/webao/base/",g=h+"sounds/music/",f=!1;/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)&&(f=!0);var p=0,y=1,v=0,E=new a({canvas:!0,ie_activex:!0,screen_resolution:!0}).get();console.log(E);var _=new Date(0),w=function(){function e(t){var n=this;s(this,e),this.serv=new WebSocket("ws://"+t),this.serv.onopen=function(e){return n.onOpen(e)},this.serv.onclose=function(e){return n.onClose(e)},this.serv.onmessage=function(e){return n.onMessage(e)},this.serv.onerror=function(e){return n.onError(e)},this.flip=!1,this.presentable=!1,this.hp=[0,0],this.playerID=1,this.charID=-1,this.testimonyID=0,this.chars=[],this.emotes=[],this.evidences=[],this.resources={holdit:{src:"misc/holdit.gif",duration:720},objection:{src:"misc/objection.gif",duration:720},takethat:{src:"misc/takethat.gif",duration:840},witnesstestimony:{src:"misc/witnesstestimony.gif",duration:1560,sfx:"sounds/general/sfx-testimony.wav"},crossexamination:{src:"misc/crossexamination.gif",duration:1600,sfx:"sounds/general/sfx-testimony2.wav"}},this.selectedEmote=-1,this.selectedEvidence=0,this.checkUpdater=null,this.musicList=Object(),this.handlers={MS:function(e){return n.handleMS(e)},CT:function(e){return n.handleCT(e)},MC:function(e){return n.handleMC(e)},RMC:function(e){return n.handleRMC(e)},CI:function(e){return n.handleCI(e)},SC:function(e){return n.handleSC(e)},EI:function(e){return n.handleEI(e)},LE:function(e){return n.handleLE(e)},EM:function(e){return n.handleEM(e)},SM:function(e){return n.handleSM(e)},BD:function(e){return n.handleBD(e)},music:function(e){return n.handlemusic(e)},DONE:function(e){return n.handleDONE(e)},BN:function(e){return n.handleBN(e)},NBG:function(e){return n.handleNBG(e)},HP:function(e){return n.handleHP(e)},RT:function(e){return n.handleRT(e)},ZZ:function(e){return n.handleZZ(e)},ID:function(e){return n.handleID(e)},PN:function(e){return n.handlePN(e)},SI:function(e){return n.handleSI(e)},CharsCheck:function(e){return n.handleCharsCheck(e)},PV:function(e){return n.handlePV(e)},CHECK:function(e){}},this._lastTimeICReceived=new Date(0)}return l(e,[{key:"me",value:function(){return this.chars[this.charID]}},{key:"myEmote",value:function(){return this.emotes[this.selectedEmote]}},{key:"myEvidence",value:function(){return this.presentable?this.selectedEvidence:0}},{key:"sendOOC",value:function(e){this.serv.send("CT#".concat(he(fe(document.getElementById("OOC_name").value)),"#").concat(he(fe(e)),"#%"))}},{key:"sendIC",value:function(e,t,n,i,o,c,a,s,r,l,d,u,m){this.serv.send("MS#chat#".concat(e,"#").concat(t,"#").concat(n)+"#".concat(he(fe(i)),"#").concat(o,"#").concat(c,"#").concat(a)+"#".concat(this.charID,"#").concat(s,"#").concat(v,"#").concat(l,"#").concat(d,"#").concat(u,"#").concat(m,"#%"))}},{key:"sendPE",value:function(e,t,n){this.serv.send("PE#".concat(he(fe(e)),"#").concat(he(fe(t)),"#").concat(n,"#%"))}},{key:"sendEE",value:function(e,t,n,i){this.serv.send("EE#".concat(e,"#").concat(he(fe(t)),"#").concat(he(fe(n)),"#").concat(i,"#%"))}},{key:"sendDE",value:function(e){this.serv.send("DE#".concat(e,"#%"))}},{key:"sendHP",value:function(e,t){this.serv.send("HP#".concat(e,"#").concat(t,"#%"))}},{key:"sendZZ",value:function(e){this.serv.send("ZZ#".concat(e,"#%"))}},{key:"sendRT",value:function(e){"jud"==this.chars[this.charID].side&&this.serv.send("RT#".concat(e,"#%"))}},{key:"sendMusicChange",value:function(e){this.serv.send("MC#".concat(e,"#").concat(this.charID,"#%"))}},{key:"sendLeaveRoom",value:function(){this.serv.send("FC#%")}},{key:"joinServer",value:function(){var e=this;this.serv.send("HI#".concat(E,"#%")),this.serv.send("ID#webAO#2.3#%"),this.checkUpdater=setInterval(function(){return e.sendCheck()},5e3)}},{key:"loadResources",value:function(){document.getElementById("OOC_name").value="web"+this.playerID;var e=document.getElementById("evi_select");e.add(new Option("Custom",0)),o.forEach(function(t){e.add(new Option(t))});var t=document.getElementById("bg_select");t.add(new Option("Custom",0)),i.forEach(function(e){t.add(new Option(e))});for(var n=["holdit","objection","takethat"],c=0;c<n.length;c++){D(h+this.resources[n[c]].src.toLowerCase(),this.callbackLoadImageResources,n[c])}for(var a=["witnesstestimony","crossexamination"],s=0;s<a.length;s++){D("".concat(h,"themes/default/").concat(a[s],".gif"),this.callbackLoadImageResources,a[s]),D(h+this.resources[a[s]].sfx.toLowerCase(),this.callbackLoadSFXResources,a[s])}}},{key:"callbackLoadImageResources",value:function(e,t,n){e&&(ye.resources[t].src=n,ve.getAnimLength(n,ye.callbackGetResourceLength,t))}},{key:"callbackGetResourceLength",value:function(e,t){ye.resources[t].duration=e}},{key:"callbackLoadSFXResources",value:function(e,t,n){e&&(ye.resources[t].sfx=n)}},{key:"initialObservBBCode",value:function(){var e=document.getElementById("client_inner_chat");new MutationObserver(function(e){e.forEach(function(e){var t=e.addedNodes;null!==t&&t.forEach(function(e){"C"==e.tagName?e.style.color=e.getAttribute("a"):"M"==e.tagName&&(e.hasAttribute("a")?e.style.backgroundColor=e.getAttribute("a"):(e.style.backgroundColor="yellow",e.style.color="black"))})})}).observe(e,{attributes:!0,childList:!0})}},{key:"sendCharacter",value:function(e){this.serv.send("CC#".concat(this.playerID,"#").concat(e,"#web#%"))}},{key:"sendMusic",value:function(e){this.serv.send("MC#".concat(e))}},{key:"sendCheck",value:function(){this.serv.send("CH#".concat(this.charID,"#%"))}},{key:"onOpen",value:function(e){"watch"===m?(document.getElementById("client_loading").style.display="none",document.getElementById("client_charselect").style.display="none"):ye.joinServer()}},{key:"onClose",value:function(e){console.error("The connection was closed: ".concat(e.reason," (").concat(e.code,")")),1001!==e.code&&(document.getElementById("client_error").style.display="block",document.getElementById("error_id").textContent=e.code,this.cleanup())}},{key:"onMessage",value:function(e){var t=e.data;console.debug(t);var n=t.split("%")[0].split("#"),i=n[0],o=this.handlers[i];void 0!==o?o(n):console.warn("Invalid packet header ".concat(i))}},{key:"onError",value:function(e){console.error("A network error occurred: ".concat(e.reason," (").concat(e.code,")")),document.getElementById("client_error").style.display="block",document.getElementById("error_id").textContent=e.code,this.cleanup()}},{key:"cleanup",value:function(){try{this.serv.close(1001)}catch(e){}clearInterval(this.checkUpdater)}},{key:"prepChat",value:function(e){return ge(pe(e)).replace(/\\n/g,"<br>").replace(/\[(\/?)b\]/g,"<$1b>").replace(/\[(\/?)i\]/g,"<$1i>").replace(/\[(\/?)s\]/g,"<$1del>").replace(/\[(\/?)u\]/g,"<$1u>").replace(/\[(\/?)sub\]/g,"<$1sub>").replace(/\[(\/?)sup\]/g,"<$1sup>").replace(/\[m=([#a-zA-Z0-9]+)\]/g,'<m a="$1">').replace(/\[(\/?)m\]/g,"<$1m>").replace(/\[c=?([#a-zA-Z0-9]+)\]/g,'<c a="$1">').replace(/\[\/c\]/g,"</c>")}},{key:"handleMS",value:function(e){if(e[4]!=ve.chatmsg.content){document.getElementById("client_inner_chat").innerHTML="";for(var t={character:-1,preanim:escape(e[2]),nameplate:e[3],name:e[3],speaking:"(b)"+escape(e[4]),silent:"(a)"+escape(e[4]),content:this.prepChat(e[5]),side:e[6],sound:escape(e[7]),type:e[8],snddelay:e[10],objection:e[11],evidence:e[12],flip:e[13],flash:e[14],color:e[15],isnew:!0},n=0;n<this.chars.length;n++)if(this.chars[n].name==e[3]){t.character=n;break}t.character==this.charID&&function(){document.getElementById("client_inputbox").value="",p&&(document.getElementById("button_effect_"+p).className="client_button",p=0);v&&(document.getElementById("button_"+v).className="client_button",v=0)}(),ve.say(t)}}},{key:"handleCT",value:function(e){var t=document.getElementById("client_ooclog");t.innerHTML+="".concat(pe(ge(e[1])),": ").concat(pe(ge(e[2])),"\r\n"),t.scrollTop>t.scrollHeight-600&&(t.scrollTop=t.scrollHeight)}},{key:"handleMC",value:function(e){var t=ve.music;if(t.pause(),t.src=g+e[1].toLowerCase(),t.play(),e[2]>=0){var n=this.chars[e[2]].name;j("".concat(n," changed music to ").concat(e[1]))}else j("The music was changed to ".concat(e[1]))}},{key:"handleRMC",value:function(e){ve.music.pause(),ve.music=new Audio(this.musicList[e[1]]);var t=ve.music;t.totime=e[1],t.offset=(new Date).getTime()/1e3,t.addEventListener("loadedmetadata",function(){t.currentTime+=parseFloat(t.totime+((new Date).getTime()/1e3-t.offset)).toFixed(3),t.play()},!1)}},{key:"handleCI",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Character "+e[1],this.serv.send("AN#"+(e[1]/10+1)+"#%");for(var t=2;t<e.length-1;t++)if(t%2==0){var n=e[t].split("&");this.chars[e[t-1]]={name:n[0],desc:n[1],evidence:n[3],icon:h+"characters/"+escape(n[0].toLowerCase())+"/char_icon.png"}}}},{key:"handleSC",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Characters";for(var t=1;t<e.length-1;t++){var n=e[t].split("&");this.chars[t-1]={name:n[0],desc:n[1],evidence:n[3],icon:h+"characters/"+escape(n[0].toLowerCase())+"/char_icon.png"}}this.serv.send("RM#%")}},{key:"handleEI",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Evidence "+e[1],this.serv.send("RM#%")}},{key:"handleLE",value:function(e){this.evidences=[];for(var t=1;t<e.length-1;t++){var n=e[t].split("&");this.evidences[t-1]={name:pe(ge(n[0])),desc:pe(ge(n[1])),filename:escape(n[2]),icon:h+"evidence/"+escape(n[2].toLowerCase())}}var i=document.getElementById("evidences");i.innerHTML="";for(var o=1;o<=this.evidences.length;o++)i.innerHTML+='<img src="'.concat(this.evidences[o-1].icon,'" \n\t\t\t\tid="evi_').concat(o,'" \n\t\t\t\talt="').concat(this.evidences[o-1].name,'"\n\t\t\t\tclass="client_button"\n\t\t\t\tonclick="pickEvidence(').concat(o,')">')}},{key:"handleEM",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Music "+e[1],this.serv.send("AM#"+(e[1]/10+1)+"#%");for(var t=document.getElementById("client_musiclist"),n=2;n<e.length-1;n++)if(n%2==0){var i=document.createElement("OPTION");i.text=e[n],t.options.add(i)}}},{key:"handleSM",value:function(e){document.getElementById("client_loadingtext").innerHTML="Loading Music ";for(var t=document.getElementById("client_musiclist"),n=!1,i=1;i<e.length-1;i++)if(/\.(?:wav|mp3|mp4|ogg|opus)$/i.test(e[i])&&!n&&(n=!0),n){var o=document.createElement("OPTION");o.text=e[i],t.options.add(o)}else{var c=document.createElement("SPAN");c.className="location-box",c.textContent=e[i],c.onclick=function(){x(this)},document.getElementById("areas").appendChild(c)}var a=document.getElementById("areas");if(a.lastChild.textContent.startsWith("=")){var s=document.createElement("OPTION");s.text=a.lastChild.textContent,t.insertBefore(s,t.firstChild),a.removeChild(a.lastChild)}this.serv.send("RD#%")}},{key:"handleBD",value:function(e){document.getElementById("client_loadingtext").innerHTML="Banned: "+e[1]}},{key:"handlemusic",value:function(e){for(var t=0;t<e.length/2;t++)this.musicList[e[2*t]]=e[2*t+1]}},{key:"handleDONE",value:function(e){document.getElementById("client_loading").style.display="none",document.getElementById("client_charselect").style.display="block"}},{key:"handleBN",value:function(e){ve.bgname=escape(e[1]);var t=W("bg_select",escape(e[1]));document.getElementById("bg_select").selectedIndex=t,se(),0==t&&(document.getElementById("bg_filename").value=e[1]),document.getElementById("bg_preview").src=h+"background/"+escape(e[1].toLowerCase())+"/defenseempty.png",-1==this.charID?N("jud"):N(this.chars[this.charID].side)}},{key:"handleNBG",value:function(e){}},{key:"handleHP",value:function(e){var t=10*e[2];1==e[1]?(this.hp[0]=e[2],$("#client_defense_hp > .health-bar").animate({width:t+"%"},500)):(this.hp[1]=e[2],$("#client_prosecutor_hp > .health-bar").animate({width:t+"%"},500))}},{key:"handleRT",value:function(e){"testimony1"==e[1]?this.testimonyID=1:this.testimonyID=2,ve.initTestimonyUpdater()}},{key:"handleZZ",value:function(e){var t=document.getElementById("client_ooclog");t.innerHTML+="$Alert: ".concat(pe(ge(e[1])),"\r\n"),t.scrollTop>t.scrollHeight-60&&(t.scrollTop=t.scrollHeight)}},{key:"handleID",value:function(e){this.playerID=e[1]}},{key:"handlePN",value:function(e){this.serv.send("askchaa#%")}},{key:"handleSI",value:function(e){f?this.serv.send("askchar2#%"):this.serv.send("RC#%")}},{key:"handleCharsCheck",value:function(e){var t;document.getElementById("client_chartable").innerHTML="";for(var n=0;n<this.chars.length;n++){n%8==0&&(t=document.createElement("TR"));var i=document.createElement("TD"),o="",c=this.chars[n].icon;"-1"==e[n+1]&&(o=" dark"),i.innerHTML="<img class='demothing".concat(o,"' id='demo_").concat(n,"' ")+"src='".concat(c,"' alt='").concat(this.chars[n].name,"' onclick='pickChar(").concat(n,")' ")+"onerror='demoError(this);'>",t.appendChild(i),n%8==0&&document.getElementById("client_chartable").appendChild(t)}}},{key:"handlePV",value:function(e){this.charID=e[3],document.getElementById("client_charselect").style.display="none",document.getElementById("client_inputbox").style.display="";var t=this.me(),n=this.emotes,i=document.getElementById("client_emo");i.innerHTML="",i.style.display="";var o=new XMLHttpRequest;o.withCredentials=!1,o.open("GET",h+"characters/"+escape(this.me().name.toLowerCase())+"/char.ini",!0),o.responseType="text",o.onload=function(e){if(200==this.status){var o=this.responseText,c=b.parse(o);t.side=c.Options.side,K(t.side);for(var a=1;a<=c.Emotions.number;a++){var s=c.Emotions[a].split("#"),r="0",l="0";void 0!==c.SoundN&&(r=c.SoundN[a]),void 0!==c.SoundT&&(l=c.SoundT[a]),n[a]={desc:s[0].toLowerCase(),speaking:s[1].toLowerCase(),silent:s[2].toLowerCase(),zoom:s[3],sfx:r.toLowerCase(),sfxdelay:l,button_off:h+"characters/".concat(escape(t.name).toLowerCase(),"/emotions/button").concat(a,"_off.png"),button_on:h+"characters/".concat(escape(t.name).toLowerCase(),"/emotions/button").concat(a,"_on.png")},i.innerHTML+="<img src=".concat(n[a].button_off,'\n\t\t\t\t\t\t id="emo_').concat(a,'"\n\t\t\t\t\t\t alt="').concat(n[a].desc,'"\n\t\t\t\t\t\t class="client_button"\n\t\t\t\t\t\t onclick="pickEmotion(').concat(a,')">')}U(1)}},o.send()}}]),e}(),I=function(){function e(){s(this,e),this.textnow="",this.chatmsg={isnew:!1,content:"",objection:"0",sound:"",startpreanim:!1,startspeaking:!1,side:null,color:"0",snddelay:0,preanimdelay:0},this.blip=new Audio(h+"sounds/general/sfx-blipmale.wav"),this.blip.volume=.5,this.blipChannels=new Array(6);for(var t=0;t<this.blipChannels.length;t++)this.blipChannels[t]=new Audio(h+"sounds/general/sfx-blipmale.wav"),this.blipChannels[t].volume=.5;this.currentBlipChannel=0,this.sfxaudio=new Audio(h+"sounds/general/sfx-blipmale.wav"),this.sfxplayed=0,this.music=new Audio,this.music.play(),this.updater=null,this.testimonyUpdater=null,this.bgname="gs4",this.testimonyTimer=0,this.shoutTimer=0,this.textTimer=0,this._animating=!1}return l(e,[{key:"isAnimating",value:function(){return this._animating}},{key:"setBlipVolume",value:function(e){for(var t=0;t<this.blipChannels.length;t++)this.blipChannels[t].volume=e}},{key:"bgFolder",value:function(){return"".concat(h,"background/").concat(this.bgname.toLowerCase(),"/")}},{key:"say",value:function(e){this.chatmsg=e,j(e.content,e.nameplate),N(e.side),this.textnow="",this.sfxplayed=0,this.textTimer=0,this._animating=!0,clearTimeout(this.updater),"-"!=e.preanim?e.preanimdelay=this.getAnimLength("".concat(h,"characters/").concat(escape(e.name.toLowerCase()),"/").concat(e.preanim.toLowerCase(),".gif"),this.initUpdater):this.initUpdater(0)}},{key:"initUpdater",value:function(e){ve.chatmsg.preanimdelay=parseInt(e),ve.updater=setTimeout(function(){return ve.updateText()},60)}},{key:"initTestimonyUpdater",value:function(){var e=this;if(ye.testimonyID>0){var t="";1==ye.testimonyID?t="witnesstestimony":2==ye.testimonyID&&(t="crossexamination"),new Audio(ye.resources[t].sfx).play(),this.testimonyTimer=0;var n=document.getElementById("client_testimony");n.src=ye.resources[t].src,n.style.display="",this.testimonyUpdater=setTimeout(function(){return e.updateTestimony()},60)}}},{key:"getAnimLength",value:function(e,t,n){var i=new XMLHttpRequest;i.open("GET",e,!0),i.responseType="arraybuffer",i.addEventListener("load",function(){var e=gify.getInfo(i.response);console.log(e.duration),t(e.duration,n)}),i.send()}},{key:"updateTestimony",value:function(){var e=this;this.testimonyTimer=this.testimonyTimer+60,1==ye.testimonyID?this.testimonyTimer>=ye.resources.witnesstestimony.duration?this.disposeTestimony():this.testimonyUpdater=setTimeout(function(){return e.updateTestimony()},60):2==ye.testimonyID?this.testimonyTimer>=ye.resources.crossexamination.duration?this.disposeTestimony():this.testimonyUpdater=setTimeout(function(){return e.updateTestimony()},60):this.disposeTestimony()}},{key:"disposeTestimony",value:function(){ye.testimonyID=0,this.testimonyTimer=0,document.getElementById("client_testimony").style.display="none",clearTimeout(this.testimonyUpdater)}},{key:"updateText",value:function(){var e=this,t=document.getElementById("client_name"),n=document.getElementById("client_chat"),i=document.getElementById("client_char"),o=document.getElementById("client_evi"),c=document.getElementById("client_background"),a=document.getElementById("client_shout"),s=document.getElementById("client_inner_chat");if(1==this.chatmsg.flip?i.style.transform="scaleX(-1)":i.style.transform="scaleX(1)",this._animating&&(this.updater=setTimeout(function(){return e.updateText()},60)),this.chatmsg.isnew){c.style.backgroundColor="transparent",t.style.display="none",n.style.display="none",o.style.opacity="0",o.style.height="0%";var r={1:"holdit",2:"objection",3:"takethat"}[this.chatmsg.objection];void 0!==r?(a.src=ye.resources[r].src,new Audio("".concat(h,"characters/").concat(this.chatmsg.name.toLowerCase(),"/").concat(r,".wav")).play(),this.shoutTimer=850):this.shoutTimer=0,this.chatmsg.isnew=!1,this.chatmsg.startpreanim=!0}if(this.textTimer>=this.shoutTimer&&this.chatmsg.startpreanim)2==this.chatmsg.flash?(this.sfxaudio.pause(),this.sfxplayed=1,this.sfxaudio.src=h+"sounds/general/sfx-stab.wav",this.sfxaudio.play(),$("#client_gamewindow").effect("shake",{direction:"up"})):1==this.chatmsg.flash&&(c.style.backgroundColor="white",this.sfxaudio.pause(),this.sfxplayed=1,this.sfxaudio.src=h+"sounds/general/sfx-realization.wav",this.sfxaudio.play(),$("#client_gamewindow").effect("pulsate")),this.chatmsg.preanimdelay>0&&(a.src="misc/placeholder.gif",N(this.chatmsg.side),i.src=h+"characters/"+escape(this.chatmsg.name.toLowerCase())+"/"+this.chatmsg.preanim.toLowerCase()+".gif"),this.chatmsg.startpreanim=!1,this.chatmsg.startspeaking=!0;else if(this.textTimer>=this.shoutTimer+this.chatmsg.preanimdelay&&!this.chatmsg.startpreanim)if(this.chatmsg.startspeaking){for(this.chatmsg.evidence>0&&(o.style.backgroundImage="url('"+ye.evidences[this.chatmsg.evidence-1].icon+"')","def"==this.chatmsg.side?(o.style.right="1.5em",o.style.left="initial",$("#client_evi").animate({height:"30%",opacity:1},250)):(o.style.right="initial",o.style.left="1.5em",$("#client_evi").animate({height:"30%",opacity:1},250))),t.style.display="block",t.style.fontSize=.7*t.offsetHeight+"px";t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(this.chatmsg.nameplate)),n.style.display="block",n.style.fontSize=.25*n.offsetHeight+"px";s.style.color={0:"#ffffff",1:"#00ff00",2:"#ff0000",3:"#ffaa00",4:"#0000ff",5:"#ffff00",6:"#aa00aa"}[this.chatmsg.color]||"#ffffff",this.chatmsg.startspeaking=!1,0==this.chatmsg.preanimdelay&&(a.src="misc/placeholder.gif",N(this.chatmsg.side)),i.src=h+"characters/"+escape(this.chatmsg.name.toLowerCase())+"/"+this.chatmsg.speaking.toLowerCase()+".gif",this.textnow==this.chatmsg.content&&(i.src=h+"characters/"+escape(this.chatmsg.name.toLowerCase())+"/"+this.chatmsg.silent.toLowerCase()+".gif",this._animating=!1,clearTimeout(this.updater))}else if(this.textnow!=this.chatmsg.content){for(" "!=this.chatmsg.content.charAt(this.textnow.length)&&(this.blipChannels[this.currentBlipChannel].play(),this.currentBlipChannel++,this.currentBlipChannel%=this.blipChannels.length),this.textnow=this.chatmsg.content.substring(0,this.textnow.length+1);s.hasChildNodes();)s.removeChild(s.firstChild);s.appendChild(document.createTextNode(this.textnow)),this.textnow==this.chatmsg.content&&(this.textTimer=0,this._animating=!1,i.src=h+"characters/"+escape(this.chatmsg.name.toLowerCase())+"/"+this.chatmsg.silent.toLowerCase()+".gif",clearTimeout(this.updater))}!this.sfxplayed&&this.chatmsg.snddelay+this.shoutTimer>=this.textTimer&&(this.sfxaudio.pause(),this.sfxplayed=1,"0"!=this.chatmsg.sound&&"1"!=this.chatmsg.sound&&(this.sfxaudio.src=h+"sounds/general/"+escape(this.chatmsg.sound.toLowerCase())+".wav",this.sfxaudio.play())),this.textTimer=this.textTimer+60}}]),e}(),b=function(){function e(){s(this,e)}return l(e,null,[{key:"parse",value:function(e){var t={section:/^\s*\[\s*([^\]]*)\s*\]\s*$/,param:/^\s*([\w.\-_]+)\s*=\s*(.*?)\s*$/,comment:/^\s*;.*$/},n={},i=e.split(/\r\n|\r|\n/),o=null;return i.forEach(function(e){if(!t.comment.test(e)&&0!=e.length)if(t.param.test(e)){var i=e.match(t.param);o?n[o][i[1]]=i[2]:n[i[1]]=i[2]}else if(t.section.test(e)){var c=e.match(t.section);n[c[1]]={},o=c[1]}}),n}}]),e}();function C(e){13==e.keyCode&&(ye.sendOOC(document.getElementById("client_oocinputbox").value),document.getElementById("client_oocinputbox").value="")}function B(e){if(13==e.keyCode){var t=ye.me(),n=ye.myEmote(),i=ye.myEvidence(),o=ye.flip?1:0,c=document.getElementById("textcolor").value,a="0",s="0";document.getElementById("sendsfx").checked&&(a=n.sfx,s=n.sfxdelay),ye.sendIC(n.speaking,t.name,n.silent,document.getElementById("client_inputbox").value,t.side,a,n.zoom,s,v,i,o,p,c)}}function k(e){var t=document.getElementById("client_musiclist").value;ye.sendMusicChange(t)}function x(e){var t=e.textContent;ye.sendMusicChange(t);var n=document.createElement("div");n.className="hrtext",n.textContent="switched to ".concat(e.textContent),document.getElementById("client_log").appendChild(n)}function T(){ve.music.volume=document.getElementById("client_mvolume").value/100}function S(){ve.sfxaudio.volume=document.getElementById("client_svolume").value/100}function L(){ve.setBlipVolume(document.getElementById("client_bvolume").value/100)}function O(e){ye.sendLeaveRoom(),document.getElementById("client_charselect").style.display="block",document.getElementById("client_emo").innerHTML=""}function P(e){return e.onerror="",e.src="misc/placeholder.gif",!0}function M(e){return e.onerror="",e.src="/misc/placeholder.png",!0}function D(e,t,n){var i=new XMLHttpRequest;i.onreadystatechange=function(){4==this.readyState&&200==this.status?t(!0,n,e):t(!1,n,e)},i.open("GET",e,!0),i.send()}function N(e){var t,n=ve.bgFolder();switch(document.getElementById("client_fg").style.display="none",document.getElementById("client_bench").style.display="none",e){case"def":document.getElementById("client_court").src=n+"defenseempty.png",document.getElementById("client_bench").style.display="block",D(n+"defensedesk.png",A,e),t="defense";break;case"pro":document.getElementById("client_court").src=n+"prosecutorempty.png",document.getElementById("client_bench").style.display="block",D(n+"defensedesk.png",A,e),t="prosecution";break;case"hld":document.getElementById("client_court").src=n+"helperstand.png",t="defense";break;case"hlp":document.getElementById("client_court").src=n+"prohelperstand.png",t="prosecution";break;case"wit":document.getElementById("client_court").src=n+"witnessempty.png",document.getElementById("client_bench").style.display="block",document.getElementById("client_bench").src=n+"estrado.png",t="prosecution";break;case"jud":document.getElementById("client_court").src=n+"judgestand.png",t="prosecution"}5==ve.chatmsg.type&&(document.getElementById("client_bench").style.display="none",document.getElementById("client_court").src=h+"themes/default/"+t+"_speedlines.gif")}function A(e,t){var n=ve.bgFolder();document.getElementById("client_bench").src="def"==t?e?n+"defensedesk.png":n+"bancodefensa.png":e?n+"prosecutiondesk.png":n+"bancoacusacion.png"}function R(){ye.cleanup(),(ye=new w(u))&&(m="join",document.getElementById("client_error").style.display="none")}function H(){ye.joinServer()}function j(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Date,i=document.createElement("p"),o=document.createElement("span");if(o.id="iclog_name",o.appendChild(document.createTextNode(t)),i.appendChild(o),i.appendChild(document.createTextNode(e)),_.getMinutes()!==n.getMinutes()){var c=document.createElement("span");c.id="iclog_time",c.innerText=n.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"}),i.appendChild(c)}var a=document.getElementById("client_log");a.appendChild(i),a.scrollTop>a.scrollHeight-800&&(a.scrollTop=a.scrollHeight),_=new Date}function F(e){e<1e3?ye.sendCharacter(e):(document.getElementById("client_charselect").style.display="none",document.getElementById("client_inputbox").style.display="none",document.getElementById("client_emo").style.display="none")}function U(e){-1!=ye.selectedEmote&&(document.getElementById("emo_"+ye.selectedEmote).src=ye.myEmote().button_off),ye.selectedEmote=e,document.getElementById("emo_"+e).src=ye.myEmote().button_on}function Z(e){if(ye.selectedEvidence!==e){ye.selectedEvidence>0&&(document.getElementById("evi_"+ye.selectedEvidence).className="client_button"),document.getElementById("evi_"+e).className="client_button dark",ye.selectedEvidence=e,document.getElementById("evi_name").value=ye.evidences[e-1].name,document.getElementById("evi_desc").value=ye.evidences[e-1].desc;var t=W("evi_select",ye.evidences[e-1].filename);document.getElementById("evi_select").selectedIndex=t,0==t&&(document.getElementById("evi_filename").value=ye.evidences[e-1].filename),q(),document.getElementById("evi_add").className="client_button hover_button inactive",document.getElementById("evi_edit").className="client_button hover_button",document.getElementById("evi_cancel").className="client_button hover_button",document.getElementById("evi_del").className="client_button hover_button"}else z()}function X(){var e=document.getElementById("evi_select");ye.sendPE(document.getElementById("evi_name").value,document.getElementById("evi_desc").value,0==e.selectedIndex?document.getElementById("evi_filename").value:e.options[e.selectedIndex].text),z()}function G(){var e=document.getElementById("evi_select"),t=parseInt(ye.selectedEvidence)-1;ye.sendEE(t,document.getElementById("evi_name").value,document.getElementById("evi_desc").value,0==e.selectedIndex?document.getElementById("evi_filename").value:e.options[e.selectedIndex].text),z()}function V(){var e=parseInt(ye.selectedEvidence)-1;ye.sendDE(e),z()}function z(){ye.selectedEvidence>0&&(document.getElementById("evi_"+ye.selectedEvidence).className="client_button"),ye.selectedEvidence=0,document.getElementById("evi_select").selectedIndex=0,q(),document.getElementById("evi_filename").value="",document.getElementById("evi_name").value="",document.getElementById("evi_desc").value="",document.getElementById("evi_icon").style.backgroundImage="url('misc/empty.png')",document.getElementById("evi_add").className="client_button hover_button",document.getElementById("evi_edit").className="client_button hover_button inactive",document.getElementById("evi_cancel").className="client_button hover_button inactive",document.getElementById("evi_del").className="client_button hover_button inactive"}function W(e,t){for(var n=document.getElementById(e),i=1;i<n.length;++i)if(n.options[i].value==t)return i;return 0}function q(){var e=document.getElementById("evi_select"),t=document.getElementById("evi_filename"),n=document.getElementById("evi_icon");0===e.selectedIndex?(t.style.display="initial",n.style.backgroundImage="url(".concat(h,"evidence/").concat(t.value.toLowerCase(),")")):(t.style.display="none",n.style.backgroundImage="url(".concat(h,"evidence/").concat(e.value.toLowerCase(),")"))}function K(e){"jud"==e?(document.getElementById("judge_action").style.display="inline-table",document.getElementById("no_action").style.display="none"):(document.getElementById("no_action").style.display="inline-table",document.getElementById("judge_action").style.display="none");for(var t=0,n=document.getElementById("role_select").options;t<n.length;t++)if(e==n[t].value)return void(n.selectedIndex=t)}function Q(){var e="",t=document.getElementById("bg_select"),n=document.getElementById("bg_command").value;e=0==t.selectedIndex?document.getElementById("bg_filename").value:t.value,ye.sendOOC("/"+n.replace("$1",e))}function J(){var e=document.getElementById("role_select"),t=document.getElementById("role_command").value;ye.sendOOC("/"+t.replace("$1",e.value)),K(e.value)}function Y(){ye.sendOOC("/"+document.getElementById("randomchar_command").value)}function ee(){$("#callmod_dialog").dialog("open")}function te(){ye.sendRT("testimony1")}function ne(){ye.sendRT("testimony2")}function ie(){ye.sendHP(1,String(parseInt(ye.hp[0])+1))}function oe(){ye.sendHP(1,String(parseInt(ye.hp[0])-1))}function ce(){ye.sendHP(2,String(parseInt(ye.hp[1])+1))}function ae(){ye.sendHP(2,String(parseInt(ye.hp[1])-1))}function se(){var e=document.getElementById("bg_select"),t=document.getElementById("bg_filename"),n=document.getElementById("bg_preview");0==e.selectedIndex?(t.style.display="initial",n.src=h+"background/"+t.value.toLowerCase()+"/defenseempty.png"):(t.style.display="none",n.src=h+"background/"+e.value.toLowerCase()+"/defenseempty.png")}function re(e){e==p?(document.getElementById("button_effect_"+e).className="client_button",p=0):(document.getElementById("button_effect_"+e).className="client_button dark",p&&(document.getElementById("button_effect_"+p).className="client_button"),p=e)}function le(){ye.flip?document.getElementById("button_flip").className="client_button":document.getElementById("button_flip").className="client_button dark",ye.flip=!ye.flip}function de(){ye.presentable?document.getElementById("button_present").className="client_button":document.getElementById("button_present").className="client_button dark",ye.presentable=!ye.presentable}function ue(e){e!=y&&(document.getElementById("menu_"+e).className="menu_icon active",document.getElementById("content_"+e).className="menu_content active",document.getElementById("menu_"+y).className="menu_icon",document.getElementById("content_"+y).className="menu_content",y=e)}function me(e){e==v?(document.getElementById("button_"+e).className="client_button",v=0):(document.getElementById("button_"+e).className="client_button dark",v&&(document.getElementById("button_"+v).className="client_button"),v=e)}function he(e){return e.replace(/#/g,"<pound>").replace(/&/g,"<and>").replace(/%/g,"<percent>").replace(/\$/g,"<dollar>")}function ge(e){return e.replace(/<pound>/g,"#").replace(/<and>/g,"&").replace(/<percent>/g,"%").replace(/<dollar>/g,"$")}function fe(e){var t=document.getElementById("client_encoding").value;if("unicode"==t)return e.replace(/[^\0-~]/g,function(e){return"\\u"+("000"+e.charCodeAt().toString(16)).slice(-4)});if("utf16"==t){for(var n=new ArrayBuffer(2*e.length),i=new Uint16Array(n),o=0,c=e.length;o<c;o++)i[o]=e.charCodeAt(o);return String(i)}return e}function pe(e){var t=document.getElementById("client_decoding").value;return"unicode"==t?e.replace(/\\u([\d\w]{1,})/gi,function(e,t){return String.fromCharCode(parseInt(t,16))}):"utf16"==t?String.fromCharCode.apply(null,new Uint16Array(e.split(","))):e}window.onOOCEnter=C,window.onEnter=B,window.musiclist_click=k,window.area_click=x,window.changeMusicVolume=T,window.changeSFXVolume=S,window.changeBlipVolume=L,window.changeCharacter=O,window.imgError=P,window.demoError=M,window.ReconnectButton=R,window.RetryButton=H,window.pickChar=F,window.pickEmotion=U,window.pickEvidence=Z,window.addEvidence=X,window.editEvidence=G,window.deleteEvidence=V,window.cancelEvidence=z,window.getIndexFromSelect=W,window.updateEvidenceIcon=q,window.updateActionCommands=K,window.changeBackgroundOOC=Q,window.changeRoleOOC=J,window.randomCharacterOOC=Y,window.callMod=ee,window.initWT=te,window.initCE=ne,window.addHPD=ie,window.redHPD=oe,window.addHPP=ce,window.redHPP=ae,window.updateBackgroundPreview=se,window.toggleEffect=re,window.toggleFlip=le,window.togglePresent=de,window.toggleMenu=ue,window.toggleShout=me,void 0===String.prototype.trim&&(String.prototype.trim=function(){return String(this).replace(/^\s+|\s+$/g,"")});var ye=new w(u),ve=new I;$(document).ready(function(){ye.initialObservBBCode(),ye.loadResources()}),$(function(){$("#callmod_dialog").dialog({autoOpen:!1,resizable:!1,show:{effect:"drop",direction:"down",duration:500},hide:{effect:"drop",direction:"down",duration:500},height:"auto",width:400,modal:!0,buttons:{Sure:function(){var e=prompt("Please enter the reason","");ye.sendZZ(e),$(this).dialog("close")},Cancel:function(){$(this).dialog("close")}}})})}});
//# sourceMappingURL=client.b.js.map \ No newline at end of file
diff --git a/webAO/client.b.js.map b/webAO/client.b.js.map
index a66a13c..5cb4728 100644
--- a/webAO/client.b.js.map
+++ b/webAO/client.b.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./webAO/client.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","queryDict","location","search","substr","split","forEach","item","serverIP","ip","AO_HOST","asset","MUSIC_HOST","oldLoading","test","navigator","userAgent","selectedShout","lastICMessageTime","Date","Client","address","_this","this","_classCallCheck","serv","WebSocket","onopen","evt","onOpen","onclose","onClose","onmessage","onMessage","onerror","onError","playerID","charID","chars","emotes","selectedEmote","checkUpdater","musicList","handlers","MS","args","handleMS","CT","handleCT","MC","handleMC","RMC","handleRMC","CI","handleCI","SC","handleSC","EI","handleEI","EM","handleEM","SM","handleSM","BD","handleBD","music","handlemusic","DONE","handleDONE","BN","handleBN","NBG","handleNBG","HP","handleHP","ID","handleID","PN","handlePN","SI","handleSI","CharsCheck","handleCharsCheck","PV","handlePV","CHECK","_lastTimeICReceived","message","send","concat","escapeChat","speaking","silent","side","ssfxname","zoom","ssfxdelay","objection","track","_this2","hashCode","setInterval","sendCheck","character","song","e","document","getElementById","style","display","client","joinServer","console","error","reason","code","textContent","cleanup","msg","data","debug","header","handler","warn","close","clearInterval","viewport","chatmsg","content","innerHTML","pre","escape","preanim","nameplate","sound","type","snddelay","evidence","flash","color","isnew","length","className","say","oocLog","scrollTop","scrollHeight","pause","src","play","musicname","appendICLog","Audio","totime","offset","getTime","addEventListener","currentTime","parseFloat","toFixed","chargs","desc","icon","hmusiclist","newentry","createElement","text","options","add","bgname","clip","tr","td","icon_chosen","thispick","appendChild","changeBackground","me","xhr","XMLHttpRequest","open","responseType","onload","status","linifile","responseText","pinifile","INI","parse","Options","Emotions","number","emoteinfo","esfx","esfxd","SoundN","SoundT","sfx","sfxdelay","button_off","button_on","pickemotion","Viewport","textnow","startspeaking","blip","volume","blipChannels","Array","currentBlipChannel","sfxaudio","sfxplayed","updater","shoutTimer","textTimer","_animating","_this3","clearTimeout","setTimeout","updateText","_this4","trim","shout","1","2","3","fontSize","offsetHeight","replace","stylecolor","0","4","5","6","charAt","substring","regex","section","param","comment","lines","line","match","onOOCEnter","event","keyCode","sendOOC","onEnter","mychar","myemo","myEmote","checked","sendIC","musiclist_click","playtrack","sendMusicChange","changeMusicVolume","changeSFXVolume","changeBlipVolume","setBlipVolume","changeCharacter","sendLeaveRoom","imgError","image","demoError","position","standname","bgfolder","bgFolder","ReconnectButton","RetryButton","toadd","arguments","undefined","time","entry","nameField","id","createTextNode","getMinutes","timeStamp","innerText","toLocaleTimeString","hour","minute","clientLog","pickchar","ccharacter","sendCharacter","emo","toggleshout","estring","window","String","hash","charCodeAt"],"mappings":"aACA,IAAAA,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAC,QAGA,IAAAC,EAAAJ,EAAAE,GAAA,CACAG,EAAAH,EACAI,GAAA,EACAH,QAAA,IAUA,OANAI,EAAAL,GAAAM,KAAAJ,EAAAD,QAAAC,IAAAD,QAAAF,GAGAG,EAAAE,GAAA,EAGAF,EAAAD,QAKAF,EAAAQ,EAAAF,EAGAN,EAAAS,EAAAV,EAGAC,EAAAU,EAAA,SAAAR,EAAAS,EAAAC,GACAZ,EAAAa,EAAAX,EAAAS,IACAG,OAAAC,eAAAb,EAAAS,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CZ,EAAAkB,EAAA,SAAAhB,GACA,oBAAAiB,eAAAC,aACAN,OAAAC,eAAAb,EAAAiB,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAAb,EAAA,cAAiDmB,OAAA,KAQjDrB,EAAAsB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAArB,EAAAqB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFA1B,EAAAkB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAArB,EAAAU,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAzB,EAAA6B,EAAA,SAAA1B,GACA,IAAAS,EAAAT,KAAAqB,WACA,WAA2B,OAAArB,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAH,EAAAU,EAAAE,EAAA,IAAAA,GACAA,GAIAZ,EAAAa,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD/B,EAAAkC,EAAA,GAIAlC,IAAAmC,EAAA,k8BC5EA,IAAIC,EAAY,GAChBC,SAASC,OAAOC,OAAO,GAAGC,MAAM,KAAKC,QAAQ,SAASC,GACrDN,EAAUM,EAAKF,MAAM,KAAK,IAAME,EAAKF,MAAM,KAAK,KAKjD,IAAMG,EAAWP,EAAUQ,GACvBrB,EAAOa,EAAUb,KAEfsB,EAAUT,EAAUU,OAAS,4CAC7BC,EAAaF,EAAU,gBAMzBG,GAAa,EACb,uGAAuGC,KAAKC,UAAUC,aACzHH,GAAa,GAGd,IAAII,EAAgB,EAChBC,EAAoB,IAAIC,KAAK,GAE3BC,aACL,SAAAA,EAAYC,GAAS,IAAAC,EAAAC,KAAAC,EAAAD,KAAAH,GACpBG,KAAKE,KAAO,IAAIC,UAAU,QAAUL,GAEpCE,KAAKE,KAAKE,OAAY,SAACC,GAAD,OAASN,EAAKO,OAAOD,IAC3CL,KAAKE,KAAKK,QAAY,SAACF,GAAD,OAASN,EAAKS,QAAQH,IAC5CL,KAAKE,KAAKO,UAAY,SAACJ,GAAD,OAASN,EAAKW,UAAUL,IAC9CL,KAAKE,KAAKS,QAAY,SAACN,GAAD,OAASN,EAAKa,QAAQP,IAE5CL,KAAKa,SAAW,EAChBb,KAAKc,QAAU,EAEfd,KAAKe,MAAQ,GACbf,KAAKgB,OAAS,GAEdhB,KAAKiB,eAAiB,EAEtBjB,KAAKkB,aAAe,KAGpBlB,KAAKmB,UAAY/D,SAEjB4C,KAAKoB,SAAW,CACfC,GAAc,SAACC,GAAD,OAAUvB,EAAKwB,SAASD,IACtCE,GAAc,SAACF,GAAD,OAAUvB,EAAK0B,SAASH,IACtCI,GAAc,SAACJ,GAAD,OAAUvB,EAAK4B,SAASL,IACtCM,IAAc,SAACN,GAAD,OAAUvB,EAAK8B,UAAUP,IACvCQ,GAAc,SAACR,GAAD,OAAUvB,EAAKgC,SAAST,IACtCU,GAAc,SAACV,GAAD,OAAUvB,EAAKkC,SAASX,IACtCY,GAAc,SAACZ,GAAD,OAAUvB,EAAKoC,SAASb,IACtCc,GAAc,SAACd,GAAD,OAAUvB,EAAKsC,SAASf,IACtCgB,GAAc,SAAChB,GAAD,OAAUvB,EAAKwC,SAASjB,IACtCkB,GAAc,SAAClB,GAAD,OAAUvB,EAAK0C,SAASnB,IACtCoB,MAAc,SAACpB,GAAD,OAAUvB,EAAK4C,YAAYrB,IACzCsB,KAAc,SAACtB,GAAD,OAAUvB,EAAK8C,WAAWvB,IACxCwB,GAAc,SAACxB,GAAD,OAAUvB,EAAKgD,SAASzB,IACtC0B,IAAc,SAAC1B,GAAD,OAAUvB,EAAKkD,UAAU3B,IACvC4B,GAAc,SAAC5B,GAAD,OAAUvB,EAAKoD,SAAS7B,IACtC8B,GAAc,SAAC9B,GAAD,OAAUvB,EAAKsD,SAAS/B,IACtCgC,GAAc,SAAChC,GAAD,OAAUvB,EAAKwD,SAASjC,IACtCkC,GAAc,SAAClC,GAAD,OAAUvB,EAAK0D,SAASnC,IACtCoC,WAAc,SAACpC,GAAD,OAAUvB,EAAK4D,iBAAiBrC,IAC9CsC,GAAc,SAACtC,GAAD,OAAUvB,EAAK8D,SAASvC,IACtCwC,MAAc,SAACxC,MAGhBtB,KAAK+D,oBAAsB,IAAInE,KAAK,0CAOpC,OAAOI,KAAKe,MAAMf,KAAKc,0CAOvB,OAAOd,KAAKgB,OAAOhB,KAAKiB,+CAOjB+C,GACPhE,KAAKE,KAAK+D,KAAV,SAAAC,OAAwBlE,KAAKa,SAA7B,KAAAqD,OAAyCC,EAAWH,GAApD,sCAeMI,EAAUnH,EAAMoH,EAAQL,EAASM,EAAMC,EAAUC,EAAMC,EAAWC,GACxE1E,KAAKE,KAAK+D,KACT,WAAAC,OAAWE,EAAX,KAAAF,OAAuBjH,EAAvB,KAAAiH,OAA+BG,GAA/B,IAAAH,OACIC,EAAWH,GADf,KAAAE,OAC2BI,EAD3B,KAAAJ,OACmCK,EADnC,KAAAL,OAC+CM,GAD/C,IAAAN,OAEIlE,KAAKc,OAFT,KAAAoD,OAEmBO,EAFnB,KAAAP,OAEgCxE,EAFhC,uDAUciF,GACf3E,KAAKE,KAAK+D,KAAV,MAAAC,OAAqBS,EAArB,KAAAT,OAA8BlE,KAAKc,OAAnC,+CAUAd,KAAKE,KAAK+D,KAAK,6CAOH,IAAAW,EAAA5E,KACZA,KAAKE,KAAK+D,KAAV,MAAAC,OAAqB1E,UAAUC,UAAUoF,WAAzC,OACA7E,KAAKE,KAAK+D,KAAK,oBACfjE,KAAKkB,aAAe4D,YAAY,kBAAMF,EAAKG,aAAa,2CAO3CC,GACbhF,KAAKE,KAAK+D,KAAV,MAAAC,OAAqBlE,KAAKa,SAA1B,KAAAqD,OAAsCc,EAAtC,6CAOSC,GACTjF,KAAKE,KAAK+D,KAAV,MAAAC,OAAqBe,wCAOrBjF,KAAKE,KAAK+D,KAAV,MAAAC,OAAqBlE,KAAKc,OAA1B,sCAMMoE,GAEO,UAATrH,GACHsH,SAASC,eAAe,kBAAkBC,MAAMC,QAAU,OAC1DH,SAASC,eAAe,qBAAqBC,MAAMC,QAAU,QAE7DC,EAAOC,6CAQDN,GACPO,QAAQC,MAAR,8BAAAxB,OAA4CgB,EAAES,OAA9C,MAAAzB,OAAyDgB,EAAEU,KAA3D,MACe,OAAXV,EAAEU,OACLT,SAASC,eAAe,gBAAgBC,MAAMC,QAAU,QACxDH,SAASC,eAAe,YAAYS,YAAcX,EAAEU,KACpD5F,KAAK8F,6CAQGZ,GACT,IAAIa,EAAMb,EAAEc,KACZP,QAAQQ,MAAMF,GACd,IACIzE,EADQyE,EAAIjH,MAAM,KACL,GAAGA,MAAM,KACtBoH,EAAS5E,EAAK,GACd6E,EAAUnG,KAAKoB,SAAS8E,QACL,IAAZC,EACVA,EAAQ7E,GAERmE,QAAQW,KAAR,yBAAAlC,OAAsCgC,oCAQhChB,GACPO,QAAQC,MAAR,6BAAAxB,OAA2CgB,EAAES,OAA7C,MAAAzB,OAAwDgB,EAAEU,KAA1D,MACAT,SAASC,eAAe,gBAAgBC,MAAMC,QAAU,QACxDH,SAASC,eAAe,YAAYS,YAAcX,EAAEU,KACpD5F,KAAK8F,4CAIL,IACC9F,KAAKE,KAAKmG,MAAM,MACf,MAAOnB,IAGToB,cAActG,KAAKkB,+CAOXI,GAER,GAAIA,EAAK,IAAMiF,EAASC,QAAQC,QAAS,CACxCtB,SAASC,eAAe,qBAAqBsB,UAAY,GAwBzD,IAvBA,IAAIF,EAAU,CACbG,IAAKC,OAAOtF,EAAK,IACjB0D,WAAY,EACZ6B,QAASD,OAAOtF,EAAK,IACrBwF,UAAWxF,EAAK,GAChBrE,KAAMqE,EAAK,GACX8C,SAAU,MAAQwC,OAAOtF,EAAK,IAC9B+C,OAAQ,MAAQuC,OAAOtF,EAAK,IAC5BmF,QAASnF,EAAK,GACdgD,KAAMhD,EAAK,GACXyF,MAAOH,OAAOtF,EAAK,IACnB0F,KAAM1F,EAAK,GAEX2F,SAAU3F,EAAK,IACfoD,UAAWpD,EAAK,IAChB4F,SAAU5F,EAAK,IAEf6F,MAAO7F,EAAK,IACZ8F,MAAO9F,EAAK,IACZ+F,OAAO,GAIC3K,EAAI,EAAGA,EAAIsD,KAAKe,MAAMuG,OAAQ5K,IACtC,GAAIsD,KAAKe,MAAMrE,GAAGO,MAAQqE,EAAK,GAAI,CAClCkF,EAAQxB,UAAYtI,EACpB,MAIE8J,EAAQxB,WAAahF,KAAKc,SA+hBhCqE,SAASC,eAAe,mBAAmBzH,MAAQ,GAC/C+B,IACHyF,SAASC,eAAe,UAAY1F,GAAe6H,UAAY,gBAC/D7H,EAAgB,IA9hBf6G,EAASiB,IAAIhB,qCAQNlF,GACR,IAAMmG,EAAStC,SAASC,eAAe,iBACvCqC,EAAOf,WAAP,GAAAxC,OAAuB5C,EAAK,GAA5B,MAAA4C,OAAmC5C,EAAK,GAAxC,QACImG,EAAOC,UAAYD,EAAOE,aAAe,KAC5CF,EAAOC,UAAYD,EAAOE,+CAQnBrG,GACR,IAAMoB,EAAQ6D,EAAS7D,MAIvB,GAHAA,EAAMkF,QACNlF,EAAMmF,IAAMxI,EAAaiC,EAAK,GAC9BoB,EAAMoF,OACFxG,EAAK,IAAM,EAAG,CACjB,IAAIyG,EAAY/H,KAAKe,MAAMO,EAAK,IAAIrE,KACpC+K,EAAW,GAAA9D,OAAI6D,EAAJ,sBAAA7D,OAAkC5C,EAAK,UAElD0G,EAAW,4BAAA9D,OAA6B5C,EAAK,uCAQrCA,GACTiF,EAAS7D,MAAMkF,QACfrB,EAAS7D,MAAQ,IAAIuF,MAAMjI,KAAKmB,UAAUG,EAAK,KAC/C,IAAMoB,EAAQ6D,EAAS7D,MAEvBA,EAAMwF,OAAS5G,EAAK,GACpBoB,EAAMyF,QAAS,IAAIvI,MAAOwI,UAAY,IACtC1F,EAAM2F,iBAAiB,iBAAkB,WACxC3F,EAAM4F,aAAeC,WAAW7F,EAAMwF,SAAU,IAAItI,MAAOwI,UAAY,IAAO1F,EAAMyF,SAASK,QAAQ,GACrG9F,EAAMoF,SACJ,oCAQKxG,GACR6D,SAASC,eAAe,sBAAsBsB,UAAY,qBAAuBpF,EAAK,GACtFtB,KAAKE,KAAK+D,KAAK,OAAU3C,EAAK,GAAK,GAAM,GAAK,MAC9C,IAAK,IAAI5E,EAAI,EAAGA,EAAI4E,EAAKgG,OAAS,EAAG5K,IACpC,GAAIA,EAAI,GAAK,EAAG,CACf,IAAI+L,EAASnH,EAAK5E,GAAGoC,MAAM,KAC3BkB,KAAKe,MAAMO,EAAK5E,EAAI,IAAM,CACzBO,KAAQwL,EAAO,GACfC,KAAQD,EAAO,GACfvB,SAAYuB,EAAO,GACnBE,KAAQxJ,EAAU,cAAgByH,OAAO6B,EAAO,IAAM,oDAWjDnH,GACR6D,SAASC,eAAe,sBAAsBsB,UAAY,qBAC1D,IAAK,IAAIhK,EAAI,EAAGA,EAAI4E,EAAKgG,OAAS,EAAG5K,IAAK,CACzC,IAAI+L,EAASnH,EAAK5E,GAAGoC,MAAM,KAC3BkB,KAAKe,MAAMrE,EAAI,GAAK,CACnBO,KAAQwL,EAAO,GACfC,KAAQD,EAAO,GACfvB,SAAYuB,EAAO,GACnBE,KAAQxJ,EAAU,cAAgByH,OAAO6B,EAAO,IAAM,kBAGxDzI,KAAKE,KAAK+D,KAAK,yCAUP3C,GACR6D,SAASC,eAAe,sBAAsBsB,UAAY,oBAAsBpF,EAAK,GAErFtB,KAAKE,KAAK+D,KAAK,yCAQP3C,GACR6D,SAASC,eAAe,sBAAsBsB,UAAY,iBAAmBpF,EAAK,GAClFtB,KAAKE,KAAK+D,KAAK,OAAU3C,EAAK,GAAK,GAAM,GAAK,MAE9C,IADA,IAAIsH,EAAazD,SAASC,eAAe,oBAChC1I,EAAI,EAAGA,EAAI4E,EAAKgG,OAAS,EAAG5K,IACpC,GAAIA,EAAI,GAAK,EAAG,CACf,IAAImM,EAAW1D,SAAS2D,cAAc,UACtCD,EAASE,KAAOzH,EAAK5E,GACrBkM,EAAWI,QAAQC,IAAIJ,qCAUjBvH,GACR6D,SAASC,eAAe,sBAAsBsB,UAAY,iBAE1D,IADA,IAAIkC,EAAazD,SAASC,eAAe,oBAChC1I,EAAI,EAAGA,EAAI4E,EAAKgG,OAAS,EAAG5K,IAAK,CACzC,IAAImM,EAAW1D,SAAS2D,cAAc,UACtCD,EAASE,KAAOzH,EAAK5E,GACrBkM,EAAWI,QAAQC,IAAIJ,GAExB7I,KAAKE,KAAK+D,KAAK,yCAOP3C,GACR6D,SAASC,eAAe,sBAAsBsB,UAAY,WAAapF,EAAK,uCAQjEA,GACX,IAAK,IAAI5E,EAAI,EAAGA,EAAI4E,EAAKgG,OAAS,EAAG5K,IACpCsD,KAAKmB,UAAUG,EAAK,EAAI5E,IAAM4E,EAAK,EAAI5E,EAAI,sCAUlC4E,GACV6D,SAASC,eAAe,kBAAkBC,MAAMC,QAAU,OAC1DH,SAASC,eAAe,qBAAqBC,MAAMC,QAAU,yCAOrDhE,GACRiF,EAAS2C,OAAStC,OAAOtF,EAAK,sCAGrBA,qCAQDA,GAGO,GAAXA,EAAK,GACR6D,SAASC,eAAe,qBAAqBC,MAAM8D,KAAO,YAhc3C,GAgcqE7H,EAAK,GAAK,GAAK,eAEnG6D,SAASC,eAAe,wBAAwBC,MAAM8D,KAAO,YAlc9C,GAkcwE7H,EAAK,GAAK,GAAK,gDAQ/FA,GACRtB,KAAKa,SAAWS,EAAK,oCAGbA,GACRtB,KAAKE,KAAK+D,KAAK,8CAQP3C,GACJhC,EACHU,KAAKE,KAAK+D,KAAK,cAEfjE,KAAKE,KAAK+D,KAAK,iDAQA3C,GAChB6D,SAASC,eAAe,oBAAoBsB,UAAY,GACxD,IAAK,IAAIhK,EAAI,EAAGA,EAAIsD,KAAKe,MAAMuG,OAAQ5K,IAAK,CAC3C,GAAIA,EApemB,GAoeM,EAC5B,IAAI0M,EAAKjE,SAAS2D,cAAc,MAEjC,IAAIO,EAAKlE,SAAS2D,cAAc,MAC5BQ,OAAW,EACXC,EAAWvJ,KAAKe,MAAMrE,GAAGiM,KAE5BW,EADkB,MAAfhI,EAAK5E,EAAI,GACE,QAEA,GAEf2M,EAAG3C,UAAY,wBAAAxC,OAAwBoF,EAAxB,eAAApF,OAAiDxH,EAAjD,cAAAwH,OACNqF,EADM,WAAArF,OACYlE,KAAKe,MAAMrE,GAAGO,KAD1B,wBAAAiH,OACqDxH,EADrD,qCAGf0M,EAAGI,YAAYH,GACX3M,EAnfmB,GAmfM,GAC5ByI,SAASC,eAAe,oBAAoBoE,YAAYJ,GAG1DK,EAAiB,wCAOTnI,GACRtB,KAAKc,OAASQ,EAAK,GACnB6D,SAASC,eAAe,qBAAqBC,MAAMC,QAAU,OAC7D,IAAIoE,EAAK1J,KAAK0J,KACV1I,EAAShB,KAAKgB,OACd2I,EAAM,IAAIC,eACdD,EAAIE,KAAK,MAAO1K,EAAU,cAAgByH,OAAO5G,KAAK0J,KAAKzM,MAAQ,aAAa,GAChF0M,EAAIG,aAAe,OACnBH,EAAII,OAAS,SAAU7E,GACtB,GAAmB,KAAflF,KAAKgK,OAAe,CACvB,IAAIC,EAAWjK,KAAKkK,aAChBC,EAAWC,EAAIC,MAAMJ,GACzBP,EAAGpF,KAAO6F,EAASG,QAAQhG,KAC3B,IAAK,IAAI5H,EAAI,EAAGA,EAAIyN,EAASI,SAASC,OAAQ9N,IAAK,CAClD,IAAI+N,EAAYN,EAASI,SAAS7N,GAAGoC,MAAM,KACvC4L,EAAO,IACPC,EAAQ,SACmB,IAApBR,EAASS,SACnBF,EAAOP,EAASS,OAAOlO,SAEO,IAApByN,EAASU,SACnBF,EAAQR,EAASU,OAAOnO,IAEzBsE,EAAOtE,GAAK,CACXgM,KAAM+B,EAAU,GAChBrG,SAAUqG,EAAU,GACpBpG,OAAQoG,EAAU,GAClBjG,KAAMiG,EAAU,GAChBK,IAAKJ,EACLK,SAAUJ,EACVK,WAAY7L,EAAU,cAAgByH,OAAO8C,EAAGzM,MAAQ,mBAAqBP,EAAI,WACjFuO,UAAW9L,EAAU,cAAgByH,OAAO8C,EAAGzM,MAAQ,mBAAqBP,EAAI,WAEjFyI,SAASC,eAAe,cAAcsB,WAAa,aAAe1F,EAAOtE,GAAGsO,WAAa,aAAetO,EAAI,UAAYsE,EAAOtE,GAAGgM,KAAO,gDAAkDhM,EAAI,MAEhMwO,EAAY,KAGdvB,EAAI1F,gBAIAkH,aACL,SAAAA,IAAclL,EAAAD,KAAAmL,GACbnL,KAAKoL,QAAU,GACfpL,KAAKwG,QAAU,CACda,OAAS,EACTZ,QAAW,GACX/B,UAAa,IACbqC,MAAS,GACTsE,eAAiB,EACjB/G,KAAQ,KACR8C,MAAS,IACTH,SAAY,GAEbjH,KAAKsL,KAAO,IAAIrD,MAAM9I,EAAU,mCAChCa,KAAKsL,KAAKC,OAAS,GAKnBvL,KAAKwL,aAAe,IAAIC,MAAM,GAC9B,IAAK,IAAI/O,EAAI,EAAGA,EAAIsD,KAAKwL,aAAalE,OAAQ5K,IAC7CsD,KAAKwL,aAAa9O,GAAK,IAAIuL,MAAM9I,EAAU,mCAC3Ca,KAAKwL,aAAa9O,GAAG6O,OAAS,GAE/BvL,KAAK0L,mBAAqB,EAE1B1L,KAAK2L,SAAW,IAAI1D,MAAM9I,EAAU,mCACpCa,KAAK4L,UAAY,EAEjB5L,KAAK0C,MAAQ,IAAIuF,MACjBjI,KAAK0C,MAAMoF,OAEX9H,KAAK6L,QAAU,KAEf7L,KAAKkJ,OAAS,MAEdlJ,KAAK8L,WAAa,EAClB9L,KAAK+L,UAAY,EAEjB/L,KAAKgM,YAAa,kDAQlB,OAAOhM,KAAKgM,iDAOCT,GACb,IAAK,IAAI7O,EAAI,EAAGA,EAAIsD,KAAKwL,aAAalE,OAAQ5K,IAC7CsD,KAAKwL,aAAa9O,GAAG6O,OAASA,qCAQ/B,SAAArH,OAAU/E,EAAV,eAAA+E,OAA+BlE,KAAKkJ,OAApC,iCAOG1C,GAAS,IAAAyF,EAAAjM,KACZA,KAAKwG,QAAUA,EACfwB,EAAYxB,EAAQC,QAASD,EAAQM,WACrC2C,EAAiBjD,EAAQlC,MACzBtE,KAAKoL,QAAU,GACfpL,KAAK4L,UAAY,EACjB5L,KAAK+L,UAAY,EACjB/L,KAAKgM,YAAa,EAClBE,aAAalM,KAAK6L,SAClB7L,KAAK6L,QAAUM,WAAW,kBAAMF,EAAKG,cAvnBf,yCA+nBV,IAAAC,EAAArM,KAaZ,GAZmC,IAA/BA,KAAKwG,QAAQC,QAAQ6F,QACxBnH,SAASC,eAAe,eAAeC,MAAMC,QAAU,OACvDH,SAASC,eAAe,eAAeC,MAAMC,QAAU,SAEvDH,SAASC,eAAe,eAAeC,MAAMC,QAAU,QACvDH,SAASC,eAAe,eAAeC,MAAMC,QAAU,SAGpDtF,KAAKgM,aACRhM,KAAK6L,QAAUM,WAAW,kBAAME,EAAKD,cAzoBhB,KA4oBlBpM,KAAKwG,QAAQa,MAAO,CACvB,IAMIkF,EANW,CACdC,EAAK,SACLC,EAAK,WACLC,EAAK,aAGa1M,KAAKwG,QAAQ9B,gBACX,IAAV6H,GACVpH,SAASC,eAAe,eAAeyC,IAAM1I,EAAU,QAAUoN,EAAQ,OACxE,IAAItE,MAAJ,GAAA/D,OAAa/E,EAAb,gBAAA+E,OAAmClE,KAAKwG,QAAQvJ,KAAhD,KAAAiH,OAAwDqI,EAAxD,SAAsEzE,OACvE9H,KAAK8L,WAAa,KAElB9L,KAAK8L,WAAa,EAGnB9L,KAAKwG,QAAQa,OAAQ,EACrBrH,KAAKwG,QAAQ6E,eAAgB,EAG9B,GAAIrL,KAAK+L,WAAa/L,KAAK8L,WAC1B,GAAI9L,KAAKwG,QAAQ6E,cAAe,CAC/B5B,EAAiBzJ,KAAKwG,QAAQlC,MAC9Ba,SAASC,eAAe,eAAeyC,IAAM1I,EAAU,cAAgByH,OAAO5G,KAAKwG,QAAQvJ,MAAQ,IAAM+C,KAAKwG,QAAQpC,SAAW,OACjIe,SAASC,eAAe,eAAeC,MAAMsH,SAAkE,GAAtDxH,SAASC,eAAe,eAAewH,aAAsB,KACtHzH,SAASC,eAAe,eAAeC,MAAMsH,SAAkE,IAAtDxH,SAASC,eAAe,eAAewH,aAAuB,KACvHzH,SAASC,eAAe,eAAesB,UAAY,MAAmB1G,KAAKwG,QAAQM,UA2WpF+F,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,UA/WmF,OAEhG,IASIC,EAAa,WATF,CACdC,EAAK,UACLP,EAAK,UACLC,EAAK,UACLC,EAAK,UACLM,EAAK,UACLC,EAAK,UACLC,EAAK,WAE+BlN,KAAKwG,QAAQY,QAAU,WAC5DjC,SAASC,eAAe,qBAAqBC,MAAQyH,EACrD9M,KAAKwG,QAAQ6E,eAAgB,EAEzBrL,KAAKoL,SAAWpL,KAAKwG,QAAQC,UAChCtB,SAASC,eAAe,eAAeyC,IAAM1I,EAAU,cAAgByH,OAAO5G,KAAKwG,QAAQvJ,MAAQ,IAAM+C,KAAKwG,QAAQnC,OAAS,OAC/HrE,KAAKgM,YAAa,EAClBE,aAAalM,KAAK6L,eAGf7L,KAAKoL,SAAWpL,KAAKwG,QAAQC,UACwB,KAApDzG,KAAKwG,QAAQC,QAAQ0G,OAAOnN,KAAKoL,QAAQ9D,UAC5CtH,KAAKwL,aAAaxL,KAAK0L,oBAAoB5D,OAC3C9H,KAAK0L,qBACL1L,KAAK0L,oBAAsB1L,KAAKwL,aAAalE,QAE9CtH,KAAKoL,QAAUpL,KAAKwG,QAAQC,QAAQ2G,UAAU,EAAGpN,KAAKoL,QAAQ9D,OAAS,GACvEnC,SAASC,eAAe,qBAAqBsB,UAAY1G,KAAKoL,QAC1DpL,KAAKoL,SAAWpL,KAAKwG,QAAQC,UAChCzG,KAAK+L,UAAY,EACjB/L,KAAKgM,YAAa,EAClB7G,SAASC,eAAe,eAAeyC,IAAM1I,EAAU,cAAgByH,OAAO5G,KAAKwG,QAAQvJ,MAAQ,IAAM+C,KAAKwG,QAAQnC,OAAS,OAC/H6H,aAAalM,KAAK6L,YAKjB7L,KAAK4L,WAAa5L,KAAKwG,QAAQS,SAAWjH,KAAK8L,YAAc9L,KAAK+L,YACtE/L,KAAK2L,SAAS/D,QACd5H,KAAK4L,UAAY,EACS,KAAtB5L,KAAKwG,QAAQO,OAAsC,KAAtB/G,KAAKwG,QAAQO,QAC7C/G,KAAK2L,SAAS9D,IAAM1I,EAAU,kBAAoByH,OAAO5G,KAAKwG,QAAQO,OAAS,OAC/E/G,KAAK2L,SAAS7D,SAGhB9H,KAAK+L,UAAY/L,KAAK+L,UAptBA,YAwtBlB3B,iFACQpE,GACZ,IAAIqH,EAAQ,CACXC,QAAS,6BACTC,MAAO,oCACPC,QAAS,YAEN7P,EAAQ,GACR8P,EAAQzH,EAAKlH,MAAM,cACnBwO,EAAU,KAmBd,OAlBAG,EAAM1O,QAAQ,SAAS2O,GACtB,IAAIL,EAAMG,QAAQjO,KAAKmO,IAEG,GAAfA,EAAKpG,OAET,GAAI+F,EAAME,MAAMhO,KAAKmO,GAAO,CAClC,IAAIC,EAAQD,EAAKC,MAAMN,EAAME,OACzBD,EACH3P,EAAM2P,GAASK,EAAM,IAAMA,EAAM,GAEjChQ,EAAMgQ,EAAM,IAAMA,EAAM,QAEnB,GAAIN,EAAMC,QAAQ/N,KAAKmO,GAAO,CACpC,IAAIC,EAAQD,EAAKC,MAAMN,EAAMC,SAC7B3P,EAAMgQ,EAAM,IAAM,GAClBL,EAAUK,EAAM,MAGXhQ,WAQF,SAASiQ,EAAWC,GACL,IAAjBA,EAAMC,UACTvI,EAAOwI,QAAQ5I,SAASC,eAAe,sBAAsBzH,OAC7DwH,SAASC,eAAe,sBAAsBzH,MAAQ,IASjD,SAASqQ,EAAQH,GACvB,GAAqB,IAAjBA,EAAMC,QAAe,CACxB,IAAIG,EAAS1I,EAAOmE,KAChBwE,EAAQ3I,EAAO4I,UACf5J,EAAW,IACXE,EAAY,IACZU,SAASC,eAAe,WAAWgJ,UACtC7J,EAAW2J,EAAMpD,IACjBrG,EAAYyJ,EAAMnD,UAEnBxF,EAAO8I,OAAOH,EAAM9J,SAAU6J,EAAOhR,KAAMiR,EAAM7J,OAAQc,SAASC,eAAe,mBAAmBzH,MAAOsQ,EAAO3J,KAAMC,EAAU2J,EAAM1J,KAAMC,EAAW/E,IAsBpJ,SAAS4O,EAAgBT,GAC/B,IAAIU,EAAYpJ,SAASC,eAAe,oBAAoBzH,MAC5D4H,EAAOiJ,gBAAgBD,GAOjB,SAASE,IACflI,EAAS7D,MAAM6I,OAASpG,SAASC,eAAe,kBAAkBzH,MAAQ,IAOpE,SAAS+Q,IACfnI,EAASoF,SAASJ,OAASpG,SAASC,eAAe,kBAAkBzH,MAAQ,IAOvE,SAASgR,IACfpI,EAASqI,cAAczJ,SAASC,eAAe,kBAAkBzH,MAAQ,KAQnE,SAASkR,EAAgBhB,GAC/BtI,EAAOuJ,gBACP3J,SAASC,eAAe,qBAAqBC,MAAMC,QAAU,QAC7DH,SAASC,eAAe,cAAcsB,UAAY,GAQ5C,SAASqI,EAASC,GAGxB,OAFAA,EAAMrO,QAAU,GAChBqO,EAAMnH,IAAM,yBACL,EAQD,SAASoH,EAAUD,GAGzB,OAFAA,EAAMrO,QAAU,GAChBqO,EAAMnH,IAAM,yBACL,EAoBR,SAAS4B,EAAiByF,GACzB,IAAIC,EACAC,EAAW7I,EAAS8I,WAGxB,OAFAlK,SAASC,eAAe,aAAaC,MAAMC,QAAU,OACrDH,SAASC,eAAe,gBAAgBC,MAAMC,QAAU,OAChD4J,GACP,IAAK,MACJ/J,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,mBACzDjK,SAASC,eAAe,gBAAgBC,MAAMC,QAAU,QACxDH,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,kBACzDD,EAAY,UACZ,MACD,IAAK,MACJhK,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,sBACzDjK,SAASC,eAAe,gBAAgBC,MAAMC,QAAU,QACxDH,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,sBACzDD,EAAY,cACZ,MACD,IAAK,MACJhK,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,kBACzDD,EAAY,UACZ,MACD,IAAK,MACJhK,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,qBACzDD,EAAY,cACZ,MACD,IAAK,MACJhK,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,mBACzDjK,SAASC,eAAe,gBAAgBC,MAAMC,QAAU,QACxDH,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,cACzDD,EAAY,cACZ,MACD,IAAK,MACJhK,SAASC,eAAe,gBAAgByC,IAAMuH,EAAW,iBACzDD,EAAY,cAGe,GAAzB5I,EAASC,QAAQQ,OACpB7B,SAASC,eAAe,gBAAgBC,MAAMC,QAAU,OACxDH,SAASC,eAAe,gBAAgByC,IAAM1I,EAAU,kBAAoBgQ,EAAY,mBAOnF,SAASG,IACf/J,EAAOO,WACPP,EAAS,IAAI1F,EAAOZ,MAEnBpB,EAAO,OACPsH,SAASC,eAAe,gBAAgBC,MAAMC,QAAU,QAQnD,SAASiK,IACfhK,EAAOC,aASR,SAASwC,EAAYwH,GAAqC,IAA9BvS,EAA8BwS,UAAAnI,OAAA,QAAAoI,IAAAD,UAAA,GAAAA,UAAA,GAAvB,GAAIE,EAAmBF,UAAAnI,OAAA,QAAAoI,IAAAD,UAAA,GAAAA,UAAA,GAAZ,IAAI7P,KAC3CgQ,EAAQzK,SAAS2D,cAAc,KAC/B+G,EAAY1K,SAAS2D,cAAc,QAOzC,GANA+G,EAAUC,GAAK,aACfD,EAAUrG,YAAYrE,SAAS4K,eAAe9S,IAC9C2S,EAAMpG,YAAYqG,GAClBD,EAAMpG,YAAYrE,SAAS4K,eAAeP,IAGtC7P,EAAkBqQ,eAAiBL,EAAKK,aAAc,CACzD,IAAMC,EAAY9K,SAAS2D,cAAc,QACzCmH,EAAUH,GAAK,aACfG,EAAUC,UAAYP,EAAKQ,wBAAmBT,EAAW,CACxDU,KAAM,UACNC,OAAQ,YAETT,EAAMpG,YAAYyG,GAGnB,IAAMK,EAAYnL,SAASC,eAAe,cAC1CkL,EAAU9G,YAAYoG,GAElBU,EAAU5I,UAAY4I,EAAU3I,aAAe,MAClD2I,EAAU5I,UAAY4I,EAAU3I,cAGjChI,EAAoB,IAAIC,KAOlB,SAAS2Q,EAASC,GACpBA,EAAa,IAChBjL,EAAOkL,cAAcD,IAGrBrL,SAASC,eAAe,qBAAqBC,MAAMC,QAAU,OAC7DH,SAASC,eAAe,mBAAmBC,MAAMC,QAAU,OAC3DH,SAASC,eAAe,cAAcC,MAAMC,QAAU,QASjD,SAAS4F,EAAYwF,IACE,GAAzBnL,EAAOtE,gBACVkE,SAASC,eAAe,OAASG,EAAOtE,eAAe4G,IAAMtC,EAAO4I,UAAUnD,YAE/EzF,EAAOtE,cAAgByP,EACvBvL,SAASC,eAAe,OAASsL,GAAK7I,IAAMtC,EAAO4I,UAAUlD,UASvD,SAAS0F,EAAYpE,GACvBA,GAAS7M,GACZyF,SAASC,eAAe,UAAYmH,GAAOhF,UAAY,gBACvD7H,EAAgB,IAEhByF,SAASC,eAAe,UAAYmH,GAAOhF,UAAY,qBACnD7H,IACHyF,SAASC,eAAe,UAAY1F,GAAe6H,UAAY,iBAEhE7H,EAAgB6M,GAwBlB,SAASpI,EAAWyM,GACnB,OAAOA,EACL/D,QAAQ,KAAM,WACdA,QAAQ,KAAM,SACdA,QAAQ,KAAM,aACdA,QAAQ,MAAO,YA/RlBgE,OAAOjD,WAAaA,EAmBpBiD,OAAO7C,QAAUA,EAuBjB6C,OAAOvC,gBAAkBA,EAQzBuC,OAAOpC,kBAAoBA,EAQ3BoC,OAAOnC,gBAAkBA,EAQzBmC,OAAOlC,iBAAmBA,EAW1BkC,OAAOhC,gBAAkBA,EAWzBgC,OAAO9B,SAAWA,EAWlB8B,OAAO5B,UAAYA,EAwEnB4B,OAAOvB,gBAAkBA,EAQzBuB,OAAOtB,YAAcA,EAkDrBsB,OAAON,SAAWA,EAalBM,OAAO3F,YAAcA,EAmBrB2F,OAAOF,YAAcA,OA8BiB,IAA3BG,OAAOxS,UAAUgO,OAExBwE,OAAOxS,UAAUgO,KAAO,WAEpB,OAAOwE,OAAO9Q,MAAM6M,QAAQ,aAAc,MAKlDiE,OAAOxS,UAAUuG,SAAW,WAC3B,IAAcnI,EAAVqU,EAAO,EACX,GAAoB,IAAhB/Q,KAAKsH,OAAc,OAAOyJ,EAC9B,IAAKrU,EAAI,EAAGA,EAAIsD,KAAKsH,OAAQ5K,IAE3BqU,GAAUA,GAAQ,GAAKA,EADf/Q,KAAKgR,WAAWtU,GAExBqU,GAAQ,EAEV,OAAOA,GAQR,IAAIxL,EAAS,IAAI1F,EAAOZ,GACpBsH,EAAW,IAAI4E","file":"client.b.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n","/*\r\n * Glorious webAO\r\n * made by sD, refactored by oldmud0\r\n * credits to aleks for original idea and source\r\n*/\r\n\r\nlet queryDict = {};\r\nlocation.search.substr(1).split(\"&\").forEach(function(item) {\r\n\tqueryDict[item.split(\"=\")[0]] = item.split(\"=\")[1]\r\n});\r\n\r\n/* Server magic */\r\n\r\nconst serverIP = queryDict.ip;\r\nlet mode = queryDict.mode;\r\n\r\nconst AO_HOST = queryDict.asset || \"http://assets.aceattorneyonline.com/base/\";\r\nconst MUSIC_HOST = AO_HOST + \"sounds/music/\";\r\nconst BAR_WIDTH = 90;\r\nconst BAR_HEIGHT = 20;\r\nconst CHAR_SELECT_WIDTH = 8;\r\nconst UPDATE_INTERVAL = 65;\r\n\r\nlet oldLoading = false;\r\nif (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) {\r\n\toldLoading = true;\r\n}\r\n\r\nlet selectedShout = 0;\r\nlet lastICMessageTime = new Date(0);\r\n\r\nclass Client {\r\n\tconstructor(address) {\r\n\t\tthis.serv = new WebSocket(\"ws://\" + address);\r\n\r\n\t\tthis.serv.onopen = (evt) => this.onOpen(evt);\r\n\t\tthis.serv.onclose = (evt) => this.onClose(evt);\r\n\t\tthis.serv.onmessage = (evt) => this.onMessage(evt);\r\n\t\tthis.serv.onerror = (evt) => this.onError(evt);\r\n\r\n\t\tthis.playerID = 1;\r\n\t\tthis.charID = -1;\r\n\r\n\t\tthis.chars = [];\r\n\t\tthis.emotes = [];\r\n\r\n\t\tthis.selectedEmote = -1;\r\n\r\n\t\tthis.checkUpdater = null;\r\n\r\n\t\t// Only used for RMC/`music` packets, not EM/SM/MC packets.\r\n\t\tthis.musicList = Object();\r\n\r\n\t\tthis.handlers = {\r\n\t\t\t\"MS\": (args) => this.handleMS(args),\r\n\t\t\t\"CT\": (args) => this.handleCT(args),\r\n\t\t\t\"MC\": (args) => this.handleMC(args),\r\n\t\t\t\"RMC\": (args) => this.handleRMC(args),\r\n\t\t\t\"CI\": (args) => this.handleCI(args),\r\n\t\t\t\"SC\": (args) => this.handleSC(args),\r\n\t\t\t\"EI\": (args) => this.handleEI(args),\r\n\t\t\t\"EM\": (args) => this.handleEM(args),\r\n\t\t\t\"SM\": (args) => this.handleSM(args),\r\n\t\t\t\"BD\": (args) => this.handleBD(args),\r\n\t\t\t\"music\": (args) => this.handlemusic(args),\r\n\t\t\t\"DONE\": (args) => this.handleDONE(args),\r\n\t\t\t\"BN\": (args) => this.handleBN(args),\r\n\t\t\t\"NBG\": (args) => this.handleNBG(args),\r\n\t\t\t\"HP\": (args) => this.handleHP(args),\r\n\t\t\t\"ID\": (args) => this.handleID(args),\r\n\t\t\t\"PN\": (args) => this.handlePN(args),\r\n\t\t\t\"SI\": (args) => this.handleSI(args),\r\n\t\t\t\"CharsCheck\": (args) => this.handleCharsCheck(args),\r\n\t\t\t\"PV\": (args) => this.handlePV(args),\r\n\t\t\t\"CHECK\": (args) => {}\r\n\t\t}\r\n\r\n\t\tthis._lastTimeICReceived = new Date(0);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the current player's character.\r\n\t */\r\n\tme() {\r\n\t\treturn this.chars[this.charID];\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the player's currently selected emote.\r\n\t */\r\n\tmyEmote() {\r\n\t\treturn this.emotes[this.selectedEmote];\r\n\t}\r\n\r\n\t/**\r\n\t * Sends an out-of-character chat message.\r\n\t * @param {string} message the message to send\r\n\t */\r\n\tsendOOC(message) {\r\n\t\tthis.serv.send(`CT#web${this.playerID}#${escapeChat(message)}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends an in-character chat message.\r\n\t * @param {string} speaking who is speaking\r\n\t * @param {string} name the name of the current character\r\n\t * @param {string} silent whether or not it's silent\r\n\t * @param {string} message the message to be sent\r\n\t * @param {string} side the name of the side in the background\r\n\t * @param {string} ssfxname the name of the sound effect\r\n\t * @param {string} zoom whether or not to zoom\r\n\t * @param {string} ssfxdelay the delay (in milliseconds) to play the sound effect\r\n\t * @param {string} objection the number of the shout to play\r\n\t */\r\n\tsendIC(speaking, name, silent, message, side, ssfxname, zoom, ssfxdelay, objection) {\r\n\t\tthis.serv.send(\r\n\t\t\t`MS#chat#${speaking}#${name}#${silent}` +\r\n\t\t\t`#${escapeChat(message)}#${side}#${ssfxname}#${zoom}` +\r\n\t\t\t`#${this.charID}#${ssfxdelay}#${selectedShout}#0#0#0#0#%`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to change the music to the specified track.\r\n\t * @param {string} track the track ID\r\n\t */\r\n\tsendMusicChange(track) {\r\n\t\tthis.serv.send(`MC#${track}#${this.charID}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to leave the room and free the character slot.\r\n\t * \r\n\t * Note: This packet is undocumented. It is not implemented by\r\n\t * either the AO2 client or tsuserver.\r\n\t */\r\n\tsendLeaveRoom() {\r\n\t\tthis.serv.send(\"FC#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Begins the handshake process by sending an identifier\r\n\t * to the server.\r\n\t */\r\n\tjoinServer() {\r\n\t\tthis.serv.send(`HI#${navigator.userAgent.hashCode()}#%`);\r\n\t\tthis.serv.send(\"ID#webAO#2.4.5#%\");\r\n\t\tthis.checkUpdater = setInterval(() => this.sendCheck(), 5000);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to play as a specified character.\r\n\t * @param {number} character the character ID\r\n\t */\r\n\tsendCharacter(character) {\r\n\t\tthis.serv.send(`CC#${this.playerID}#${character}#web#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to select a music track.\r\n\t * @param {number?} song the song to be played\r\n\t */\r\n\tsendMusic(song) {\r\n\t\tthis.serv.send(`MC#${song}`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a keepalive packet.\r\n\t */\r\n\tsendCheck() {\r\n\t\tthis.serv.send(`CH#${this.charID}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when a connection is established to the server.\r\n\t */\r\n\tonOpen(e) {\r\n\t\t// XXX: Why does watching mean just SITTING there and doing nothing?\r\n\t\tif (mode === \"watch\") {\r\n\t\t\tdocument.getElementById(\"client_loading\").style.display = \"none\";\r\n\t\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\t} else {\r\n\t\t\tclient.joinServer();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when the connection to the server closes.\r\n\t * @param {CloseEvent} e\r\n\t */\r\n\tonClose(e) {\r\n\t\tconsole.error(`The connection was closed: ${e.reason} (${e.code})`);\r\n\t\tif (e.code !== 1001) {\r\n\t\t\tdocument.getElementById(\"client_error\").style.display = \"block\";\r\n\t\t\tdocument.getElementById(\"error_id\").textContent = e.code;\r\n\t\t\tthis.cleanup();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when a packet is received from the server.\r\n\t * @param {MessageEvent} e\r\n\t */\r\n\tonMessage(e) {\r\n\t\tlet msg = e.data;\r\n\t\tconsole.debug(msg);\r\n\t\tlet lines = msg.split('%');\r\n\t\tlet args = lines[0].split('#');\r\n\t\tlet header = args[0];\r\n\t\tlet handler = this.handlers[header];\r\n\t\tif (typeof handler !== \"undefined\") {\r\n\t\t\thandler(args);\r\n\t\t} else {\r\n\t\t\tconsole.warn(`Invalid packet header ${header}`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when an network error occurs.\r\n\t * @param {ErrorEvent} e \r\n\t */\r\n\tonError(e) {\r\n\t\tconsole.error(`A network error occurred: ${e.reason} (${e.code})`);\r\n\t\tdocument.getElementById(\"client_error\").style.display = \"block\";\r\n\t\tdocument.getElementById(\"error_id\").textContent = e.code;\r\n\t\tthis.cleanup();\r\n\t}\r\n\r\n\tcleanup() {\r\n\t\ttry {\r\n\t\t\tthis.serv.close(1001);\r\n\t\t} catch (e) {\r\n\t\t\t// I don't care if this errors\r\n\t\t}\r\n\t\tclearInterval(this.checkUpdater);\r\n\t}\r\n\r\n\t/**\r\n\t * Handles an in-character chat message.\r\n\t * @param {*} args packet arguments\r\n\t */\r\n\thandleMS(args) {\r\n\t\t// TODO: this if-statement might be a bug.\r\n\t\tif (args[4] != viewport.chatmsg.content) {\r\n\t\t\tdocument.getElementById(\"client_inner_chat\").innerHTML = \"\";\r\n\t\t\tlet chatmsg = {\r\n\t\t\t\tpre: escape(args[2]),\r\n\t\t\t\tcharacter: -1, // Will do a linear search\r\n\t\t\t\tpreanim: escape(args[2]), // XXX: why again?\r\n\t\t\t\tnameplate: args[3], // TODO: parse INI to get this info\r\n\t\t\t\tname: args[3],\r\n\t\t\t\tspeaking: \"(b)\" + escape(args[4]),\r\n\t\t\t\tsilent: \"(a)\" + escape(args[4]),\r\n\t\t\t\tcontent: args[5],\r\n\t\t\t\tside: args[6],\r\n\t\t\t\tsound: escape(args[7]),\r\n\t\t\t\ttype: args[8],\r\n\t\t\t\t// charid: args[9],\r\n\t\t\t\tsnddelay: args[10],\r\n\t\t\t\tobjection: args[11],\r\n\t\t\t\tevidence: args[12],\r\n\t\t\t\t// flip: args[13],\r\n\t\t\t\tflash: args[14],\r\n\t\t\t\tcolor: args[15],\r\n\t\t\t\tisnew: true,\r\n\t\t\t};\r\n\r\n\t\t\t// The dreaded linear search...\r\n\t\t\tfor (let i = 0; i < this.chars.length; i++) {\r\n\t\t\t\tif (this.chars[i].name == args[3]) {\r\n\t\t\t\t\tchatmsg.character = i;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (chatmsg.character == this.charID) {\r\n\t\t\t\tresetICParams();\r\n\t\t\t}\r\n\r\n\t\t\tviewport.say(chatmsg);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles an out-of-character chat message.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCT(args) {\r\n\t\tconst oocLog = document.getElementById(\"client_ooclog\");\r\n\t\toocLog.innerHTML += `${args[1]}: ${args[2]}\\r\\n`;\r\n\t\tif (oocLog.scrollTop > oocLog.scrollHeight - 60) {\r\n\t\t\toocLog.scrollTop = oocLog.scrollHeight;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a music change to an arbitrary resource.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleMC(args) {\r\n\t\tconst music = viewport.music;\r\n\t\tmusic.pause();\r\n\t\tmusic.src = MUSIC_HOST + args[1];\r\n\t\tmusic.play();\r\n\t\tif (args[2] >= 0) {\r\n\t\t\tlet musicname = this.chars[args[2]].name;\r\n\t\t\tappendICLog(`${musicname} changed music to ${args[1]}`);\r\n\t\t} else {\r\n\t\t\tappendICLog(`The music was changed to ${args[1]}`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a music change to an arbitrary resource, with an offset in seconds.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleRMC(args) {\r\n\t\tviewport.music.pause();\r\n\t\tviewport.music = new Audio(this.musicList[args[1]]);\r\n\t\tconst music = viewport.music;\r\n\t\t// Music offset + drift from song loading\r\n\t\tmusic.totime = args[1];\r\n\t\tmusic.offset = new Date().getTime() / 1000;\r\n\t\tmusic.addEventListener('loadedmetadata', function() {\r\n\t\t\tmusic.currentTime += parseFloat(music.totime + (new Date().getTime() / 1000 - music.offset)).toFixed(3);\r\n\t\t\tmusic.play();\r\n\t\t}, false);\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming character information, bundling multiple characters\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCI(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Character \" + args[1];\r\n\t\tthis.serv.send(\"AN#\" + ((args[1] / 10) + 1) + \"#%\");\r\n\t\tfor (let i = 2; i < args.length - 1; i++) {\r\n\t\t\tif (i % 2 == 0) {\r\n\t\t\t\tlet chargs = args[i].split(\"&\");\r\n\t\t\t\tthis.chars[args[i - 1]] = {\r\n\t\t\t\t\t\"name\": chargs[0],\r\n\t\t\t\t\t\"desc\": chargs[1],\r\n\t\t\t\t\t\"evidence\": chargs[3],\r\n\t\t\t\t\t\"icon\": AO_HOST + \"characters/\" + escape(chargs[0]) + \"/char_icon.png\"\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming character information, containing only one character\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSC(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Characters\";\r\n\t\tfor (let i = 1; i < args.length - 1; i++) {\r\n\t\t\tlet chargs = args[i].split(\"&\");\r\n\t\t\tthis.chars[i - 1] = {\r\n\t\t\t\t\"name\": chargs[0],\r\n\t\t\t\t\"desc\": chargs[1],\r\n\t\t\t\t\"evidence\": chargs[3],\r\n\t\t\t\t\"icon\": AO_HOST + \"characters/\" + escape(chargs[0]) + \"/char_icon.png\"\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.serv.send(\"RM#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming evidence information, containing only one evidence\r\n\t * item per packet.\r\n\t * \r\n\t * Mostly unimplemented in webAO.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleEI(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Evidence \" + args[1];\r\n\t\t//serv.send(\"AE#\" + (args[1] + 1) + \"#%\");\r\n\t\tthis.serv.send(\"RM#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing multiple entries\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleEM(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Music \" + args[1];\r\n\t\tthis.serv.send(\"AM#\" + ((args[1] / 10) + 1) + \"#%\");\r\n\t\tlet hmusiclist = document.getElementById(\"client_musiclist\");\r\n\t\tfor (let i = 2; i < args.length - 1; i++) {\r\n\t\t\tif (i % 2 == 0) {\r\n\t\t\t\tlet newentry = document.createElement(\"OPTION\");\r\n\t\t\t\tnewentry.text = args[i];\r\n\t\t\t\thmusiclist.options.add(newentry);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing only one entry\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSM(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Music \";\r\n\t\tlet hmusiclist = document.getElementById(\"client_musiclist\");\r\n\t\tfor (let i = 1; i < args.length - 1; i++) {\r\n\t\t\tlet newentry = document.createElement(\"OPTION\");\r\n\t\t\tnewentry.text = args[i];\r\n\t\t\thmusiclist.options.add(newentry);\r\n\t\t}\r\n\t\tthis.serv.send(\"RD#%\");\r\n\t}\r\n\r\n/**\r\n\t * Handles the banned packet\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleBD(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Banned: \" + args[1];\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing all entries\r\n\t * in the same packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandlemusic(args) {\r\n\t\tfor (let i = 0; i < args.length / 2; i++) {\r\n\t\t\tthis.musicList[args[2 * i]] = args[2 * i + 1];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the handshake completion packet, meaning the player\r\n\t * is ready to select a character.\r\n\t * \r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleDONE(args) {\r\n\t\tdocument.getElementById(\"client_loading\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"block\";\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a background change.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleBN(args) {\r\n\t\tviewport.bgname = escape(args[1]);\r\n\t}\r\n\r\n\thandleNBG(args) {\r\n\t\t// TODO (set by sD)\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a change in the health bars' states.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleHP(args) {\r\n\t\t// TODO (set by sD)\r\n\t\t// Also, this is broken.\r\n\t\tif (args[1] == 1) {\r\n\t\t\tdocument.getElementById(\"client_defense_hp\").style.clip = \"rect(0px,\" + BAR_WIDTH * args[2] / 10 + \"px,\" + BAR_HEIGHT + \"px,0px)\";\r\n\t\t} else {\r\n\t\t\tdocument.getElementById(\"client_prosecutor_hp\").style.clip = \"rect(0px,\" + BAR_WIDTH * args[2] / 10 + \"px,\" + BAR_HEIGHT + \"px,0px)\";\r\n\t\t}\r\n\t}\r\n\t\r\n\t/**\r\n\t * Handles the issuance of a player ID by the server.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleID(args) {\r\n\t\tthis.playerID = args[1];\r\n\t}\r\n\r\n\thandlePN(args) {\r\n\t\tthis.serv.send(\"askchaa#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Received when the server announces its server info,\r\n\t * but we use it as a cue to begin retrieving characters.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSI(args) {\r\n\t\tif (oldLoading) {\r\n\t\t\tthis.serv.send(\"askchar2#%\");\r\n\t\t} else {\r\n\t\t\tthis.serv.send(\"RC#%\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the list of all used and vacant characters.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCharsCheck(args) {\r\n\t\tdocument.getElementById(\"client_chartable\").innerHTML = \"\";\r\n\t\tfor (let i = 0; i < this.chars.length; i++) {\r\n\t\t\tif (i % CHAR_SELECT_WIDTH == 0) {\r\n\t\t\t\tvar tr = document.createElement('TR');\r\n\t\t\t}\r\n\t\t\tlet td = document.createElement('TD');\r\n\t\t\tlet icon_chosen;\r\n\t\t\tlet thispick = this.chars[i].icon;\r\n\t\t\tif (args[i + 1] == \"-1\") {\r\n\t\t\t\ticon_chosen = \" dark\";\r\n\t\t\t} else {\r\n\t\t\t\ticon_chosen = \"\";\r\n\t\t\t}\r\n\t\t\ttd.innerHTML = `<img class='demothing${icon_chosen}' id='demo_${i}' ` +\r\n\t\t\t\t`src='${thispick}' alt='${this.chars[i].name}' onclick='pickchar(${i})' ` +\r\n\t\t\t\t`onerror='demoError(this);'>`;\r\n\t\t\ttr.appendChild(td);\r\n\t\t\tif (i % CHAR_SELECT_WIDTH == 0) {\r\n\t\t\t\tdocument.getElementById(\"client_chartable\").appendChild(tr);\r\n\t\t\t}\r\n\t\t}\r\n\t\tchangeBackground(\"def\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the server's assignment of a character for the player to use.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandlePV(args) {\r\n\t\tthis.charID = args[3];\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\tlet me = this.me();\r\n\t\tlet emotes = this.emotes;\r\n\t\tlet xhr = new XMLHttpRequest();\r\n\t\txhr.open('GET', AO_HOST + 'characters/' + escape(this.me().name) + '/char.ini', true);\r\n\t\txhr.responseType = 'text';\r\n\t\txhr.onload = function (e) {\r\n\t\t\tif (this.status == 200) {\r\n\t\t\t\tlet linifile = this.responseText;\r\n\t\t\t\tlet pinifile = INI.parse(linifile);\r\n\t\t\t\tme.side = pinifile.Options.side;\r\n\t\t\t\tfor (let i = 1; i < pinifile.Emotions.number; i++) {\r\n\t\t\t\t\tlet emoteinfo = pinifile.Emotions[i].split('#');\r\n\t\t\t\t\tlet esfx = \"0\";\r\n\t\t\t\t\tlet esfxd = \"0\";\r\n\t\t\t\t\tif (typeof pinifile.SoundN !== 'undefined') {\r\n\t\t\t\t\t\tesfx = pinifile.SoundN[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (typeof pinifile.SoundT !== 'undefined') {\r\n\t\t\t\t\t\tesfxd = pinifile.SoundT[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\temotes[i] = {\r\n\t\t\t\t\t\tdesc: emoteinfo[0],\r\n\t\t\t\t\t\tspeaking: emoteinfo[1],\r\n\t\t\t\t\t\tsilent: emoteinfo[2],\r\n\t\t\t\t\t\tzoom: emoteinfo[3],\r\n\t\t\t\t\t\tsfx: esfx,\r\n\t\t\t\t\t\tsfxdelay: esfxd,\r\n\t\t\t\t\t\tbutton_off: AO_HOST + 'characters/' + escape(me.name) + '/emotions/button' + i + '_off.png',\r\n\t\t\t\t\t\tbutton_on: AO_HOST + 'characters/' + escape(me.name) + '/emotions/button' + i + '_on.png'\r\n\t\t\t\t\t};\r\n\t\t\t\t\tdocument.getElementById(\"client_emo\").innerHTML += \"<img src='\" + emotes[i].button_off + \"' id='emo_\" + i + \"' alt='\" + emotes[i].desc + \"' class='client_button' onclick='pickemotion(\" + i + \")'>\";\r\n\t\t\t\t}\r\n\t\t\t\tpickemotion(1);\r\n\t\t\t}\r\n\t\t};\r\n\t\txhr.send();\r\n\t}\r\n}\r\n\r\nclass Viewport {\r\n\tconstructor() {\r\n\t\tthis.textnow = \"\";\r\n\t\tthis.chatmsg = {\r\n\t\t\t\"isnew\": false,\r\n\t\t\t\"content\": \"\",\r\n\t\t\t\"objection\": \"0\",\r\n\t\t\t\"sound\": \"\",\r\n\t\t\t\"startspeaking\": false,\r\n\t\t\t\"side\": null,\r\n\t\t\t\"color\": \"0\",\r\n\t\t\t\"snddelay\": 0\r\n\t\t};\r\n\t\tthis.blip = new Audio(AO_HOST + 'sounds/general/sfx-blipmale.wav');\r\n\t\tthis.blip.volume = 0.5;\r\n\r\n\t\t// Allocate multiple blip audio channels to make blips less jittery\r\n\r\n\t\t// TODO: read blip type (\"gender\") from ini\r\n\t\tthis.blipChannels = new Array(6);\r\n\t\tfor (let i = 0; i < this.blipChannels.length; i++) {\r\n\t\t\tthis.blipChannels[i] = new Audio(AO_HOST + 'sounds/general/sfx-blipmale.wav');\r\n\t\t\tthis.blipChannels[i].volume = 0.5;\r\n\t\t}\r\n\t\tthis.currentBlipChannel = 0;\r\n\r\n\t\tthis.sfxaudio = new Audio(AO_HOST + 'sounds/general/sfx-blipmale.wav');\r\n\t\tthis.sfxplayed = 0;\r\n\r\n\t\tthis.music = new Audio();\r\n\t\tthis.music.play();\r\n\r\n\t\tthis.updater = null;\r\n\r\n\t\tthis.bgname = \"gs4\";\r\n\r\n\t\tthis.shoutTimer = 0;\r\n\t\tthis.textTimer = 0;\r\n\r\n\t\tthis._animating = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns whether or not the viewport is busy\r\n\t * performing a task (animating).\r\n\t */\r\n\tisAnimating() {\r\n\t\treturn this._animating;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the volume of the blip sound.\r\n\t * @param {number} volume\r\n\t */\r\n\tsetBlipVolume(volume) {\r\n\t\tfor (let i = 0; i < this.blipChannels.length; i++) {\r\n\t\t\tthis.blipChannels[i].volume = volume;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the path which the background is located in.\r\n\t */\r\n\tbgFolder() {\r\n\t\treturn `${AO_HOST}background/${this.bgname}/`;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a new emote.\r\n\t * @param {object} chatmsg the new chat message\r\n\t */\r\n\tsay(chatmsg) {\r\n\t\tthis.chatmsg = chatmsg;\r\n\t\tappendICLog(chatmsg.content, chatmsg.nameplate);\r\n\t\tchangeBackground(chatmsg.side);\r\n\t\tthis.textnow = '';\r\n\t\tthis.sfxplayed = 0;\r\n\t\tthis.textTimer = 0;\r\n\t\tthis._animating = true;\r\n\t\tclearTimeout(this.updater);\r\n\t\tthis.updater = setTimeout(() => this.updateText(), UPDATE_INTERVAL);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the chatbox based on the given text.\r\n\t * \r\n\t * XXX: This relies on a global variable `this.chatmsg`!\r\n\t */\r\n\tupdateText() {\r\n\t\tif (this.chatmsg.content.trim() == \"\") {\r\n\t\t\tdocument.getElementById(\"client_name\").style.display = \"none\";\r\n\t\t\tdocument.getElementById(\"client_chat\").style.display = \"none\";\r\n\t\t} else {\r\n\t\t\tdocument.getElementById(\"client_name\").style.display = \"block\";\r\n\t\t\tdocument.getElementById(\"client_chat\").style.display = \"block\";\r\n\t\t}\r\n\r\n\t\tif (this._animating) {\r\n\t\t\tthis.updater = setTimeout(() => this.updateText(), UPDATE_INTERVAL);\r\n\t\t}\r\n\r\n\t\tif (this.chatmsg.isnew) {\r\n\t\t\tconst shouts = {\r\n\t\t\t\t\"1\": \"holdit\",\r\n\t\t\t\t\"2\": \"takethat\",\r\n\t\t\t\t\"3\": \"objection\"\r\n\t\t\t};\r\n\r\n\t\t\tlet shout = shouts[this.chatmsg.objection];\r\n\t\t\tif (typeof shout !== \"undefined\") {\r\n\t\t\t\tdocument.getElementById(\"client_char\").src = AO_HOST + \"misc/\" + shout + \".gif\";\r\n\t\t\t\t(new Audio(`${AO_HOST}/characters/${this.chatmsg.name}/${shout}.wav`)).play();\r\n\t\t\t\tthis.shoutTimer = 800;\r\n\t\t\t} else {\r\n\t\t\t\tthis.shoutTimer = 0;\r\n\t\t\t}\r\n\r\n\t\t\tthis.chatmsg.isnew = false;\r\n\t\t\tthis.chatmsg.startspeaking = true;\r\n\t\t}\r\n\r\n\t\tif (this.textTimer >= this.shoutTimer) {\r\n\t\t\tif (this.chatmsg.startspeaking) {\r\n\t\t\t\tchangeBackground(this.chatmsg.side);\r\n\t\t\t\tdocument.getElementById(\"client_char\").src = AO_HOST + \"characters/\" + escape(this.chatmsg.name) + \"/\" + this.chatmsg.speaking + \".gif\";\r\n\t\t\t\tdocument.getElementById(\"client_name\").style.fontSize = (document.getElementById(\"client_name\").offsetHeight * 0.7) + \"px\";\r\n\t\t\t\tdocument.getElementById(\"client_chat\").style.fontSize = (document.getElementById(\"client_chat\").offsetHeight * 0.25) + \"px\";\r\n\t\t\t\tdocument.getElementById(\"client_name\").innerHTML = \"<p>\" + escapeHtml(this.chatmsg.nameplate) + \"</p>\";\r\n\r\n\t\t\t\tconst colors = {\r\n\t\t\t\t\t\"0\": \"#ffffff\",\r\n\t\t\t\t\t\"1\": \"#00ff00\",\r\n\t\t\t\t\t\"2\": \"#ff0000\",\r\n\t\t\t\t\t\"3\": \"#ffaa00\",\r\n\t\t\t\t\t\"4\": \"#0000ff\",\r\n\t\t\t\t\t\"5\": \"#ffff00\",\r\n\t\t\t\t\t\"6\": \"#aa00aa\"\r\n\t\t\t\t}\r\n\t\t\t\tlet stylecolor = \"color: \" + (colors[this.chatmsg.color] || \"#ffffff\");\r\n\t\t\t\tdocument.getElementById(\"client_inner_chat\").style = stylecolor;\r\n\t\t\t\tthis.chatmsg.startspeaking = false;\r\n\r\n\t\t\t\tif (this.textnow == this.chatmsg.content) {\r\n\t\t\t\t\tdocument.getElementById(\"client_char\").src = AO_HOST + \"characters/\" + escape(this.chatmsg.name) + \"/\" + this.chatmsg.silent + \".gif\";\r\n\t\t\t\t\tthis._animating = false;\r\n\t\t\t\t\tclearTimeout(this.updater);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (this.textnow != this.chatmsg.content) {\r\n\t\t\t\t\tif (this.chatmsg.content.charAt(this.textnow.length) != \" \") {\r\n\t\t\t\t\t\tthis.blipChannels[this.currentBlipChannel].play();\r\n\t\t\t\t\t\tthis.currentBlipChannel++;\r\n\t\t\t\t\t\tthis.currentBlipChannel %= this.blipChannels.length;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.textnow = this.chatmsg.content.substring(0, this.textnow.length + 1);\r\n\t\t\t\t\tdocument.getElementById(\"client_inner_chat\").innerHTML = this.textnow;\r\n\t\t\t\t\tif (this.textnow == this.chatmsg.content) {\r\n\t\t\t\t\t\tthis.textTimer = 0;\r\n\t\t\t\t\t\tthis._animating = false;\r\n\t\t\t\t\t\tdocument.getElementById(\"client_char\").src = AO_HOST + \"characters/\" + escape(this.chatmsg.name) + \"/\" + this.chatmsg.silent + \".gif\";\r\n\t\t\t\t\t\tclearTimeout(this.updater);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!this.sfxplayed && this.chatmsg.snddelay + this.shoutTimer >= this.textTimer) {\r\n\t\t\tthis.sfxaudio.pause();\r\n\t\t\tthis.sfxplayed = 1;\r\n\t\t\tif (this.chatmsg.sound != \"0\" && this.chatmsg.sound != \"1\") {\r\n\t\t\t\tthis.sfxaudio.src = AO_HOST + \"sounds/general/\" + escape(this.chatmsg.sound) + \".wav\";\r\n\t\t\t\tthis.sfxaudio.play();\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.textTimer = this.textTimer + UPDATE_INTERVAL;\r\n\t}\r\n}\r\n\r\nclass INI {\r\n\tstatic parse(data) {\r\n\t\tlet regex = {\r\n\t\t\tsection: /^\\s*\\[\\s*([^\\]]*)\\s*\\]\\s*$/,\r\n\t\t\tparam: /^\\s*([\\w\\.\\-\\_]+)\\s*=\\s*(.*?)\\s*$/,\r\n\t\t\tcomment: /^\\s*;.*$/\r\n\t\t};\r\n\t\tlet value = {};\r\n\t\tlet lines = data.split(/\\r\\n|\\r|\\n/);\r\n\t\tlet section = null;\r\n\t\tlines.forEach(function(line) {\r\n\t\t\tif (regex.comment.test(line)) {\r\n\t\t\t\treturn;\r\n\t\t\t} else if (line.length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t} else if (regex.param.test(line)) {\r\n\t\t\t\tlet match = line.match(regex.param);\r\n\t\t\t\tif (section) {\r\n\t\t\t\t\tvalue[section][match[1]] = match[2];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvalue[match[1]] = match[2];\r\n\t\t\t\t}\r\n\t\t\t} else if (regex.section.test(line)) {\r\n\t\t\t\tlet match = line.match(regex.section);\r\n\t\t\t\tvalue[match[1]] = {};\r\n\t\t\t\tsection = match[1];\r\n\t\t\t};\r\n\t\t});\r\n\t\treturn value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when the Return key is pressed on the out-of-character chat input box.\r\n * @param {KeyboardEvent} event\r\n */\r\nexport function onOOCEnter(event) {\r\n\tif (event.keyCode == 13) {\r\n\t\tclient.sendOOC(document.getElementById(\"client_oocinputbox\").value);\r\n\t\tdocument.getElementById(\"client_oocinputbox\").value = \"\";\r\n\t}\r\n}\r\nwindow.onOOCEnter = onOOCEnter;\r\n\r\n/**\r\n * Triggered when the Return key is pressed on the in-character chat input box.\r\n * @param {KeyboardEvent} event\r\n */\r\nexport function onEnter(event) {\r\n\tif (event.keyCode == 13) {\r\n\t\tlet mychar = client.me();\r\n\t\tlet myemo = client.myEmote();\r\n\t\tlet ssfxname = \"0\";\r\n\t\tlet ssfxdelay = \"0\";\r\n\t\tif (document.getElementById(\"sendsfx\").checked) {\r\n\t\t\tssfxname = myemo.sfx;\r\n\t\t\tssfxdelay = myemo.sfxdelay;\r\n\t\t}\r\n\t\tclient.sendIC(myemo.speaking, mychar.name, myemo.silent, document.getElementById(\"client_inputbox\").value, mychar.side, ssfxname, myemo.zoom, ssfxdelay, selectedShout);\r\n\t}\r\n}\r\nwindow.onEnter = onEnter;\r\n\r\n/**\r\n * Resets the IC parameters for the player to enter a new chat message.\r\n * This should only be called when the player's previous chat message\r\n * was successfully sent/presented.\r\n */\r\nfunction resetICParams() {\r\n\tdocument.getElementById(\"client_inputbox\").value = \"\";\r\n\tif (selectedShout) {\r\n\t\tdocument.getElementById(\"button_\" + selectedShout).className = \"client_button\";\r\n\t\tselectedShout = 0;\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when an item on the music list is clicked.\r\n * @param {MouseEvent} event\r\n */\r\nexport function musiclist_click(event) {\r\n\tlet playtrack = document.getElementById(\"client_musiclist\").value;\r\n\tclient.sendMusicChange(playtrack);\r\n}\r\nwindow.musiclist_click = musiclist_click;\r\n\r\n/**\r\n * Triggered by the music volume slider.\r\n */\r\nexport function changeMusicVolume() {\r\n\tviewport.music.volume = document.getElementById(\"client_mvolume\").value / 100;\r\n}\r\nwindow.changeMusicVolume = changeMusicVolume;\r\n\r\n/**\r\n * Triggered by the sound effect volume slider.\r\n */\r\nexport function changeSFXVolume() {\r\n\tviewport.sfxaudio.volume = document.getElementById(\"client_svolume\").value / 100;\r\n}\r\nwindow.changeSFXVolume = changeSFXVolume;\r\n\r\n/**\r\n * Triggered by the blip volume slider.\r\n */\r\nexport function changeBlipVolume() {\r\n\tviewport.setBlipVolume(document.getElementById(\"client_bvolume\").value / 100);\r\n}\r\nwindow.changeBlipVolume = changeBlipVolume;\r\n\r\n/**\r\n * Triggered when a character icon is clicked in the character selection menu.\r\n * @param {MouseEvent} event\r\n */\r\nexport function changeCharacter(event) {\r\n\tclient.sendLeaveRoom();\r\n\tdocument.getElementById(\"client_charselect\").style.display = \"block\";\r\n\tdocument.getElementById(\"client_emo\").innerHTML = \"\";\r\n}\r\nwindow.changeCharacter = changeCharacter;\r\n\r\n/**\r\n * Triggered when there was an error loading a character sprite.\r\n * @param {HTMLImageElement} image the element containing the missing image\r\n */\r\nexport function imgError(image) {\r\n\timage.onerror = \"\";\r\n\timage.src = \"/misc/placeholder.gif\";\r\n\treturn true;\r\n}\r\nwindow.imgError = imgError;\r\n\r\n/**\r\n * Triggered when there was an error loading a character icon.\r\n * @param {HTMLImageElement} image the element containing the missing image\r\n */\r\nexport function demoError(image) {\r\n\timage.onerror = \"\";\r\n\timage.src = \"/misc/placeholder.png\";\r\n\treturn true;\r\n}\r\nwindow.demoError = demoError;\r\n\r\n/**\r\n * Checks if an image exists at the specified URI.\r\n * @param {string} url the URI to be checked\r\n */\r\nfunction ImageExist(url) {\r\n\tvar img = new Image();\r\n\timg.src = url;\r\n\treturn img.height != 0;\r\n}\r\n\r\n/**\r\n * Changes the viewport background based on a given position.\r\n * \r\n * Valid positions: `def, pro, hld, hlp, wit, jud`\r\n * @param {string} position the position to change into\r\n */\r\nfunction changeBackground(position) {\r\n\tvar standname;\r\n\tlet bgfolder = viewport.bgFolder();\r\n\tdocument.getElementById(\"client_fg\").style.display = \"none\";\r\n\tdocument.getElementById(\"client_bench\").style.display = \"none\";\r\n\tswitch (position) {\r\n\t\tcase \"def\":\r\n\t\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"defenseempty.png\"\r\n\t\t\tdocument.getElementById(\"client_bench\").style.display = \"block\";\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"defensedesk.png\"\r\n\t\t\tstandname = \"defense\";\r\n\t\t\tbreak;\r\n\t\tcase \"pro\":\r\n\t\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"prosecutorempty.png\"\r\n\t\t\tdocument.getElementById(\"client_bench\").style.display = \"block\"\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"prosecutiondesk.png\"\r\n\t\t\tstandname = \"prosecution\";\r\n\t\t\tbreak;\r\n\t\tcase \"hld\":\r\n\t\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"helperstand.png\"\r\n\t\t\tstandname = \"defense\";\r\n\t\t\tbreak;\r\n\t\tcase \"hlp\":\r\n\t\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"prohelperstand.png\"\r\n\t\t\tstandname = \"prosecution\";\r\n\t\t\tbreak;\r\n\t\tcase \"wit\":\r\n\t\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"witnessempty.png\"\r\n\t\t\tdocument.getElementById(\"client_bench\").style.display = \"block\"\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"estrado.png\"\r\n\t\t\tstandname = \"prosecution\";\r\n\t\t\tbreak;\r\n\t\tcase \"jud\":\r\n\t\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"judgestand.png\"\r\n\t\t\tstandname = \"prosecution\";\r\n\t\t\tbreak;\r\n\t}\r\n\tif (viewport.chatmsg.type == 5) {\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_court\").src = AO_HOST + \"themes/default/\" + standname + \"_speedlines.gif\";\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when the reconnect button is pushed.\r\n */\r\nexport function ReconnectButton() {\r\n\tclient.cleanup();\r\n\tclient = new Client(serverIP);\r\n\tif (client) {\r\n\t\tmode = \"join\"; // HACK: see client.onOpen\r\n\t\tdocument.getElementById(\"client_error\").style.display = \"none\";\r\n\t}\r\n}\r\nwindow.ReconnectButton = ReconnectButton;\r\n\r\n/**\r\n * Triggered when the retry button is pushed (during the loading process).\r\n */\r\nexport function RetryButton() {\r\n\tclient.joinServer();\r\n}\r\nwindow.RetryButton = RetryButton;\r\n\r\n/**\r\n * Appends a message to the in-character chat log.\r\n * @param {string} toadd the string to be added\r\n * @param {string} name the name of the sender\r\n */\r\nfunction appendICLog(toadd, name = \"\", time = new Date()) {\r\n\tconst entry = document.createElement(\"p\");\r\n\tconst nameField = document.createElement(\"span\");\r\n\tnameField.id = \"iclog_name\";\r\n\tnameField.appendChild(document.createTextNode(name));\r\n\tentry.appendChild(nameField);\r\n\tentry.appendChild(document.createTextNode(toadd));\r\n\r\n\t// Only put a timestamp if the minute has changed.\r\n\tif (lastICMessageTime.getMinutes() !== time.getMinutes()) {\r\n\t\tconst timeStamp = document.createElement(\"span\");\r\n\t\ttimeStamp.id = \"iclog_time\";\r\n\t\ttimeStamp.innerText = time.toLocaleTimeString(undefined, {\r\n\t\t\thour: \"numeric\",\r\n\t\t\tminute: \"2-digit\"\r\n\t\t});\r\n\t\tentry.appendChild(timeStamp);\r\n\t}\r\n\r\n\tconst clientLog = document.getElementById(\"client_log\");\r\n\tclientLog.appendChild(entry);\r\n\r\n\tif (clientLog.scrollTop > clientLog.scrollHeight - 600) {\r\n\t\tclientLog.scrollTop = clientLog.scrollHeight;\r\n\t}\r\n\r\n\tlastICMessageTime = new Date();\r\n}\r\n\r\n/**\r\n * Requests to play as a character.\r\n * @param {number} ccharacter the character ID; if this is a large number, then spectator is chosen instead.\r\n */\r\nexport function pickchar(ccharacter) {\r\n\tif (ccharacter < 1000) {\r\n\t\tclient.sendCharacter(ccharacter);\r\n\t} else {\r\n\t\t// Spectator\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_inputbox\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_emo\").style.display = \"none\";\r\n\t}\r\n}\r\nwindow.pickchar = pickchar;\r\n\r\n/**\r\n * Highlights and selects an emotion for in-character chat.\r\n * @param {string} emo the new emotion to be selected\r\n */\r\nexport function pickemotion(emo) {\r\n\tif (client.selectedEmote != -1) {\r\n\t\tdocument.getElementById(\"emo_\" + client.selectedEmote).src = client.myEmote().button_off;\r\n\t}\r\n\tclient.selectedEmote = emo\r\n\tdocument.getElementById(\"emo_\" + emo).src = client.myEmote().button_on;\r\n}\r\nwindow.pickemotion = pickemotion;\r\n\r\n/**\r\n * Highlights and selects a shout for in-character chat.\r\n * If the same shout button is selected, then the shout is canceled.\r\n * @param {string} shout the new shout to be selected\r\n */\r\nexport function toggleshout(shout) {\r\n\tif (shout == selectedShout) {\r\n\t\tdocument.getElementById(\"button_\" + shout).className = \"client_button\";\r\n\t\tselectedShout = 0;\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_\" + shout).className = \"client_button dark\";\r\n\t\tif (selectedShout) {\r\n\t\t\tdocument.getElementById(\"button_\" + selectedShout).className = \"client_button\";\r\n\t\t}\r\n\t\tselectedShout = shout;\r\n\t}\r\n}\r\nwindow.toggleshout = toggleshout;\r\n\r\n/**\r\n * Escapes a string to be HTML-safe.\r\n * \r\n * XXX: This is unnecessary if we use `createTextNode` instead!\r\n * @param {string} unsafe an unsanitized string\r\n */\r\nfunction escapeHtml(unsafe) {\r\n\treturn unsafe\r\n\t\t.replace(/&/g, \"&amp;\")\r\n\t\t.replace(/</g, \"&lt;\")\r\n\t\t.replace(/>/g, \"&gt;\")\r\n\t\t.replace(/\"/g, \"&quot;\")\r\n\t\t.replace(/'/g, \"&#039;\");\r\n}\r\n\r\n/**\r\n * Escapes a string to AO1 escape codes.\r\n * @param {string} estring the string to be escaped\r\n */\r\nfunction escapeChat(estring) {\r\n\treturn estring\r\n\t\t.replace(/#/g, \"<pound>\")\r\n\t\t.replace(/&/g, \"<and>\")\r\n\t\t.replace(/%/g, \"<percent>\")\r\n\t\t.replace(/\\$/g, \"<dollar>\");\r\n}\r\n\r\n// TODO: Possibly safe to remove, since we are using a transpiler.\r\nif (typeof(String.prototype.trim) === \"undefined\")\r\n{\r\n String.prototype.trim = function() \r\n {\r\n return String(this).replace(/^\\s+|\\s+$/g, '');\r\n };\r\n}\r\n\r\n// Used for HDID calculation.\r\nString.prototype.hashCode = function() {\r\n\tvar hash = 0, i, chr;\r\n\tif (this.length === 0) return hash;\r\n\tfor (i = 0; i < this.length; i++) {\r\n\t chr = this.charCodeAt(i);\r\n\t hash = ((hash << 5) - hash) + chr;\r\n\t hash |= 0; // Convert to 32bit integer\r\n\t}\r\n\treturn hash;\r\n};\r\n\r\n\r\n//\r\n// Client code\r\n//\r\n\r\nlet client = new Client(serverIP);\r\nlet viewport = new Viewport();\r\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./webAO/backgrounds.js","webpack:///./webAO/evidence.js","webpack:///./webAO/fingerprint.js","webpack:///./webAO/client.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","backgrounds","evidence","Fingerprint","options","nativeForEach","nativeMap","_classCallCheck","this","Array","forEach","map","each","obj","iterator","context","length","results","index","list","_typeof","hasher","screen_resolution","screen_orientation","canvas","ie_activex","keys","push","navigator","userAgent","language","screen","colorDepth","getScreenResolution","join","Date","getTimezoneOffset","hasSessionStorage","hasLocalStorage","window","indexedDB","document","body","addBehavior","openDatabase","cpuClass","platform","doNotTrack","getPluginsString","isCanvasSupported","getCanvasFingerprint","murmurhash3_32_gc","seed","remainder","bytes","h1","h1b","c1","c2","k1","charCodeAt","localStorage","e","sessionStorage","elem","createElement","getContext","isIE","appName","test","getIEPluginsString","getRegularPluginsString","plugins","mimeTypes","mt","type","suffixes","description","ActiveXObject","height","width","ctx","txt","textBaseline","font","fillStyle","fillRect","fillText","toDataURL","queryDict","location","search","substr","split","item","serverIP","ip","AO_HOST","asset","MUSIC_HOST","oldLoading","selectedEffect","selectedMenu","selectedShout","uid","console","log","lastICMessageTime","Client","address","_this","client_classCallCheck","serv","WebSocket","onopen","evt","onOpen","onclose","onClose","onmessage","onMessage","onerror","onError","flip","presentable","hp","playerID","charID","testimonyID","chars","emotes","evidences","resources","holdit","src","duration","objection","takethat","witnesstestimony","sfx","crossexamination","selectedEmote","selectedEvidence","checkUpdater","musicList","handlers","MS","args","handleMS","CT","handleCT","MC","handleMC","RMC","handleRMC","CI","handleCI","SC","handleSC","EI","handleEI","LE","handleLE","EM","handleEM","SM","handleSM","BD","handleBD","music","handlemusic","DONE","handleDONE","BN","handleBN","NBG","handleNBG","HP","handleHP","RT","handleRT","ZZ","handleZZ","ID","handleID","PN","handlePN","SI","handleSI","CharsCheck","handleCharsCheck","PV","handlePV","CHECK","_lastTimeICReceived","message","send","concat","escapeChat","encodeChat","getElementById","speaking","silent","side","ssfxname","zoom","ssfxdelay","flash","color","desc","img","id","msg","testimony","track","_this2","setInterval","sendCheck","evidence_select","add","Option","evidence_arr","background_select","background_arr","background","shouts","fileExists","toLowerCase","callbackLoadImageResources","callbackLoadSFXResources","result","resource","client","viewport","getAnimLength","callbackGetResourceLength","target","MutationObserver","mutations","mutation","children","addedNodes","node","tagName","style","getAttribute","hasAttribute","backgroundColor","observe","attributes","childList","character","song","display","joinServer","error","reason","code","textContent","cleanup","data","debug","header","handler","warn","close","clearInterval","unescapeChat","decodeChat","replace","chatmsg","content","innerHTML","preanim","escape","nameplate","prepChat","sound","snddelay","isnew","className","resetICParams","say","oocLog","scrollTop","scrollHeight","pause","play","musicname","appendICLog","Audio","totime","offset","getTime","addEventListener","currentTime","parseFloat","toFixed","chargs","icon","arg","filename","evidence_box","hmusiclist","newentry","text","flagAudio","newarea","onclick","area_click","appendChild","area_box","lastChild","startsWith","audio_title","insertBefore","firstChild","removeChild","bgname","bg_index","getIndexFromSelect","selectedIndex","updateBackgroundPreview","changeBackground","percent_hp","$","animate","initTestimonyUpdater","tr","td","icon_chosen","thispick","me","emotesList","xhr","XMLHttpRequest","withCredentials","open","responseType","onload","status","linifile","responseText","pinifile","INI","parse","Options","updateActionCommands","Emotions","number","emoteinfo","esfx","esfxd","SoundN","SoundT","sfxdelay","button_off","button_on","pickEmotion","Viewport","textnow","startpreanim","startspeaking","preanimdelay","blip","volume","blipChannels","currentBlipChannel","sfxaudio","sfxplayed","updater","testimonyUpdater","testimonyTimer","shoutTimer","textTimer","_animating","clearTimeout","initUpdater","animdelay","parseInt","setTimeout","updateText","_this3","testimonyOverlay","updateTestimony","callback","param","request","gifInfo","gify","getInfo","response","_this4","disposeTestimony","_this5","nameBox","chatBox","charSprite","eviBox","shoutSprite","chatBoxInner","transform","opacity","shout","1","2","3","effect","direction","backgroundImage","right","left","fontSize","offsetHeight","hasChildNodes","createTextNode","0","4","5","6","charAt","substring","regex","section","comment","lines","line","match","onOOCEnter","event","keyCode","sendOOC","onEnter","mychar","myemo","myEmote","myevi","myEvidence","myflip","mycolor","checked","sendIC","musiclist_click","playtrack","sendMusicChange","el","area","areaHr","changeMusicVolume","changeSFXVolume","changeBlipVolume","setBlipVolume","changeCharacter","sendLeaveRoom","imgError","image","demoError","url","xhttp","onreadystatechange","readyState","position","standname","bgfolder","bgFolder","callbackChangeBackground","ReconnectButton","RetryButton","toadd","arguments","undefined","time","entry","nameField","getMinutes","timeStamp","innerText","toLocaleTimeString","hour","minute","clientLog","pickChar","ccharacter","sendCharacter","emo","pickEvidence","icon_id","updateEvidenceIcon","cancelEvidence","addEvidence","sendPE","editEvidence","sendEE","deleteEvidence","sendDE","select_box","select_element","evidence_filename","evidence_iconbox","role_select","changeBackgroundOOC","bg_command","changeRoleOOC","role_command","randomCharacterOOC","callMod","dialog","initWT","sendRT","initCE","addHPD","sendHP","String","redHPD","addHPP","redHPP","background_filename","background_preview","toggleEffect","toggleFlip","togglePresent","toggleMenu","menu","toggleShout","estring","selectedEncoding","ch","toString","slice","buffer","ArrayBuffer","Uint16Array","strLen","selectedDecoding","group","fromCharCode","apply","trim","ready","initialObservBBCode","loadResources","autoOpen","resizable","show","hide","modal","buttons","Sure","prompt","sendZZ","Cancel"],"mappings":"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","file":"client.b.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n","export default [\r\n\t\"Anime\",\r\n\t\"birthday\",\r\n\t\"Christmas\",\r\n\t\"CountyCourt\",\r\n\t\"CruiseCourt\",\r\n\t\"default\",\r\n\t\"DGDEnglishCourt\",\r\n\t\"DGSJapanCourt\",\r\n\t\"DualDestinies\",\r\n\t\"EnglishCourt\",\r\n\t\"gs4\",\r\n\t\"GS4Night\",\r\n\t\"HD\",\r\n\t\"Khura'in\",\r\n\t\"mlp\",\r\n\t\"NewCourt\",\r\n\t\"RuinedCourt\",\r\n\t\"Sky\",\r\n\t\"SpaceCourt\",\r\n\t\"Themis\",\r\n\t\"TouhouCourt\",\r\n\t\"WitchTrialCourt\",\r\n\t\"Zetta\"\r\n];","export default [\r\n\t\"1.png\",\r\n\t\"2.png\",\r\n\t\"3.png\",\r\n\t\"4.png\",\r\n\t\"5.png\",\r\n\t\"6.png\",\r\n\t\"empty.png\",\r\n\t\"lawyerbadge.png\"\r\n];","/*\r\n***************************************************\r\n** http://davealger.info\r\n***************************************************\r\n\r\nThis is a javascript only way to fingerprint a user with better than 90% accuracy in as few bytes as possible and no cookie storage!\r\n\r\nSpecial thanks to Valentin Vasilyev for the original fingerprintjs slightly modified and to Open Source Device Fingerprinting by Dark Wave Tech for the various identity functions\r\n\r\n***************************************************\r\n*/\r\nexport default class Fingerprint {\r\n\tconstructor(options) {\r\n\t\tvar nativeForEach, nativeMap;\r\n\t\tnativeForEach = Array.prototype.forEach;\r\n\t\tnativeMap = Array.prototype.map;\r\n\t\tthis.each = function(obj, iterator, context) {\r\n\t\t\tif (obj === null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (nativeForEach && obj.forEach === nativeForEach) {\r\n\t\t\t\tobj.forEach(iterator, context);\r\n\t\t\t} else if (obj.length === +obj.length) {\r\n\t\t\t\tfor (var i = 0, l = obj.length; i < l; i++) {\r\n\t\t\t\t\tif (iterator.call(context, obj[i], i, obj) === {})\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (var key in obj) {\r\n\t\t\t\t\tif (obj.hasOwnProperty(key)) {\r\n\t\t\t\t\t\tif (iterator.call(context, obj[key], key, obj) === {})\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.map = function(obj, iterator, context) {\r\n\t\t\tvar results = [];\r\n\t\t\tif (obj == null)\r\n\t\t\t\treturn results;\r\n\t\t\tif (nativeMap && obj.map === nativeMap)\r\n\t\t\t\treturn obj.map(iterator, context);\r\n\t\t\tthis.each(obj, function(value, index, list) {\r\n\t\t\t\tresults[results.length] = iterator.call(context, value, index, list);\r\n\t\t\t});\r\n\t\t\treturn results;\r\n\t\t};\r\n\t\tif (typeof options == \"object\") {\r\n\t\t\tthis.hasher = options.hasher;\r\n\t\t\tthis.screen_resolution = options.screen_resolution;\r\n\t\t\tthis.screen_orientation = options.screen_orientation;\r\n\t\t\tthis.canvas = options.canvas;\r\n\t\t\tthis.ie_activex = options.ie_activex;\r\n\t\t} else if (typeof options == \"function\") {\r\n\t\t\tthis.hasher = options;\r\n\t\t}\r\n\t}\r\n}\r\nFingerprint.prototype = {\r\n\tget: function() {\r\n\t\tvar keys = [];\r\n\t\tkeys.push(navigator.userAgent);\r\n\t\tkeys.push(navigator.language);\r\n\t\tkeys.push(screen.colorDepth);\r\n\t\tif (this.screen_resolution) {\r\n\t\t\tvar resolution = this.getScreenResolution();\r\n\t\t\tif (typeof resolution !== \"undefined\") {\r\n\t\t\t\tkeys.push(this.getScreenResolution().join(\"x\"));\r\n\t\t\t}\r\n\t\t}\r\n\t\tkeys.push(new Date().getTimezoneOffset());\r\n\t\tkeys.push(this.hasSessionStorage());\r\n\t\tkeys.push(this.hasLocalStorage());\r\n\t\tkeys.push(!!window.indexedDB);\r\n\t\tif (document.body) {\r\n\t\t\tkeys.push(typeof(document.body.addBehavior));\r\n\t\t} else {\r\n\t\t\tkeys.push(typeof undefined);\r\n\t\t}\r\n\t\tkeys.push(typeof(window.openDatabase));\r\n\t\tkeys.push(navigator.cpuClass);\r\n\t\tkeys.push(navigator.platform);\r\n\t\tkeys.push(navigator.doNotTrack);\r\n\t\tkeys.push(this.getPluginsString());\r\n\t\tif (this.canvas && this.isCanvasSupported()) {\r\n\t\t\tkeys.push(this.getCanvasFingerprint());\r\n\t\t}\r\n\t\tif (this.hasher) {\r\n\t\t\treturn this.hasher(keys.join(\"###\"), 31);\r\n\t\t} else {\r\n\t\t\treturn this.murmurhash3_32_gc(keys.join(\"###\"), 31);\r\n\t\t}\r\n\t},\r\n\tmurmurhash3_32_gc: function(key, seed) {\r\n\t\tvar remainder, bytes, h1, h1b, c1, c2, k1, i;\r\n\t\tremainder = key.length & 3;\r\n\t\tbytes = key.length - remainder;\r\n\t\th1 = seed;\r\n\t\tc1 = 0xcc9e2d51;\r\n\t\tc2 = 0x1b873593;\r\n\t\ti = 0;\r\n\t\twhile (i < bytes) {\r\n\t\t\tk1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24);\r\n\t\t\t++i;\r\n\t\t\tk1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\tk1 = (k1 << 15) | (k1 >>> 17);\r\n\t\t\tk1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\th1 ^= k1;\r\n\t\t\th1 = (h1 << 13) | (h1 >>> 19);\r\n\t\t\th1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\th1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\r\n\t\t}\r\n\t\tk1 = 0;\r\n\t\tswitch (remainder) {\r\n\t\t\tcase 3:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\r\n\t\t\tcase 2:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\r\n\t\t\tcase 1:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i) & 0xff);\r\n\t\t\t\tk1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\r\n\t\t\t\tk1 = (k1 << 15) | (k1 >>> 17);\r\n\t\t\t\tk1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\r\n\t\t\t\th1 ^= k1;\r\n\t\t}\r\n\t\th1 ^= key.length;\r\n\t\th1 ^= h1 >>> 16;\r\n\t\th1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\r\n\t\th1 ^= h1 >>> 13;\r\n\t\th1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\r\n\t\th1 ^= h1 >>> 16;\r\n\t\treturn h1 >>> 0;\r\n\t},\r\n\thasLocalStorage: function() {\r\n\t\ttry {\r\n\t\t\treturn !!window.localStorage;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n\thasSessionStorage: function() {\r\n\t\ttry {\r\n\t\t\treturn !!window.sessionStorage;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n\tisCanvasSupported: function() {\r\n\t\tvar elem = document.createElement(\"canvas\");\r\n\t\treturn !!(elem.getContext && elem.getContext(\"2d\"));\r\n\t},\r\n\tisIE: function() {\r\n\t\tif (navigator.appName === \"Microsoft Internet Explorer\") {\r\n\t\t\treturn true;\r\n\t\t} else if (navigator.appName === \"Netscape\" && /Trident/.test(navigator.userAgent)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\tgetPluginsString: function() {\r\n\t\tif (this.isIE() && this.ie_activex) {\r\n\t\t\treturn this.getIEPluginsString();\r\n\t\t} else {\r\n\t\t\treturn this.getRegularPluginsString();\r\n\t\t}\r\n\t},\r\n\tgetRegularPluginsString: function() {\r\n\t\treturn this.map(navigator.plugins, function(p) {\r\n\t\t\tvar mimeTypes = this.map(p, function(mt) {\r\n\t\t\t\treturn [mt.type, mt.suffixes].join(\"~\");\r\n\t\t\t}).join(\",\");\r\n\t\t\treturn [p.name, p.description, mimeTypes].join(\"::\");\r\n\t\t}, this).join(\";\");\r\n\t},\r\n\tgetIEPluginsString: function() {\r\n\t\tif (window.ActiveXObject) {\r\n\t\t\tvar names = [\"ShockwaveFlash.ShockwaveFlash\", \"AcroPDF.PDF\", \"PDF.PdfCtrl\", \"QuickTime.QuickTime\", \"rmocx.RealPlayer G2 Control\", \"rmocx.RealPlayer G2 Control.1\", \"RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)\", \"RealVideo.RealVideo(tm) ActiveX Control (32-bit)\", \"RealPlayer\", \"SWCtl.SWCtl\", \"WMPlayer.OCX\", \"AgControl.AgControl\", \"Skype.Detection\"];\r\n\t\t\treturn this.map(names, function(name) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tnew ActiveXObject(name);\r\n\t\t\t\t\treturn name;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}).join(\";\");\r\n\t\t} else {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t},\r\n\tgetScreenResolution: function() {\r\n\t\tvar resolution;\r\n\t\tif (this.screen_orientation) {\r\n\t\t\tresolution = (screen.height > screen.width) ? [screen.height, screen.width] : [screen.width, screen.height];\r\n\t\t} else {\r\n\t\t\tresolution = [screen.height, screen.width];\r\n\t\t}\r\n\t\treturn resolution;\r\n\t},\r\n\tgetCanvasFingerprint: function() {\r\n\t\tvar canvas = document.createElement(\"canvas\");\r\n\t\tvar ctx = canvas.getContext(\"2d\");\r\n\t\tvar txt = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}|[]\\:\\\"<>?;,.\";\r\n\t\tctx.textBaseline = \"top\";\r\n\t\tctx.font = \"14px 'Arial'\";\r\n\t\tctx.textBaseline = \"alphabetic\";\r\n\t\tctx.fillStyle = \"#f60\";\r\n\t\tctx.fillRect(125, 1, 62, 20);\r\n\t\tctx.fillStyle = \"#069\";\r\n\t\tctx.fillText(txt, 2, 15);\r\n\t\tctx.fillStyle = \"rgba(102, 204, 0, 0.7)\";\r\n\t\tctx.fillText(txt, 4, 17);\r\n\t\treturn canvas.toDataURL();\r\n\t}\r\n};\r\n\r\n/**************************************************/\r\n\r\n/**\r\nhttp://www.darkwavetech.com/fingerprint/fingerprint_code.html\r\n**/\r\nfunction fingerprint_flash() {\r\n\t\"use strict\";\r\n\tvar strOnError, objPlayerVersion, strVersion, strOut;\r\n\r\n\tstrOnError = \"N/A\";\r\n\tobjPlayerVersion = null;\r\n\tstrVersion = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tobjPlayerVersion = swfobject.getFlashPlayerVersion();\r\n\t\tstrVersion = objPlayerVersion.major + \".\" + objPlayerVersion.minor + \".\" + objPlayerVersion.release;\r\n\t\tif (strVersion === \"0.0.0\") {\r\n\t\t\tstrVersion = \"N/A\";\r\n\t\t}\r\n\t\tstrOut = strVersion;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_browser() {\r\n\t\"use strict\";\r\n\tvar strOnError, strUserAgent, numVersion, strBrowser, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstrUserAgent = null;\r\n\tnumVersion = null;\r\n\tstrBrowser = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t\tif (/msie (\\d+\\.\\d+);/.test(strUserAgent)) { //test for MSIE x.x;\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tif (strUserAgent.indexOf(\"trident/6\") > -1) {\r\n\t\t\t\tnumVersion = 10;\r\n\t\t\t}\r\n\t\t\tif (strUserAgent.indexOf(\"trident/5\") > -1) {\r\n\t\t\t\tnumVersion = 9;\r\n\t\t\t}\r\n\t\t\tif (strUserAgent.indexOf(\"trident/4\") > -1) {\r\n\t\t\t\tnumVersion = 8;\r\n\t\t\t}\r\n\t\t\tstrBrowser = \"Internet Explorer \" + numVersion;\r\n\t\t} else if (strUserAgent.indexOf(\"trident/7\") > -1) { //IE 11+ gets rid of the legacy 'MSIE' in the user-agent string;\r\n\t\t\tnumVersion = 11;\r\n\t\t\tstrBrowser = \"Internet Explorer \" + numVersion;\r\n\t\t} else if (/firefox[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Firefox \" + numVersion;\r\n\t\t} else if (/opera[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Opera/x.x or Opera x.x (ignoring remaining decimal places);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Opera \" + numVersion;\r\n\t\t} else if (/chrome[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Chrome/x.x or Chrome x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Chrome \" + numVersion;\r\n\t\t} else if (/version[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Version/x.x or Version x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Safari \" + numVersion;\r\n\t\t} else if (/rv[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for rv/x.x or rv x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Mozilla \" + numVersion;\r\n\t\t} else if (/mozilla[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Mozilla/x.x or Mozilla x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Mozilla \" + numVersion;\r\n\t\t} else if (/binget[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for BinGet/x.x or BinGet x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (BinGet) \" + numVersion;\r\n\t\t} else if (/curl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Curl/x.x or Curl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (cURL) \" + numVersion;\r\n\t\t} else if (/java[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Java/x.x or Java x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Java) \" + numVersion;\r\n\t\t} else if (/libwww-perl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for libwww-perl/x.x or libwww-perl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (libwww-perl) \" + numVersion;\r\n\t\t} else if (/microsoft url control -[\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Microsoft URL Control - x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Microsoft URL Control) \" + numVersion;\r\n\t\t} else if (/peach[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Peach/x.x or Peach x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Peach) \" + numVersion;\r\n\t\t} else if (/php[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for PHP/x.x or PHP x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (PHP) \" + numVersion;\r\n\t\t} else if (/pxyscand[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for pxyscand/x.x or pxyscand x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (pxyscand) \" + numVersion;\r\n\t\t} else if (/pycurl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for pycurl/x.x or pycurl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (PycURL) \" + numVersion;\r\n\t\t} else if (/python-urllib[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for python-urllib/x.x or python-urllib x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Python URLlib) \" + numVersion;\r\n\t\t} else if (/appengine-google/.test(strUserAgent)) { //test for AppEngine-Google;\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Cloud (Google AppEngine) \" + numVersion;\r\n\t\t} else {\r\n\t\t\tstrBrowser = \"Unknown\";\r\n\t\t}\r\n\t\tstrOut = strBrowser;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_canvas() {\r\n\t\"use strict\";\r\n\tvar strOnError, canvas, strCText, strText, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tcanvas = null;\r\n\tstrCText = null;\r\n\tstrText = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}|;:',<.>/?\";\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tcanvas = document.createElement(\"canvas\");\r\n\t\tstrCText = canvas.getContext(\"2d\");\r\n\t\tstrCText.textBaseline = \"top\";\r\n\t\tstrCText.font = \"14px 'Arial'\";\r\n\t\tstrCText.textBaseline = \"alphabetic\";\r\n\t\tstrCText.fillStyle = \"#f60\";\r\n\t\tstrCText.fillRect(125, 1, 62, 20);\r\n\t\tstrCText.fillStyle = \"#069\";\r\n\t\tstrCText.fillText(strText, 2, 15);\r\n\t\tstrCText.fillStyle = \"rgba(102, 204, 0, 0.7)\";\r\n\t\tstrCText.fillText(strText, 4, 17);\r\n\t\tstrOut = canvas.toDataURL();\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_connection() {\r\n\t\"use strict\";\r\n\tvar strOnError, strConnection, strOut;\r\n\r\n\tstrOnError = \"N/A\";\r\n\tstrConnection = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\t// only on android\r\n\t\tstrConnection = navigator.connection.type;\r\n\t\tstrOut = strConnection;\r\n\t} catch (err) {\r\n\t\t// return N/A if navigator.connection object does not apply to this device\r\n\t\treturn strOnError;\r\n\t}\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_cookie() {\r\n\t\"use strict\";\r\n\tvar strOnError, bolCookieEnabled, bolOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tbolCookieEnabled = null;\r\n\tbolOut = null;\r\n\r\n\ttry {\r\n\t\tbolCookieEnabled = (navigator.cookieEnabled) ? true : false;\r\n\r\n\t\t//if not IE4+ nor NS6+\r\n\t\tif (typeof navigator.cookieEnabled === \"undefined\" && !bolCookieEnabled) {\r\n\t\t\tdocument.cookie = \"testcookie\";\r\n\t\t\tbolCookieEnabled = (document.cookie.indexOf(\"testcookie\") !== -1) ? true : false;\r\n\t\t}\r\n\t\tbolOut = bolCookieEnabled;\r\n\t\treturn bolOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_display() {\r\n\t\"use strict\";\r\n\tvar strSep, strPair, strOnError, strScreen, strDisplay, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrPair = \"=\";\r\n\tstrOnError = \"Error\";\r\n\tstrScreen = null;\r\n\tstrDisplay = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrScreen = window.screen;\r\n\t\tif (strScreen) {\r\n\t\t\tstrDisplay = strScreen.colorDepth + strSep + strScreen.width + strSep + strScreen.height + strSep + strScreen.availWidth + strSep + strScreen.availHeight;\r\n\t\t}\r\n\t\tstrOut = strDisplay;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_fontsmoothing() {\r\n\t\"use strict\";\r\n\tvar strOnError, strFontSmoothing, canvasNode, ctx, i, j, imageData, alpha, strOut;\r\n\r\n\tstrOnError = \"Unknown\";\r\n\tstrFontSmoothing = null;\r\n\tcanvasNode = null;\r\n\tctx = null;\r\n\timageData = null;\r\n\talpha = null;\r\n\tstrOut = null;\r\n\r\n\tif (typeof(screen.fontSmoothingEnabled) !== \"undefined\") {\r\n\t\tstrFontSmoothing = screen.fontSmoothingEnabled;\r\n\t} else {\r\n\t\ttry {\r\n\t\t\tfontsmoothing = \"false\";\r\n\t\t\tcanvasNode = document.createElement(\"canvas\");\r\n\t\t\tcanvasNode.width = \"35\";\r\n\t\t\tcanvasNode.height = \"35\";\r\n\t\t\tcanvasNode.style.display = \"none\";\r\n\t\t\tdocument.body.appendChild(canvasNode);\r\n\t\t\tctx = canvasNode.getContext(\"2d\");\r\n\t\t\tctx.textBaseline = \"top\";\r\n\t\t\tctx.font = \"32px Arial\";\r\n\t\t\tctx.fillStyle = \"black\";\r\n\t\t\tctx.strokeStyle = \"black\";\r\n\t\t\tctx.fillText(\"O\", 0, 0);\r\n\t\t\tfor (j = 8; j <= 32; j = j + 1) {\r\n\t\t\t\tfor (i = 1; i <= 32; i = i + 1) {\r\n\t\t\t\t\timageData = ctx.getImageData(i, j, 1, 1).data;\r\n\t\t\t\t\talpha = imageData[3];\r\n\t\t\t\t\tif (alpha !== 255 && alpha !== 0) {\r\n\t\t\t\t\t\tstrFontSmoothing = \"true\"; // font-smoothing must be on.\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tstrOut = strFontSmoothing;\r\n\t\t} catch (err) {\r\n\t\t\treturn strOnError;\r\n\t\t}\r\n\t}\r\n\tstrOut = strFontSmoothing;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_fonts() {\r\n\t\"use strict\";\r\n\tvar strOnError, style, fonts, count, template, fragment, divs, i, font, div, body, result, e;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstyle = null;\r\n\tfonts = null;\r\n\tfont = null;\r\n\tcount = 0;\r\n\ttemplate = null;\r\n\tdivs = null;\r\n\te = null;\r\n\tdiv = null;\r\n\tbody = null;\r\n\ti = 0;\r\n\r\n\ttry {\r\n\t\tstyle = \"position: absolute; visibility: hidden; display: block !important\";\r\n\t\tfonts = [\"8bitoperator\", \"Abadi MT Condensed Light\",\"Ace Attorney\", \"Adobe Fangsong Std\", \"Adobe Hebrew\", \"Adobe Ming Std\", \"Agency FB\", \"Aharoni\", \"Andalus\", \"Angsana New\", \"AngsanaUPC\", \"Aparajita\", \"Arab\", \"Arabic Transparent\", \"Arabic Typesetting\", \"Arial Baltic\", \"Arial Black\", \"Arial CE\", \"Arial CYR\", \"Arial Greek\", \"Arial TUR\", \"Arial\", \"Arimo\", \"Batang\", \"BatangChe\", \"Bauhaus 93\", \"Bell MT\", \"Berlin Sans FB\", \"Bitstream Vera Serif\", \"Bodoni MT\", \"Bookman Old Style\", \"Braggadocio\", \"Broadway\", \"Browallia New\", \"BrowalliaUPC\", \"Calibri Light\", \"Calibri\", \"Californian FB\", \"Cambria Math\", \"Cambria\", \"Candara\", \"Castellar\", \"Casual\", \"Centaur\", \"Century\", \"Century Gothic\", \"Chalkduster\", \"Colonna MT\", \"Comic Sans MS\", \"Consolas\", \"Constantia\", \"Copperplate Gothic Light\", \"Corbel\", \"Cordia New\", \"CordiaUPC\", \"Courier New Baltic\", \"Courier New CE\", \"Courier New CYR\", \"Courier New Greek\", \"Courier New TUR\", \"Courier New\", \"DejaVu Sans\", \"DFKai-SB\",\"DINEngschrift\", \"DaunPenh\", \"David\", \"DejaVu LGC Sans Mono\", \"Desdemona\", \"DilleniaUPC\", \"DokChampa\", \"Dotum\", \"DotumChe\", \"Dubai\", \"Ebrima\", \"Engravers MT\", \"Eras Bold ITC\", \"Estrangelo Edessa\", \"EucrosiaUPC\", \"Euphemia\", \"Eurostile\", \"FangSong\", \"Forte\", \"FrankRuehl\", \"Franklin Gothic Heavy\", \"Franklin Gothic Medium\", \"FreesiaUPC\", \"French Script MT\", \"Gabriola\", \"Gautami\", \"Georgia\", \"Gigi\", \"Gisha\", \"Goudy Old Style\", \"Gulim\", \"GulimChe\", \"GungSeo\", \"Gungsuh\", \"GungsuhChe\", \"Haettenschweiler\", \"Harrington\", \"Hei S\", \"HeiT\", \"Heisei Kaku Gothic\", \"Hiragino Sans GB\", \"Impact\", \"Informal Roman\", \"IrisUPC\", \"Iskoola Pota\", \"JasmineUPC\", \"KacstOne\", \"KaiTi\", \"Kalinga\", \"Kartika\", \"Khmer UI\", \"Kino MT\", \"KodchiangUPC\", \"Kokila\", \"Kozuka Gothic Pr6N\", \"Lao UI\", \"Latha\", \"Leelawadee\", \"Levenim MT\", \"LilyUPC\", \"Lohit Gujarati\", \"Loma\", \"Lucida Bright\", \"Lucida Console\", \"Lucida Fax\", \"Lucida Sans Unicode\", \"MS Gothic\", \"MS Mincho\", \"MS PGothic\", \"MS PMincho\", \"MS Reference Sans Serif\", \"MS UI Gothic\", \"MV Boli\", \"Magneto\", \"Malgun Gothic\", \"Mangal\", \"Marlett\", \"Matura MT Script Capitals\", \"Meiryo UI\", \"Meiryo\", \"Menlo\", \"Microsoft Himalaya\", \"Microsoft JhengHei\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Sans Serif\", \"Microsoft Tai Le\", \"Microsoft Uighur\", \"Microsoft YaHei\", \"Microsoft Yi Baiti\", \"MingLiU\", \"MingLiU-ExtB\", \"MingLiU_HKSCS\", \"MingLiU_HKSCS-ExtB\", \"Miriam Fixed\", \"Miriam\", \"Mongolian Baiti\", \"MoolBoran\", \"More Perfect DOS VGA\", \"MS Outlook\", \"NSimSun\", \"Narkisim\", \"News Gothic MT\", \"Niagara Solid\", \"Nyala\", \"OCR A\",\"Ocean Sans Std\", \"OpenSymbol\", \"PMingLiU\", \"PMingLiU-ExtB\", \"Palace Script MT\", \"Palatino Linotype\", \"Papyrus\", \"Perpetua\", \"Plantagenet Cherokee\", \"Playbill\", \"Prelude Bold\", \"Prelude Condensed Bold\", \"Prelude Condensed Medium\", \"Prelude Medium\", \"PreludeCompressedWGL Black\", \"PreludeCompressedWGL Bold\", \"PreludeCompressedWGL Light\", \"PreludeCompressedWGL Medium\", \"PreludeCondensedWGL Black\", \"PreludeCondensedWGL Bold\", \"PreludeCondensedWGL Light\", \"PreludeCondensedWGL Medium\", \"PreludeWGL Black\", \"PreludeWGL Bold\", \"PreludeWGL Light\", \"PreludeWGL Medium\", \"Raavi\", \"Rachana\", \"Rockwell\", \"Rod\", \"Sakkal Majalla\", \"Sawasdee\", \"Script MT Bold\", \"Segoe Print\", \"Segoe Script\", \"Segoe UI Emoji\", \"Segoe UI Historic\", \"Segoe UI Light\", \"Segoe UI Semibold\", \"Segoe UI Symbol\", \"Segoe UI\", \"Shonar Bangla\", \"Showcard Gothic\", \"Shruti\", \"SimHei\", \"SimSun\", \"SimSun-ExtB\", \"Simplified Arabic Fixed\", \"Simplified Arabic\", \"Snap ITC\", \"Sylfaen\", \"Symbol\", \"Tahoma\", \"TeamViewer13\", \"Times New Roman Baltic\", \"Times New Roman CE\", \"Times New Roman CYR\", \"Times New Roman Greek\", \"Times New Roman TUR\", \"Times New Roman\", \"TlwgMono\", \"Traditional Arabic\", \"Trebuchet MS\", \"Tunga\", \"Tw Cen MT Condensed Extra Bold\", \"Ubuntu\", \"Umpush\", \"Univers\", \"Utopia\", \"Utsaah\", \"Vani\", \"Verdana\", \"Vijaya\", \"Vladimir Script\", \"Vrinda\", \"Webdings\", \"Wide Latin\", \"Wingdings\", \"Yu Gothic\", \"Zrnic Rg\"];\r\n\t\tcount = fonts.length;\r\n\t\ttemplate = \"<b style=\\\"display:inline !important; width:auto !important; font:normal 10px/1 'X',sans-serif !important\\\">ww</b>\" + \"<b style=\\\"display:inline !important; width:auto !important; font:normal 10px/1 'X',monospace !important\\\">ww</b>\";\r\n\t\tfragment = document.createDocumentFragment();\r\n\t\tdivs = [];\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\tfont = fonts[i];\r\n\t\t\tdiv = document.createElement(\"div\");\r\n\t\t\tfont = font.replace(/['\"<>]/g, \"\");\r\n\t\t\tdiv.innerHTML = template.replace(/X/g, font);\r\n\t\t\tdiv.style.cssText = style;\r\n\t\t\tfragment.appendChild(div);\r\n\t\t\tdivs.push(div);\r\n\t\t}\r\n\t\tbody = document.body;\r\n\t\tbody.insertBefore(fragment, body.firstChild);\r\n\t\tresult = [];\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\te = divs[i].getElementsByTagName(\"b\");\r\n\t\t\tif (e[0].offsetWidth === e[1].offsetWidth) {\r\n\t\t\t\tresult.push(fonts[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// do not combine these two loops, remove child will cause reflow\r\n\t\t// and induce severe performance hit\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\tbody.removeChild(divs[i]);\r\n\t\t}\r\n\t\treturn result.join(\"|\");\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_formfields() {\r\n\t\"use strict\";\r\n\tvar i, j, numOfForms, numOfInputs, strFormsInPage, strFormsInputsData, strInputsInForm, strTmp, strOut;\r\n\r\n\ti = 0;\r\n\tj = 0;\r\n\tnumOfForms = 0;\r\n\tnumOfInputs = 0;\r\n\tstrFormsInPage = \"\";\r\n\tstrFormsInputsData = [];\r\n\tstrInputsInForm = \"\";\r\n\tstrTmp = \"\";\r\n\tstrOut = \"\";\r\n\r\n\tstrFormsInPage = document.getElementsByTagName(\"form\");\r\n\tnumOfForms = strFormsInPage.length;\r\n\tstrFormsInputsData.push(\"url=\" + window.location.href);\r\n\tfor (i = 0; i < numOfForms; i = i + 1) {\r\n\t\tstrFormsInputsData.push(\"FORM=\" + strFormsInPage[i].name);\r\n\t\tstrInputsInForm = strFormsInPage[i].getElementsByTagName(\"input\");\r\n\t\tnumOfInputs = strInputsInForm.length;\r\n\t\tfor (j = 0; j < numOfInputs; j = j + 1) {\r\n\t\t\tif (strInputsInForm[j].type !== \"hidden\") {\r\n\t\t\t\tstrFormsInputsData.push(\"Input=\" + strInputsInForm[j].name);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tstrTmp = strFormsInputsData.join(\"|\");\r\n\tstrOut = strTmp;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_java() {\r\n\t\"use strict\";\r\n\tvar strOnError, strJavaEnabled, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstrJavaEnabled = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tif (navigator.javaEnabled()) {\r\n\t\t\tstrJavaEnabled = \"true\";\r\n\t\t} else {\r\n\t\t\tstrJavaEnabled = \"false\";\r\n\t\t}\r\n\t\tstrOut = strJavaEnabled;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_language() {\r\n\t\"use strict\";\r\n\tvar strSep, strPair, strOnError, strLang, strTypeLng, strTypeBrLng, strTypeSysLng, strTypeUsrLng, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrPair = \"=\";\r\n\tstrOnError = \"Error\";\r\n\tstrLang = null;\r\n\tstrTypeLng = null;\r\n\tstrTypeBrLng = null;\r\n\tstrTypeSysLng = null;\r\n\tstrTypeUsrLng = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrTypeLng = typeof(navigator.language);\r\n\t\tstrTypeBrLng = typeof(navigator.browserLanguage);\r\n\t\tstrTypeSysLng = typeof(navigator.systemLanguage);\r\n\t\tstrTypeUsrLng = typeof(navigator.userLanguage);\r\n\r\n\t\tif (strTypeLng !== \"undefined\") {\r\n\t\t\tstrLang = \"lang\" + strPair + navigator.language + strSep;\r\n\t\t} else if (strTypeBrLng !== \"undefined\") {\r\n\t\t\tstrLang = \"lang\" + strPair + navigator.browserLanguage + strSep;\r\n\t\t} else {\r\n\t\t\tstrLang = \"lang\" + strPair + strSep;\r\n\t\t}\r\n\t\tif (strTypeSysLng !== \"undefined\") {\r\n\t\t\tstrLang += \"syslang\" + strPair + navigator.systemLanguage + strSep;\r\n\t\t} else {\r\n\t\t\tstrLang += \"syslang\" + strPair + strSep;\r\n\t\t}\r\n\t\tif (strTypeUsrLng !== \"undefined\") {\r\n\t\t\tstrLang += \"userlang\" + strPair + navigator.userLanguage;\r\n\t\t} else {\r\n\t\t\tstrLang += \"userlang\" + strPair;\r\n\t\t}\r\n\t\tstrOut = strLang;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_silverlight() {\r\n\t\"use strict\";\r\n\tvar strOnError, objControl, objPlugin, strSilverlightVersion, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tobjControl = null;\r\n\tobjPlugin = null;\r\n\tstrSilverlightVersion = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\ttry {\r\n\t\t\tobjControl = new ActiveXObject(\"AgControl.AgControl\");\r\n\t\t\tif (objControl.IsVersionSupported(\"5.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"5.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"4.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"4.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"3.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"3.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"2.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"2.x\";\r\n\t\t\t} else {\r\n\t\t\t\tstrSilverlightVersion = \"1.x\";\r\n\t\t\t}\r\n\t\t\tobjControl = null;\r\n\t\t} catch (e) {\r\n\t\t\tobjPlugin = navigator.plugins[\"Silverlight Plug-In\"];\r\n\t\t\tif (objPlugin) {\r\n\t\t\t\tif (objPlugin.description === \"1.0.30226.2\") {\r\n\t\t\t\t\tstrSilverlightVersion = \"2.x\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrSilverlightVersion = parseInt(objPlugin.description[0], 10);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tstrSilverlightVersion = \"N/A\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tstrOut = strSilverlightVersion;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_os() {\r\n\t\"use strict\";\r\n\tvar strSep, strOnError, strUserAgent, strPlatform, strOS, strOSBits, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrOnError = \"Error\";\r\n\tstrUserAgent = null;\r\n\tstrPlatform = null;\r\n\tstrOS = null;\r\n\tstrOSBits = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\t/* navigator.userAgent is supported by all major browsers */\r\n\t\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t\t/* navigator.platform is supported by all major browsers */\r\n\t\tstrPlatform = navigator.platform.toLowerCase();\r\n\t\tif (strUserAgent.indexOf(\"windows nt 6.3\") !== -1) {\r\n\t\t\tstrOS = \"Windows 8.1\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.2\") !== -1) {\r\n\t\t\tstrOS = \"Windows 8\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.1\") !== -1) {\r\n\t\t\tstrOS = \"Windows 7\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 10.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows 10\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows Vista/Windows Server 2008\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.2\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP x64/Windows Server 2003\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.1\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.01\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000, Service Pack 1 (SP1)\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows xp\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows 2000\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000\";\r\n\t\t} else if (strUserAgent.indexOf(\"iemobile\") !== -1) {\r\n\t\t\tstrOS = \"Windows Mobile\";\r\n\t\t} else if (strUserAgent.indexOf(\"wm5 pie\") !== -1) {\r\n\t\t\tstrOS = \"Windows Mobile\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows\") !== -1) {\r\n\t\t\tstrOS = \"Windows (Unknown Version)\";\r\n\t\t} else if (strUserAgent.indexOf(\"openbsd\") !== -1) {\r\n\t\t\tstrOS = \"Open BSD\";\r\n\t\t} else if (strUserAgent.indexOf(\"sunos\") !== -1) {\r\n\t\t\tstrOS = \"Sun OS\";\r\n\t\t} else if (strUserAgent.indexOf(\"ubuntu\") !== -1) {\r\n\t\t\tstrOS = \"Ubuntu\";\r\n\t\t} else if (strUserAgent.indexOf(\"ipad\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iPad)\";\r\n\t\t} else if (strUserAgent.indexOf(\"ipod\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iTouch)\";\r\n\t\t} else if (strUserAgent.indexOf(\"iphone\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iPhone)\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x beta\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Beta (Kodiak)\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.0\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Cheetah\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.1\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Puma\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.2\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Jaguar\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.3\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Panther\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.4\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Tiger\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.5\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Leopard\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.6\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Snow Leopard\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.7\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Lion\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX (Version Unknown)\";\r\n\t\t} else if (strUserAgent.indexOf(\"macintosh\") !== -1) {\r\n\t\t\tstrOS = \"Mac OS Classic\";\r\n\t\t} else if (strUserAgent.indexOf(\"googletv\") !== -1) {\r\n\t\t\tstrOS = \"Android (GoogleTV)\";\r\n\t\t} else if (strUserAgent.indexOf(\"android\") !== -1) {\r\n\t\t\tstrOS = \"Android\";\r\n\t\t} else if (strUserAgent.indexOf(\"x11\") !== -1) {\r\n\t\t\tstrOS = \"UNIX\";\r\n\t\t} else if (strUserAgent.indexOf(\"nix\") !== -1) {\r\n\t\t\tstrOS = \"UNIX\";\r\n\t\t} else if (strUserAgent.indexOf(\"linux\") !== -1) {\r\n\t\t\tstrOS = \"Linux\";\r\n\t\t} else if (strUserAgent.indexOf(\"qnx\") !== -1) {\r\n\t\t\tstrOS = \"QNX\";\r\n\t\t} else if (strUserAgent.indexOf(\"os/2\") !== -1) {\r\n\t\t\tstrOS = \"IBM OS/2\";\r\n\t\t} else if (strUserAgent.indexOf(\"beos\") !== -1) {\r\n\t\t\tstrOS = \"BeOS\";\r\n\t\t} else if (strUserAgent.indexOf(\"playbook\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry (Playbook)\";\r\n\t\t} else if (strUserAgent.indexOf(\"wnd.rim\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry (IE/FF Emulator)\";\r\n\t\t} else if (strUserAgent.indexOf(\"blackberry\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry\";\r\n\t\t} else if (strUserAgent.indexOf(\"palm\") !== -1) {\r\n\t\t\tstrOS = \"Palm OS\";\r\n\t\t} else if (strUserAgent.indexOf(\"webos\") !== -1) {\r\n\t\t\tstrOS = \"WebOS\";\r\n\t\t} else if (strUserAgent.indexOf(\"hpwos\") !== -1) {\r\n\t\t\tstrOS = \"WebOS (HP)\";\r\n\t\t} else if (strUserAgent.indexOf(\"kindle\") !== -1) {\r\n\t\t\tstrOS = \"Kindle\";\r\n\t\t} else if (strUserAgent.indexOf(\"wii\") !== -1) {\r\n\t\t\tstrOS = \"Nintendo (Wii)\";\r\n\t\t} else if (strUserAgent.indexOf(\"nintendo ds\") !== -1) {\r\n\t\t\tstrOS = \"Nintendo (DS)\";\r\n\t\t} else if (strUserAgent.indexOf(\"playstation 3\") !== -1) {\r\n\t\t\tstrOS = \"Sony (Playstation Console)\";\r\n\t\t} else if (strUserAgent.indexOf(\"playstation portable\") !== -1) {\r\n\t\t\tstrOS = \"Sony (Playstation Portable)\";\r\n\t\t} else if (strUserAgent.indexOf(\"webtv\") !== -1) {\r\n\t\t\tstrOS = \"MSN TV (WebTV)\";\r\n\t\t} else if (strUserAgent.indexOf(\"inferno\") !== -1) {\r\n\t\t\tstrOS = \"Inferno\";\r\n\t\t} else {\r\n\t\t\tstrOS = \"Unknown\";\r\n\t\t}\r\n\t\tif (strPlatform.indexOf(\"x64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"wow64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"win64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"win32\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x32\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x86\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits*\";\r\n\t\t} else if (strPlatform.indexOf(\"ppc\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"alpha\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"68k\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"iphone\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"android\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else {\r\n\t\t\tstrOSBits = \"Unknown\";\r\n\t\t}\r\n\t\tstrOut = strOS + strSep + strOSBits;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_useragent() {\r\n\t\"use strict\";\r\n\tvar strSep, strTmp, strUserAgent, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrTmp = null;\r\n\tstrUserAgent = null;\r\n\tstrOut = null;\r\n\r\n\t/* navigator.userAgent is supported by all major browsers */\r\n\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t/* navigator.platform is supported by all major browsers */\r\n\tstrTmp = strUserAgent + strSep + navigator.platform;\r\n\t/* navigator.cpuClass only supported in IE */\r\n\tif (navigator.cpuClass) {\r\n\t\tstrTmp += strSep + navigator.cpuClass;\r\n\t}\r\n\t/* navigator.browserLanguage only supported in IE, Safari and Chrome */\r\n\tif (navigator.browserLanguage) {\r\n\t\tstrTmp += strSep + navigator.browserLanguage;\r\n\t} else {\r\n\t\tstrTmp += strSep + navigator.language;\r\n\t}\r\n\tstrOut = strTmp;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_timezone() {\r\n\t\"use strict\";\r\n\tvar strOnError, dtDate, numOffset, numGMTHours, numOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tdtDate = null;\r\n\tnumOffset = null;\r\n\tnumGMTHours = null;\r\n\tnumOut = null;\r\n\r\n\ttry {\r\n\t\tdtDate = new Date();\r\n\t\tnumOffset = dtDate.getTimezoneOffset();\r\n\t\tnumGMTHours = (numOffset / 60) * (-1);\r\n\t\tnumOut = numGMTHours;\r\n\t\treturn numOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_touch() {\r\n\t\"use strict\";\r\n\tvar bolTouchEnabled, bolOut;\r\n\r\n\tbolTouchEnabled = false;\r\n\tbolOut = null;\r\n\r\n\ttry {\r\n\t\tif (document.createEvent(\"TouchEvent\")) {\r\n\t\t\tbolTouchEnabled = true;\r\n\t\t}\r\n\t\tbolOut = bolTouchEnabled;\r\n\t\treturn bolOut;\r\n\t} catch (ignore) {\r\n\t\tbolOut = bolTouchEnabled\r\n\t\treturn bolOut;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_truebrowser() {\r\n\t\"use strict\";\r\n\tvar strBrowser, strUserAgent, strOut;\r\n\r\n\tstrBrowser = \"Unknown\";\r\n\tstrUserAgent = null;\r\n\tstrOut = null;\r\n\r\n\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\r\n\t/* Checks for different browsers, cannot use Try/Catch block */\r\n\tif (document.all && document.getElementById && navigator.savePreferences && (strUserAgent.indexOf(\"Netfront\") < 0) && navigator.appName !== \"Blazer\") {\r\n\t\tstrBrowser = \"Escape 5\";\r\n\t} else if (navigator.vendor === \"KDE\") {\r\n\t\tstrBrowser = \"Konqueror\";\r\n\t} else if (document.childNodes && !document.all && !navigator.taintEnabled && !navigator.accentColorName) {\r\n\t\tstrBrowser = \"Safari\";\r\n\t} else if (document.childNodes && !document.all && !navigator.taintEnabled && navigator.accentColorName) {\r\n\t\tstrBrowser = \"OmniWeb 4.5+\";\r\n\t} else if (navigator.__ice_version) {\r\n\t\tstrBrowser = \"ICEBrowser\";\r\n\t} else if (window.ScriptEngine && ScriptEngine().indexOf(\"InScript\") + 1 && document.createElement) {\r\n\t\tstrBrowser = \"iCab 3+\";\r\n\t} else if (window.ScriptEngine && ScriptEngine().indexOf(\"InScript\") + 1) {\r\n\t\tstrBrowser = \"iCab 2-\";\r\n\t} else if (strUserAgent.indexOf(\"hotjava\") + 1 && (navigator.accentColorName) === \"undefined\") {\r\n\t\tstrBrowser = \"HotJava\";\r\n\t} else if (document.layers && !document.classes) {\r\n\t\tstrBrowser = \"Omniweb 4.2-\";\r\n\t} else if (document.layers && !navigator.mimeTypes[\"*\"]) {\r\n\t\tstrBrowser = \"Escape 4\";\r\n\t} else if (document.layers) {\r\n\t\tstrBrowser = \"Netscape 4\";\r\n\t} else if (window.opera && document.getElementsByClassName) {\r\n\t\tstrBrowser = \"Opera 9.5+\";\r\n\t} else if (window.opera && window.getComputedStyle) {\r\n\t\tstrBrowser = \"Opera 8\";\r\n\t} else if (window.opera && document.childNodes) {\r\n\t\tstrBrowser = \"Opera 7\";\r\n\t} else if (window.opera) {\r\n\t\tstrBrowser = \"Opera \" + window.opera.version();\r\n\t} else if (navigator.appName.indexOf(\"WebTV\") + 1) {\r\n\t\tstrBrowser = \"WebTV\";\r\n\t} else if (strUserAgent.indexOf(\"netgem\") + 1) {\r\n\t\tstrBrowser = \"Netgem NetBox\";\r\n\t} else if (strUserAgent.indexOf(\"opentv\") + 1) {\r\n\t\tstrBrowser = \"OpenTV\";\r\n\t} else if (strUserAgent.indexOf(\"ipanel\") + 1) {\r\n\t\tstrBrowser = \"iPanel MicroBrowser\";\r\n\t} else if (document.getElementById && !document.childNodes) {\r\n\t\tstrBrowser = \"Clue browser\";\r\n\t} else if (navigator.product && navigator.product.indexOf(\"Hv\") === 0) {\r\n\t\tstrBrowser = \"Tkhtml Hv3+\";\r\n\t} else if (typeof InstallTrigger !== \"undefined\") {\r\n\t\tstrBrowser = \"Firefox\";\r\n\t} else if (window.atob) {\r\n\t\tstrBrowser = \"Internet Explorer 10+\";\r\n\t} else if (XDomainRequest && window.performance) {\r\n\t\tstrBrowser = \"Internet Explorer 9\";\r\n\t} else if (XDomainRequest) {\r\n\t\tstrBrowser = \"Internet Explorer 8\";\r\n\t} else if (document.documentElement && document.documentElement.style.maxHeight !== \"undefined\") {\r\n\t\tstrBrowser = \"Internet Explorer 7\"; //xxxxx\r\n\t} else if (document.compatMode && document.all) {\r\n\t\tstrBrowser = \"Internet Explorer 6\"; //xxxxx\r\n\t} else if (window.createPopup) {\r\n\t\tstrBrowser = \"Internet Explorer 5.5\";\r\n\t} else if (window.attachEvent) {\r\n\t\tstrBrowser = \"Internet Explorer 5\";\r\n\t} else if (document.all && navigator.appName !== \"Microsoft Pocket Internet Explorer\") {\r\n\t\tstrBrowser = \"Internet Explorer 4\";\r\n\t} else if ((strUserAgent.indexOf(\"msie\") + 1) && window.ActiveXObject) {\r\n\t\tstrBrowser = \"Pocket Internet Explorer\";\r\n\t} else if (document.getElementById && ((strUserAgent.indexOf(\"netfront\") + 1) || navigator.appName === \"Blazer\" || navigator.product === \"Gecko\" || (navigator.appName.indexOf(\"PSP\") + 1) || (navigator.appName.indexOf(\"PLAYSTATION 3\") + 1))) {\r\n\t\tstrBrowser = \"NetFront 3+\";\r\n\t} else if (navigator.product === \"Gecko\" && !navigator.savePreferences) {\r\n\t\tstrBrowser = \"Gecko engine (Mozilla, Netscape 6+ etc.)\";\r\n\t} else if (window.chrome) {\r\n\t\tstrBrowser = \"Chrome\";\r\n\t}\r\n\tstrOut = strBrowser;\r\n\treturn strOut;\r\n}\r\n\r\nvar glbOnError = \"N/A\"\r\nvar glbSep = \"|\";\r\n\r\nfunction activeXDetect(componentClassID) {\r\n\t\"use strict\";\r\n\tvar strComponentVersion, strOut;\r\n\r\n\tstrComponentVersion = \"\";\r\n\tstrOut = \"\";\r\n\r\n\ttry {\r\n\t\tstrComponentVersion = document.body.getComponentVersion(\"{\" + componentClassID + \"}\", \"ComponentID\");\r\n\t\tif (strComponentVersion !== null) {\r\n\t\t\tstrOut = strComponentVersion;\r\n\t\t} else {\r\n\t\t\tstrOut = false;\r\n\t\t}\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}\r\n\r\nfunction stripIllegalChars(strValue) {\r\n\t\"use strict\";\r\n\tvar iCounter, strOriginal, strOut;\r\n\r\n\tiCounter = 0;\r\n\tstrOriginal = \"\";\r\n\tstrOut = \"\";\r\n\r\n\ttry {\r\n\t\tstrOriginal = strValue.toLowerCase();\r\n\t\tfor (iCounter = 0; iCounter < strOriginal.length; iCounter = iCounter + 1) {\r\n\t\t\tif (strOriginal.charAt(iCounter) !== \"\\n\" && strOriginal.charAt(iCounter) !== \"/\" && strOriginal.charAt(iCounter) !== \"\\\\\") {\r\n\t\t\t\tstrOut = strOut + strOriginal.charAt(iCounter);\r\n\t\t\t} else if (strOriginal.charAt(iCounter) === \"\\n\") {\r\n\t\t\t\tstrOut = strOut + \"n\";\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}\r\n\r\nfunction hashtable_containsKey(key) {\r\n\t\"use strict\";\r\n\tvar bolExists, iCounter;\r\n\r\n\tbolExists = false;\r\n\tiCounter = 0;\r\n\r\n\tfor (iCounter = 0; iCounter < this.hashtable.length; iCounter = iCounter + 1) {\r\n\t\tif (iCounter === key && this.hashtable[iCounter] !== null) {\r\n\t\t\tbolExists = true;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn bolExists;\r\n}\r\n\r\nfunction hashtable_get(key) {\r\n\t\"use strict\";\r\n\treturn this.hashtable[key];\r\n}\r\n\r\nfunction hashtable_keys() {\r\n\t\"use strict\";\r\n\tvar keys, iCounter;\r\n\r\n\tkeys = [];\r\n\tiCounter = 0;\r\n\r\n\tfor (iCounter in this.hashtable) {\r\n\t\tif (this.hashtable[iCounter] !== null) {\r\n\t\t\tkeys.push(iCounter);\r\n\t\t}\r\n\t}\r\n\treturn keys;\r\n}\r\n\r\nfunction hashtable_put(key, value) {\r\n\t\"use strict\";\r\n\tif (key === null || value === null) {\r\n\t\tthrow \"NullPointerException {\" + key + \"},{\" + value + \"}\";\r\n\t}\r\n\tthis.hashtable[key] = value;\r\n}\r\n\r\nfunction hashtable_size() {\r\n\t\"use strict\";\r\n\tvar iSize, iCounter, iOut;\r\n\r\n\tiSize = 0;\r\n\tiCounter = 0;\r\n\tiOut = 0;\r\n\r\n\tfor (iCounter in this.hashtable) {\r\n\t\tif (this.hashtable[iCounter] !== null) {\r\n\t\t\tiSize = iSize + 1;\r\n\t\t}\r\n\t}\r\n\tiOut = iSize;\r\n\treturn iOut;\r\n}\r\n\r\nfunction Hashtable() {\r\n\t\"use strict\";\r\n\tthis.containsKey = hashtable_containsKey;\r\n\tthis.get = hashtable_get;\r\n\tthis.keys = hashtable_keys;\r\n\tthis.put = hashtable_put;\r\n\tthis.size = hashtable_size;\r\n\tthis.hashtable = [];\r\n}\r\n\r\n/* Detect Plugins */\r\nfunction fingerprint_plugins() {\r\n\t\"use strict\";\r\n\tvar htIEComponents, strKey, strName, strVersion, strTemp, bolFirst, iCount, strMimeType, strOut;\r\n\r\n\ttry {\r\n\t\t/* Create hashtable of IE components */\r\n\t\thtIEComponents = new Hashtable();\r\n\t\thtIEComponents.put(\"7790769C-0471-11D2-AF11-00C04FA35D02\", \"AddressBook\"); // Address Book\r\n\t\thtIEComponents.put(\"47F67D00-9E55-11D1-BAEF-00C04FC2D130\", \"AolArtFormat\"); // AOL ART Image Format Support\r\n\t\thtIEComponents.put(\"76C19B38-F0C8-11CF-87CC-0020AFEECF20\", \"ArabicDS\"); // Arabic Text Display Support\r\n\t\thtIEComponents.put(\"76C19B34-F0C8-11CF-87CC-0020AFEECF20\", \"ChineseSDS\"); // Chinese (Simplified) Text Display Support\r\n\t\thtIEComponents.put(\"76C19B33-F0C8-11CF-87CC-0020AFEECF20\", \"ChineseTDS\"); // Chinese (traditional) Text Display Support\r\n\t\thtIEComponents.put(\"238F6F83-B8B4-11CF-8771-00A024541EE3\", \"CitrixICA\"); // Citrix ICA Client\r\n\t\thtIEComponents.put(\"283807B5-2C60-11D0-A31D-00AA00B92C03\", \"DirectAnim\"); // DirectAnimation\r\n\t\thtIEComponents.put(\"44BBA848-CC51-11CF-AAFA-00AA00B6015C\", \"DirectShow\"); // DirectShow\r\n\t\thtIEComponents.put(\"9381D8F2-0288-11D0-9501-00AA00B911A5\", \"DynHTML\"); // Dynamic HTML Data Binding\r\n\t\thtIEComponents.put(\"4F216970-C90C-11D1-B5C7-0000F8051515\", \"DynHTML4Java\"); // Dynamic HTML Data Binding for Java\r\n\t\thtIEComponents.put(\"D27CDB6E-AE6D-11CF-96B8-444553540000\", \"Flash\"); // Macromedia Flash\r\n\t\thtIEComponents.put(\"76C19B36-F0C8-11CF-87CC-0020AFEECF20\", \"HebrewDS\"); // Hebrew Text Display Support\r\n\t\thtIEComponents.put(\"630B1DA0-B465-11D1-9948-00C04F98BBC9\", \"IEBrwEnh\"); // Internet Explorer Browsing Enhancements\r\n\t\thtIEComponents.put(\"08B0E5C0-4FCB-11CF-AAA5-00401C608555\", \"IEClass4Java\"); // Internet Explorer Classes for Java\r\n\t\thtIEComponents.put(\"45EA75A0-A269-11D1-B5BF-0000F8051515\", \"IEHelp\"); // Internet Explorer Help\r\n\t\thtIEComponents.put(\"DE5AED00-A4BF-11D1-9948-00C04F98BBC9\", \"IEHelpEng\"); // Internet Explorer Help Engine\r\n\t\thtIEComponents.put(\"89820200-ECBD-11CF-8B85-00AA005B4383\", \"IE5WebBrw\"); // Internet Explorer 5/6 Web Browser\r\n\t\thtIEComponents.put(\"5A8D6EE0-3E18-11D0-821E-444553540000\", \"InetConnectionWiz\"); // Internet Connection Wizard\r\n\t\thtIEComponents.put(\"76C19B30-F0C8-11CF-87CC-0020AFEECF20\", \"JapaneseDS\"); // Japanese Text Display Support\r\n\t\thtIEComponents.put(\"76C19B31-F0C8-11CF-87CC-0020AFEECF20\", \"KoreanDS\"); // Korean Text Display Support\r\n\t\thtIEComponents.put(\"76C19B50-F0C8-11CF-87CC-0020AFEECF20\", \"LanguageAS\"); // Language Auto-Selection\r\n\t\thtIEComponents.put(\"08B0E5C0-4FCB-11CF-AAA5-00401C608500\", \"MsftVM\"); // Microsoft virtual machine\r\n\t\thtIEComponents.put(\"5945C046-LE7D-LLDL-BC44-00C04FD912BE\", \"MSNMessengerSrv\"); // MSN Messenger Service\r\n\t\thtIEComponents.put(\"44BBA842-CC51-11CF-AAFA-00AA00B6015B\", \"NetMeetingNT\"); // NetMeeting NT\r\n\t\thtIEComponents.put(\"3AF36230-A269-11D1-B5BF-0000F8051515\", \"OfflineBrwPack\"); // Offline Browsing Pack\r\n\t\thtIEComponents.put(\"44BBA840-CC51-11CF-AAFA-00AA00B6015C\", \"OutlookExpress\"); // Outlook Express\r\n\t\thtIEComponents.put(\"76C19B32-F0C8-11CF-87CC-0020AFEECF20\", \"PanEuropeanDS\"); // Pan-European Text Display Support\r\n\t\thtIEComponents.put(\"4063BE15-3B08-470D-A0D5-B37161CFFD69\", \"QuickTime\"); // Apple Quick Time\r\n\t\thtIEComponents.put(\"DE4AF3B0-F4D4-11D3-B41A-0050DA2E6C21\", \"QuickTimeCheck\"); // Apple Quick Time Check\r\n\t\thtIEComponents.put(\"3049C3E9-B461-4BC5-8870-4C09146192CA\", \"RealPlayer\"); // RealPlayer Download and Record Plugin for IE\r\n\t\thtIEComponents.put(\"2A202491-F00D-11CF-87CC-0020AFEECF20\", \"ShockwaveDir\"); // Macromedia Shockwave Director\r\n\t\thtIEComponents.put(\"3E01D8E0-A72B-4C9F-99BD-8A6E7B97A48D\", \"Skype\"); // Skype\r\n\t\thtIEComponents.put(\"CC2A9BA0-3BDD-11D0-821E-444553540000\", \"TaskScheduler\"); // Task Scheduler\r\n\t\thtIEComponents.put(\"76C19B35-F0C8-11CF-87CC-0020AFEECF20\", \"ThaiDS\"); // Thai Text Display Support\r\n\t\thtIEComponents.put(\"3BF42070-B3B1-11D1-B5C5-0000F8051515\", \"Uniscribe\"); // Uniscribe\r\n\t\thtIEComponents.put(\"4F645220-306D-11D2-995D-00C04F98BBC9\", \"VBScripting\"); // Visual Basic Scripting Support v5.6\r\n\t\thtIEComponents.put(\"76C19B37-F0C8-11CF-87CC-0020AFEECF20\", \"VietnameseDS\"); // Vietnamese Text Display Support\r\n\t\thtIEComponents.put(\"10072CEC-8CC1-11D1-986E-00A0C955B42F\", \"VML\"); // Vector Graphics Rendering (VML)\r\n\t\thtIEComponents.put(\"90E2BA2E-DD1B-4CDE-9134-7A8B86D33CA7\", \"WebEx\"); // WebEx Productivity Tools\r\n\t\thtIEComponents.put(\"73FA19D0-2D75-11D2-995D-00C04F98BBC9\", \"WebFolders\"); // Web Folders\r\n\t\thtIEComponents.put(\"89820200-ECBD-11CF-8B85-00AA005B4340\", \"WinDesktopUpdateNT\"); // Windows Desktop Update NT\r\n\t\thtIEComponents.put(\"9030D464-4C02-4ABF-8ECC-5164760863C6\", \"WinLive\"); // Windows Live ID Sign-in Helper\r\n\t\thtIEComponents.put(\"6BF52A52-394A-11D3-B153-00C04F79FAA6\", \"WinMediaPlayer\"); // Windows Media Player (Versions 7, 8 or 9)\r\n\t\thtIEComponents.put(\"22D6F312-B0F6-11D0-94AB-0080C74C7E95\", \"WinMediaPlayerTrad\"); // Windows Media Player (Traditional Versions)\r\n\r\n\t\tstrTemp = \"\";\r\n\t\tbolFirst = true;\r\n\r\n\t\t/* strOpera gives full path of the file, extract the filenames, ignoring description and length */\r\n\t\tif (navigator.plugins.length > 0) {\r\n\t\t\tfor (iCount = 0; iCount < navigator.plugins.length; iCount = iCount + 1) {\r\n\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\tstrTemp += navigator.plugins[iCount].name;\r\n\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrTemp += glbSep + navigator.plugins[iCount].name;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (navigator.mimeTypes.length > 0) {\r\n\t\t\tstrMimeType = navigator.mimeTypes;\r\n\t\t\tfor (iCount = 0; iCount < strMimeType.length; iCount = iCount + 1) {\r\n\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\tstrTemp += strMimeType[iCount].description;\r\n\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrTemp += glbSep + strMimeType[iCount].description;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdocument.body.addBehavior(\"#default#clientCaps\");\r\n\t\t\tstrKey = htIEComponents.keys();\r\n\t\t\tfor (iCount = 0; iCount < htIEComponents.size(); iCount = iCount + 1) {\r\n\t\t\t\tstrVersion = activeXDetect(strKey[iCount]);\r\n\t\t\t\tstrName = htIEComponents.get(strKey[iCount]);\r\n\t\t\t\tif (strVersion) {\r\n\t\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\t\tstrTemp = strName + glbPair + strVersion;\r\n\t\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstrTemp += glbSep + strName + glbPair + strVersion;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tstrTemp = strTemp.replace(/,/g, \".\");\r\n\t\t}\r\n\t\tstrTemp = stripIllegalChars(strTemp);\r\n\t\tif (strTemp === \"\") {\r\n\t\t\tstrTemp = \"None\";\r\n\t\t}\r\n\t\tstrOut = strTemp;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}","/*\r\n * Glorious webAO\r\n * made by sD, refactored by oldmud0 and Qubrick\r\n * credits to aleks for original idea and source\r\n*/\r\n\r\n// Uses the Gify library:\r\n// https://github.com/rfrench/gify\r\n// The following comment is needed for ESLint:\r\n/* global gify */\r\n\r\nimport background_arr from \"./backgrounds.js\";\r\nimport evidence_arr from \"./evidence.js\";\r\nimport Fingerprint from \"./fingerprint.js\";\r\n\r\nlet queryDict = {};\r\nlocation.search.substr(1).split(\"&\").forEach(function (item) {\r\n\tqueryDict[item.split(\"=\")[0]] = item.split(\"=\")[1];\r\n});\r\n\r\n/* Server magic */\r\n\r\nconst serverIP = queryDict.ip;\r\nlet mode = queryDict.mode;\r\n\r\nconst AO_HOST = queryDict.asset || \"http://s3.wasabisys.com/webao/base/\";\r\nconst MUSIC_HOST = AO_HOST + \"sounds/music/\";\r\nconst CHAR_SELECT_WIDTH = 8;\r\nconst UPDATE_INTERVAL = 60;\r\n\r\nlet oldLoading = false;\r\nif (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) {\r\n\toldLoading = true;\r\n}\r\n\r\nlet selectedEffect = 0;\r\nlet selectedMenu = 1;\r\nlet selectedShout = 0;\r\nlet fp = new Fingerprint({\r\n\tcanvas: true,\r\n\tie_activex: true,\r\n\tscreen_resolution: true\r\n});\r\nlet uid = fp.get();\r\nconsole.log(uid);\r\nlet lastICMessageTime = new Date(0);\r\n\r\nclass Client {\r\n\tconstructor(address) {\r\n\t\tthis.serv = new WebSocket(\"ws://\" + address);\r\n\r\n\t\tthis.serv.onopen = (evt) => this.onOpen(evt);\r\n\t\tthis.serv.onclose = (evt) => this.onClose(evt);\r\n\t\tthis.serv.onmessage = (evt) => this.onMessage(evt);\r\n\t\tthis.serv.onerror = (evt) => this.onError(evt);\r\n\r\n\t\tthis.flip = false;\r\n\t\tthis.presentable = false;\r\n\r\n\t\tthis.hp = [0, 0];\r\n\r\n\t\tthis.playerID = 1;\r\n\t\tthis.charID = -1;\r\n\t\tthis.testimonyID = 0;\r\n\r\n\t\tthis.chars = [];\r\n\t\tthis.emotes = [];\r\n\t\tthis.evidences = [];\r\n\r\n\t\tthis.resources = {\r\n\t\t\t\"holdit\": {\r\n\t\t\t\t\"src\": \"misc/holdit.gif\",\r\n\t\t\t\t\"duration\": 720\r\n\t\t\t},\r\n\t\t\t\"objection\": {\r\n\t\t\t\t\"src\": \"misc/objection.gif\",\r\n\t\t\t\t\"duration\": 720\r\n\t\t\t},\r\n\t\t\t\"takethat\": {\r\n\t\t\t\t\"src\": \"misc/takethat.gif\",\r\n\t\t\t\t\"duration\": 840\r\n\t\t\t},\r\n\t\t\t\"witnesstestimony\": {\r\n\t\t\t\t\"src\": \"misc/witnesstestimony.gif\",\r\n\t\t\t\t\"duration\": 1560,\r\n\t\t\t\t\"sfx\": \"sounds/general/sfx-testimony.wav\"\r\n\t\t\t},\r\n\t\t\t\"crossexamination\": {\r\n\t\t\t\t\"src\": \"misc/crossexamination.gif\",\r\n\t\t\t\t\"duration\": 1600,\r\n\t\t\t\t\"sfx\": \"sounds/general/sfx-testimony2.wav\"\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.selectedEmote = -1;\r\n\t\tthis.selectedEvidence = 0;\r\n\r\n\t\tthis.checkUpdater = null;\r\n\r\n\t\t// Only used for RMC/`music` packets, not EM/SM/MC packets.\r\n\t\tthis.musicList = Object();\r\n\r\n\t\tthis.handlers = {\r\n\t\t\t\"MS\": (args) => this.handleMS(args),\r\n\t\t\t\"CT\": (args) => this.handleCT(args),\r\n\t\t\t\"MC\": (args) => this.handleMC(args),\r\n\t\t\t\"RMC\": (args) => this.handleRMC(args),\r\n\t\t\t\"CI\": (args) => this.handleCI(args),\r\n\t\t\t\"SC\": (args) => this.handleSC(args),\r\n\t\t\t\"EI\": (args) => this.handleEI(args),\r\n\t\t\t\"LE\": (args) => this.handleLE(args),\r\n\t\t\t\"EM\": (args) => this.handleEM(args),\r\n\t\t\t\"SM\": (args) => this.handleSM(args),\r\n\t\t\t\"BD\": (args) => this.handleBD(args),\r\n\t\t\t\"music\": (args) => this.handlemusic(args),\r\n\t\t\t\"DONE\": (args) => this.handleDONE(args),\r\n\t\t\t\"BN\": (args) => this.handleBN(args),\r\n\t\t\t\"NBG\": (args) => this.handleNBG(args),\r\n\t\t\t\"HP\": (args) => this.handleHP(args),\r\n\t\t\t\"RT\": (args) => this.handleRT(args),\r\n\t\t\t\"ZZ\": (args) => this.handleZZ(args),\r\n\t\t\t\"ID\": (args) => this.handleID(args),\r\n\t\t\t\"PN\": (args) => this.handlePN(args),\r\n\t\t\t\"SI\": (args) => this.handleSI(args),\r\n\t\t\t\"CharsCheck\": (args) => this.handleCharsCheck(args),\r\n\t\t\t\"PV\": (args) => this.handlePV(args),\r\n\t\t\t\"CHECK\": (args) => {}\r\n\t\t};\r\n\r\n\t\tthis._lastTimeICReceived = new Date(0);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the current player's character.\r\n\t */\r\n\tme() {\r\n\t\treturn this.chars[this.charID];\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the player's currently selected emote.\r\n\t */\r\n\tmyEmote() {\r\n\t\treturn this.emotes[this.selectedEmote];\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the player's currently selected evidence if presentable.\r\n\t */\r\n\tmyEvidence() {\r\n\t\treturn this.presentable ? this.selectedEvidence : 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Sends an out-of-character chat message.\r\n\t * @param {string} message the message to send\r\n\t */\r\n\tsendOOC(message) {\r\n\t\tthis.serv.send(`CT#${escapeChat(encodeChat(document.getElementById(\"OOC_name\").value))}#${escapeChat(encodeChat(message))}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends an in-character chat message.\r\n\t * @param {string} speaking who is speaking\r\n\t * @param {string} name the name of the current character\r\n\t * @param {string} silent whether or not it's silent\r\n\t * @param {string} message the message to be sent\r\n\t * @param {string} side the name of the side in the background\r\n\t * @param {string} ssfxname the name of the sound effect\r\n\t * @param {string} zoom whether or not to zoom\r\n\t * @param {number} ssfxdelay the delay (in milliseconds) to play the sound effect\r\n\t * @param {string} objection the number of the shout to play\r\n\t * @param {string} evidence the filename of evidence to show\r\n\t * @param {number} flip change to 1 to reverse sprite for position changes\r\n\t * @param {string} flash screen flash effect\r\n\t * @param {string} color text color\r\n\t */\r\n\tsendIC(speaking, name, silent, message, side, ssfxname, zoom, ssfxdelay, objection, evidence, flip, flash, color) {\r\n\t\tthis.serv.send(\r\n\t\t\t`MS#chat#${speaking}#${name}#${silent}` +\r\n\t\t\t`#${escapeChat(encodeChat(message))}#${side}#${ssfxname}#${zoom}` +\r\n\t\t\t`#${this.charID}#${ssfxdelay}#${selectedShout}#${evidence}#${flip}#${flash}#${color}#%`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends add evidence command.\r\n\t * @param {string} evidence name\r\n\t * @param {string} evidence description\r\n\t * @param {string} evidence image filename\r\n\t */\r\n\tsendPE(name, desc, img) {\r\n\t\tthis.serv.send(`PE#${escapeChat(encodeChat(name))}#${escapeChat(encodeChat(desc))}#${img}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends edit evidence command.\r\n\t * @param {number} evidence id\r\n\t * @param {string} evidence name\r\n\t * @param {string} evidence description\r\n\t * @param {string} evidence image filename\r\n\t */\r\n\tsendEE(id, name, desc, img) {\r\n\t\tthis.serv.send(`EE#${id}#${escapeChat(encodeChat(name))}#${escapeChat(encodeChat(desc))}#${img}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends delete evidence command.\r\n\t * @param {number} evidence id\r\n\t */\r\n\tsendDE(id) {\r\n\t\tthis.serv.send(`DE#${id}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends health point command.\r\n\t * @param {number} side the position\r\n\t * @param {number} hp the health point\r\n\t */\r\n\tsendHP(side, hp) {\r\n\t\tthis.serv.send(`HP#${side}#${hp}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends call mod command.\r\n\t * @param {string} message to mod\r\n\t */\r\n\tsendZZ(msg) {\r\n\t\tthis.serv.send(`ZZ#${msg}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends testimony command.\r\n\t * @param {string} testimony type\r\n\t */\r\n\tsendRT(testimony) {\r\n\t\tif (this.chars[this.charID].side == \"jud\") {\r\n\t\t\tthis.serv.send(`RT#${testimony}#%`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to change the music to the specified track.\r\n\t * @param {string} track the track ID\r\n\t */\r\n\tsendMusicChange(track) {\r\n\t\tthis.serv.send(`MC#${track}#${this.charID}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to leave the room and free the character slot.\r\n\t * \r\n\t * Note: This packet is undocumented. It is not implemented by\r\n\t * either the AO2 client or tsuserver.\r\n\t */\r\n\tsendLeaveRoom() {\r\n\t\tthis.serv.send(\"FC#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Begins the handshake process by sending an identifier\r\n\t * to the server.\r\n\t */\r\n\tjoinServer() {\r\n\t\tthis.serv.send(`HI#${hash6ode()}#%`);\r\n\t\tthis.serv.send(\"ID#webAO#2.3#%\");\r\n\t\tthis.checkUpdater = setInterval(() => this.sendCheck(), 5000);\r\n\t}\r\n\r\n\t/**\r\n\t * Load game resources.\r\n\t */\r\n\tloadResources() {\r\n\t\t// Set to playerID to server chat name\r\n\t\t// TODO: Make a text box for this!\r\n\t\tdocument.getElementById(\"OOC_name\").value = \"web\" + this.playerID;\r\n\r\n\t\t// Load evidence array to select\r\n\t\tconst evidence_select = document.getElementById(\"evi_select\");\r\n\t\tevidence_select.add(new Option(\"Custom\", 0));\r\n\t\tevidence_arr.forEach(evidence => {\r\n\t\t\tevidence_select.add(new Option(evidence));\r\n\t\t});\r\n\r\n\t\t// Load background array to select\r\n\t\tconst background_select = document.getElementById(\"bg_select\");\r\n\t\tbackground_select.add(new Option(\"Custom\", 0));\r\n\t\tbackground_arr.forEach(background => {\r\n\t\t\tbackground_select.add(new Option(background));\r\n\t\t});\r\n\t\t// Calculate gif duration of shouts\r\n\t\tconst shouts = [\"holdit\", \"objection\", \"takethat\"];\r\n\t\tfor (let i = 0; i < shouts.length; i++) {\r\n\t\t\tlet shout_src = AO_HOST + this.resources[shouts[i]][\"src\"].toLowerCase();\r\n\t\t\tfileExists(shout_src, this.callbackLoadImageResources, shouts[i]);\r\n\t\t}\r\n\r\n\t\t// Calculate gif duration of testimony\r\n\t\tconst testimony = [\"witnesstestimony\", \"crossexamination\"];\r\n\t\tfor (let i = 0; i < testimony.length; i++) {\r\n\t\t\tconst testimony_src = `${AO_HOST}themes/default/${testimony[i]}.gif`;\r\n\t\t\t// Check image existed\r\n\t\t\tfileExists(testimony_src, this.callbackLoadImageResources, testimony[i]);\r\n\t\t\t// Check sfx existed\r\n\t\t\tfileExists(AO_HOST + this.resources[testimony[i]][\"sfx\"].toLowerCase(), this.callbackLoadSFXResources, testimony[i]);\r\n\t\t}\r\n\t\t// TODO: Cache some resources\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Callback for image resources.\r\n\t * @param {boolean} result the image is existed or not\r\n\t * @param {string} resource the resource name\r\n\t * @param {string} src the url of resource\r\n\t */\r\n\tcallbackLoadImageResources(result, resource, src) {\r\n\t\tif (result) {\r\n\t\t\tclient.resources[resource][\"src\"] = src;\r\n\t\t\tviewport.getAnimLength(src, client.callbackGetResourceLength, resource);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Callback for animation duration resource\r\n\t * @param {integer} length the animation length\r\n\t * @param {string} resource the resource name\r\n\t */\r\n\tcallbackGetResourceLength(length, resource) {\r\n\t\tclient.resources[resource][\"duration\"] = length;\r\n\t}\r\n\r\n\t/**\r\n\t * Callback for sfx resources.\r\n\t * @param {boolean} result the audio is existed or not\r\n\t * @param {string} resource the resource name\r\n\t * @param {string} src the url of resource\r\n\t */\r\n\tcallbackLoadSFXResources(result, resource, src) {\r\n\t\tif (result) {\r\n\t\t\tclient.resources[resource][\"sfx\"] = src;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Create observer to detect BBCode elements\r\n\t * then manipulate them.\r\n\t */\r\n\tinitialObservBBCode() {\r\n\t\tconst target = document.getElementById(\"client_inner_chat\");\r\n\t\tconst observer = new MutationObserver(function (mutations) {\r\n\t\t\tmutations.forEach(function (mutation) {\r\n\t\t\t\tconst children = mutation.addedNodes;\r\n\t\t\t\tif (children !== null) {\r\n\t\t\t\t\tchildren.forEach(function (node) {\r\n\t\t\t\t\t\tif (node.tagName == \"C\") {\r\n\t\t\t\t\t\t\tnode.style.color = node.getAttribute(\"a\");\r\n\t\t\t\t\t\t} else if (node.tagName == \"M\") {\r\n\t\t\t\t\t\t\tif (node.hasAttribute(\"a\")) {\r\n\t\t\t\t\t\t\t\tnode.style.backgroundColor = node.getAttribute(\"a\");\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tnode.style.backgroundColor = \"yellow\";\r\n\t\t\t\t\t\t\t\tnode.style.color = \"black\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t\tconst config = {\r\n\t\t\tattributes: true,\r\n\t\t\tchildList: true\r\n\t\t};\r\n\t\tobserver.observe(target, config);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to play as a specified character.\r\n\t * @param {number} character the character ID\r\n\t */\r\n\tsendCharacter(character) {\r\n\t\tthis.serv.send(`CC#${this.playerID}#${character}#web#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to select a music track.\r\n\t * @param {number?} song the song to be played\r\n\t */\r\n\tsendMusic(song) {\r\n\t\tthis.serv.send(`MC#${song}`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a keepalive packet.\r\n\t */\r\n\tsendCheck() {\r\n\t\tthis.serv.send(`CH#${this.charID}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when a connection is established to the server.\r\n\t */\r\n\tonOpen(e) {\r\n\t\t// XXX: Why does watching mean just SITTING there and doing nothing?\r\n\t\tif (mode === \"watch\") {\r\n\t\t\tdocument.getElementById(\"client_loading\").style.display = \"none\";\r\n\t\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\t} else {\r\n\t\t\tclient.joinServer();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when the connection to the server closes.\r\n\t * @param {CloseEvent} e\r\n\t */\r\n\tonClose(e) {\r\n\t\tconsole.error(`The connection was closed: ${e.reason} (${e.code})`);\r\n\t\tif (e.code !== 1001) {\r\n\t\t\tdocument.getElementById(\"client_error\").style.display = \"block\";\r\n\t\t\tdocument.getElementById(\"error_id\").textContent = e.code;\r\n\t\t\tthis.cleanup();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when a packet is received from the server.\r\n\t * @param {MessageEvent} e\r\n\t */\r\n\tonMessage(e) {\r\n\t\tlet msg = e.data;\r\n\t\tconsole.debug(msg);\r\n\t\tlet lines = msg.split(\"%\");\r\n\t\tlet args = lines[0].split(\"#\");\r\n\t\tlet header = args[0];\r\n\t\tlet handler = this.handlers[header];\r\n\t\tif (typeof handler !== \"undefined\") {\r\n\t\t\thandler(args);\r\n\t\t} else {\r\n\t\t\tconsole.warn(`Invalid packet header ${header}`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when an network error occurs.\r\n\t * @param {ErrorEvent} e \r\n\t */\r\n\tonError(e) {\r\n\t\tconsole.error(`A network error occurred: ${e.reason} (${e.code})`);\r\n\t\tdocument.getElementById(\"client_error\").style.display = \"block\";\r\n\t\tdocument.getElementById(\"error_id\").textContent = e.code;\r\n\t\tthis.cleanup();\r\n\t}\r\n\r\n\tcleanup() {\r\n\t\ttry {\r\n\t\t\tthis.serv.close(1001);\r\n\t\t} catch (e) {\r\n\t\t\t// I don't care if this errors\r\n\t\t}\r\n\t\tclearInterval(this.checkUpdater);\r\n\t}\r\n\r\n\t/**\r\n\t * XXX: a nasty hack made by gameboyprinter.\r\n\t * @param {string} msg chat message to prepare for display \r\n\t */\r\n\tprepChat(msg){\r\n\t\t// TODO: make this less awful\r\n\t\treturn decodeBBCode(unescapeChat(decodeChat(msg)));\r\n\t}\r\n\r\n\t/**\r\n\t * Handles an in-character chat message.\r\n\t * @param {*} args packet arguments\r\n\t */\r\n\thandleMS(args) {\r\n\t\t// TODO: this if-statement might be a bug.\r\n\t\tif (args[4] != viewport.chatmsg.content) {\r\n\t\t\tdocument.getElementById(\"client_inner_chat\").innerHTML = \"\";\r\n\t\t\tconst chatmsg = {\r\n\t\t\t\t// pre: escape(args[2]),\r\n\t\t\t\tcharacter: -1, // Will do a linear search\r\n\t\t\t\tpreanim: escape(args[2]), // XXX: why again?\r\n\t\t\t\tnameplate: args[3], // TODO: parse INI to get this info\r\n\t\t\t\tname: args[3],\r\n\t\t\t\tspeaking: \"(b)\" + escape(args[4]),\r\n\t\t\t\tsilent: \"(a)\" + escape(args[4]),\r\n\t\t\t\tcontent: this.prepChat(args[5]), // Escape HTML tag, Use BBCode Only!\r\n\t\t\t\tside: args[6],\r\n\t\t\t\tsound: escape(args[7]),\r\n\t\t\t\ttype: args[8],\r\n\t\t\t\t// charid: args[9],\r\n\t\t\t\tsnddelay: args[10],\r\n\t\t\t\tobjection: args[11],\r\n\t\t\t\tevidence: args[12],\r\n\t\t\t\tflip: args[13],\r\n\t\t\t\tflash: args[14],\r\n\t\t\t\tcolor: args[15],\r\n\t\t\t\tisnew: true,\r\n\t\t\t};\r\n\r\n\t\t\t// The dreaded linear search...\r\n\t\t\tfor (let i = 0; i < this.chars.length; i++) {\r\n\t\t\t\tif (this.chars[i].name == args[3]) {\r\n\t\t\t\t\tchatmsg.character = i;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (chatmsg.character == this.charID) {\r\n\t\t\t\tresetICParams();\r\n\t\t\t}\r\n\r\n\t\t\tviewport.say(chatmsg);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles an out-of-character chat message.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCT(args) {\r\n\t\tconst oocLog = document.getElementById(\"client_ooclog\");\r\n\t\toocLog.innerHTML += `${decodeChat(unescapeChat(args[1]))}: ${decodeChat(unescapeChat(args[2]))}\\r\\n`;\r\n\t\tif (oocLog.scrollTop > oocLog.scrollHeight - 600) {\r\n\t\t\toocLog.scrollTop = oocLog.scrollHeight;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a music change to an arbitrary resource.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleMC(args) {\r\n\t\tconst music = viewport.music;\r\n\t\tmusic.pause();\r\n\t\tmusic.src = MUSIC_HOST + args[1].toLowerCase();\r\n\t\tmusic.play();\r\n\t\tif (args[2] >= 0) {\r\n\t\t\tlet musicname = this.chars[args[2]].name;\r\n\t\t\tappendICLog(`${musicname} changed music to ${args[1]}`);\r\n\t\t} else {\r\n\t\t\tappendICLog(`The music was changed to ${args[1]}`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a music change to an arbitrary resource, with an offset in seconds.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleRMC(args) {\r\n\t\tviewport.music.pause();\r\n\t\tviewport.music = new Audio(this.musicList[args[1]]);\r\n\t\tconst music = viewport.music;\r\n\t\t// Music offset + drift from song loading\r\n\t\tmusic.totime = args[1];\r\n\t\tmusic.offset = new Date().getTime() / 1000;\r\n\t\tmusic.addEventListener(\"loadedmetadata\", function () {\r\n\t\t\tmusic.currentTime += parseFloat(music.totime + (new Date().getTime() / 1000 - music.offset)).toFixed(3);\r\n\t\t\tmusic.play();\r\n\t\t}, false);\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming character information, bundling multiple characters\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCI(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Character \" + args[1];\r\n\t\tthis.serv.send(\"AN#\" + ((args[1] / 10) + 1) + \"#%\");\r\n\t\tfor (let i = 2; i < args.length - 1; i++) {\r\n\t\t\tif (i % 2 == 0) {\r\n\t\t\t\tlet chargs = args[i].split(\"&\");\r\n\t\t\t\tthis.chars[args[i - 1]] = {\r\n\t\t\t\t\t\"name\": chargs[0],\r\n\t\t\t\t\t\"desc\": chargs[1],\r\n\t\t\t\t\t\"evidence\": chargs[3],\r\n\t\t\t\t\t\"icon\": AO_HOST + \"characters/\" + escape(chargs[0].toLowerCase()) + \"/char_icon.png\"\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming character information, containing only one character\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSC(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Characters\";\r\n\t\tfor (let i = 1; i < args.length - 1; i++) {\r\n\t\t\tlet chargs = args[i].split(\"&\");\r\n\t\t\tthis.chars[i - 1] = {\r\n\t\t\t\t\"name\": chargs[0],\r\n\t\t\t\t\"desc\": chargs[1],\r\n\t\t\t\t\"evidence\": chargs[3],\r\n\t\t\t\t\"icon\": AO_HOST + \"characters/\" + escape(chargs[0].toLowerCase()) + \"/char_icon.png\"\r\n\t\t\t};\r\n\t\t}\r\n\t\tthis.serv.send(\"RM#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming evidence information, containing only one evidence\r\n\t * item per packet.\r\n\t * \r\n\t * Mostly unimplemented in webAO.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleEI(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Evidence \" + args[1];\r\n\t\t//serv.send(\"AE#\" + (args[1] + 1) + \"#%\");\r\n\t\tthis.serv.send(\"RM#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming evidence list, all evidences at once\r\n\t * item per packet.\r\n\t * \r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleLE(args) {\r\n\t\tthis.evidences = [];\r\n\t\tfor (let i = 1; i < args.length - 1; i++) {\r\n\t\t\tconst arg = args[i].split(\"&\");\r\n\t\t\tthis.evidences[i - 1] = {\r\n\t\t\t\t\"name\": decodeChat(unescapeChat(arg[0])),\r\n\t\t\t\t\"desc\": decodeChat(unescapeChat(arg[1])),\r\n\t\t\t\t\"filename\": escape(arg[2]),\r\n\t\t\t\t\"icon\": AO_HOST + \"evidence/\" + escape(arg[2].toLowerCase())\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst evidence_box = document.getElementById(\"evidences\");\r\n\t\tevidence_box.innerHTML = \"\";\r\n\t\tfor (let i = 1; i <= this.evidences.length; i++) {\r\n\t\t\tevidence_box.innerHTML += `<img src=\"${this.evidences[i - 1].icon}\" \r\n\t\t\t\tid=\"evi_${i}\" \r\n\t\t\t\talt=\"${this.evidences[i - 1].name}\"\r\n\t\t\t\tclass=\"client_button\"\r\n\t\t\t\tonclick=\"pickEvidence(${i})\">`;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing multiple entries\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleEM(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Music \" + args[1];\r\n\t\tthis.serv.send(\"AM#\" + ((args[1] / 10) + 1) + \"#%\");\r\n\t\tlet hmusiclist = document.getElementById(\"client_musiclist\");\r\n\t\tfor (let i = 2; i < args.length - 1; i++) {\r\n\t\t\tif (i % 2 == 0) {\r\n\t\t\t\tlet newentry = document.createElement(\"OPTION\");\r\n\t\t\t\tnewentry.text = args[i];\r\n\t\t\t\thmusiclist.options.add(newentry);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing only one entry\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSM(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Music \";\r\n\t\tconst hmusiclist = document.getElementById(\"client_musiclist\");\r\n\t\tlet flagAudio = false;\r\n\r\n\t\tfor (let i = 1; i < args.length - 1; i++) {\r\n\t\t\t// Check when found the song for the first time\r\n\t\t\tif (/\\.(?:wav|mp3|mp4|ogg|opus)$/i.test(args[i]) && !flagAudio) {\r\n\t\t\t\tflagAudio = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (flagAudio) {\r\n\t\t\t\t// After reached the audio put everything in the music list\r\n\t\t\t\tconst newentry = document.createElement(\"OPTION\");\r\n\t\t\t\tnewentry.text = args[i];\r\n\t\t\t\thmusiclist.options.add(newentry);\r\n\t\t\t} else {\r\n\t\t\t\t// Create area button\r\n\t\t\t\tconst newarea = document.createElement(\"SPAN\");\r\n\t\t\t\tnewarea.className = \"location-box\";\r\n\t\t\t\tnewarea.textContent = args[i];\r\n\t\t\t\tnewarea.onclick = function () {\r\n\t\t\t\t\tarea_click(this);\r\n\t\t\t\t};\r\n\t\t\t\tdocument.getElementById(\"areas\").appendChild(newarea);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// We need to check if the last area that we got was actually a category\r\n\t\t// header for music. If it was, then move it over to the music list.\r\n\t\tconst area_box = document.getElementById(\"areas\");\r\n\t\tif (area_box.lastChild.textContent.startsWith(\"=\")) {\r\n\t\t\tconst audio_title = document.createElement(\"OPTION\");\r\n\t\t\taudio_title.text = area_box.lastChild.textContent;\r\n\t\t\thmusiclist.insertBefore(audio_title, hmusiclist.firstChild);\r\n\t\t\tarea_box.removeChild(area_box.lastChild);\r\n\t\t}\r\n\r\n\t\tthis.serv.send(\"RD#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the banned packet\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleBD(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Banned: \" + args[1];\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing all entries\r\n\t * in the same packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandlemusic(args) {\r\n\t\tfor (let i = 0; i < args.length / 2; i++) {\r\n\t\t\tthis.musicList[args[2 * i]] = args[2 * i + 1];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the handshake completion packet, meaning the player\r\n\t * is ready to select a character.\r\n\t * \r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleDONE(args) {\r\n\t\tdocument.getElementById(\"client_loading\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"block\";\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a background change.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleBN(args) {\r\n\t\tviewport.bgname = escape(args[1]);\r\n\t\tconst bg_index = getIndexFromSelect(\"bg_select\", escape(args[1]));\r\n\t\tdocument.getElementById(\"bg_select\").selectedIndex = bg_index;\r\n\t\tupdateBackgroundPreview();\r\n\t\tif (bg_index == 0) {\r\n\t\t\tdocument.getElementById(\"bg_filename\").value = args[1];\r\n\t\t}\r\n\t\tdocument.getElementById(\"bg_preview\").src = AO_HOST + \"background/\" + escape(args[1].toLowerCase()) + \"/defenseempty.png\";\r\n\t\tif (this.charID == -1) {\r\n\t\t\tchangeBackground(\"jud\");\r\n\t\t} else {\r\n\t\t\tchangeBackground(this.chars[this.charID].side);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\thandleNBG(args) {\r\n\t\t// TODO (set by sD)\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a change in the health bars' states.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleHP(args) {\r\n\t\tconst percent_hp = args[2] * 10;\r\n\t\tif (args[1] == 1) {\r\n\t\t\t// Def hp\r\n\t\t\tthis.hp[0] = args[2];\r\n\t\t\t$(\"#client_defense_hp > .health-bar\").animate({\r\n\t\t\t\t\"width\": percent_hp + \"%\"\r\n\t\t\t}, 500);\r\n\t\t} else {\r\n\t\t\t// Pro hp\r\n\t\t\tthis.hp[1] = args[2];\r\n\t\t\t$(\"#client_prosecutor_hp > .health-bar\").animate({\r\n\t\t\t\t\"width\": percent_hp + \"%\"\r\n\t\t\t}, 500);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a testimony states.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleRT(args) {\r\n\t\tif (args[1] == \"testimony1\") {\r\n\t\t\t//Witness Testimony\r\n\t\t\tthis.testimonyID = 1;\r\n\t\t} else {\r\n\t\t\t//Cross Examination\r\n\t\t\tthis.testimonyID = 2;\r\n\t\t}\r\n\t\tviewport.initTestimonyUpdater();\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a call mod message.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleZZ(args) {\r\n\t\tconst oocLog = document.getElementById(\"client_ooclog\");\r\n\t\toocLog.innerHTML += `$Alert: ${decodeChat(unescapeChat(args[1]))}\\r\\n`;\r\n\t\tif (oocLog.scrollTop > oocLog.scrollHeight - 60) {\r\n\t\t\toocLog.scrollTop = oocLog.scrollHeight;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the issuance of a player ID by the server.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleID(args) {\r\n\t\tthis.playerID = args[1];\r\n\t}\r\n\r\n\thandlePN(args) {\r\n\t\tthis.serv.send(\"askchaa#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Received when the server announces its server info,\r\n\t * but we use it as a cue to begin retrieving characters.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSI(args) {\r\n\t\tif (oldLoading) {\r\n\t\t\tthis.serv.send(\"askchar2#%\");\r\n\t\t} else {\r\n\t\t\tthis.serv.send(\"RC#%\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the list of all used and vacant characters.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCharsCheck(args) {\r\n\t\tdocument.getElementById(\"client_chartable\").innerHTML = \"\";\r\n\t\tlet tr;\r\n\t\tfor (let i = 0; i < this.chars.length; i++) {\r\n\t\t\tif (i % CHAR_SELECT_WIDTH == 0) {\r\n\t\t\t\ttr = document.createElement(\"TR\");\r\n\t\t\t}\r\n\t\t\tconst td = document.createElement(\"TD\");\r\n\t\t\tlet icon_chosen = \"\";\r\n\t\t\tconst thispick = this.chars[i].icon;\r\n\t\t\tif (args[i + 1] == \"-1\") {\r\n\t\t\t\ticon_chosen = \" dark\";\r\n\t\t\t}\r\n\t\t\ttd.innerHTML = `<img class='demothing${icon_chosen}' id='demo_${i}' ` +\r\n\t\t\t\t`src='${thispick}' alt='${this.chars[i].name}' onclick='pickChar(${i})' ` +\r\n\t\t\t\t\"onerror='demoError(this);'>\";\r\n\t\t\ttr.appendChild(td);\r\n\t\t\tif (i % CHAR_SELECT_WIDTH == 0) {\r\n\t\t\t\tdocument.getElementById(\"client_chartable\").appendChild(tr);\r\n\t\t\t}\r\n\t\t}\r\n\t\t//changeBackground(\"def\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the server's assignment of a character for the player to use.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandlePV(args) {\r\n\t\tthis.charID = args[3];\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_inputbox\").style.display = \"\";\r\n\t\tconst me = this.me();\r\n\t\tconst emotes = this.emotes;\r\n\t\tconst emotesList = document.getElementById(\"client_emo\");\r\n\t\temotesList.innerHTML = \"\"; // Clear emote box\r\n\t\temotesList.style.display = \"\";\r\n\t\tconst xhr = new XMLHttpRequest();\r\n\t\txhr.withCredentials = false;\r\n\t\txhr.open(\"GET\", AO_HOST + \"characters/\" + escape(this.me().name.toLowerCase()) + \"/char.ini\", true);\r\n\t\txhr.responseType = \"text\";\r\n\t\txhr.onload = function (e) {\r\n\t\t\tif (this.status == 200) {\r\n\t\t\t\tconst linifile = this.responseText;\r\n\t\t\t\tconst pinifile = INI.parse(linifile);\r\n\t\t\t\tme.side = pinifile.Options.side;\r\n\t\t\t\tupdateActionCommands(me.side);\r\n\t\t\t\tfor (let i = 1; i <= pinifile.Emotions.number; i++) {\r\n\t\t\t\t\tconst emoteinfo = pinifile.Emotions[i].split(\"#\");\r\n\t\t\t\t\tlet esfx = \"0\";\r\n\t\t\t\t\tlet esfxd = \"0\";\r\n\t\t\t\t\tif (typeof pinifile.SoundN !== \"undefined\") {\r\n\t\t\t\t\t\tesfx = pinifile.SoundN[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (typeof pinifile.SoundT !== \"undefined\") {\r\n\t\t\t\t\t\tesfxd = pinifile.SoundT[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Make sure the asset server is case insensitive, or that everything on it is lowercase\r\n\t\t\t\t\temotes[i] = {\r\n\t\t\t\t\t\tdesc: emoteinfo[0].toLowerCase(),\r\n\t\t\t\t\t\tspeaking: emoteinfo[1].toLowerCase(),\r\n\t\t\t\t\t\tsilent: emoteinfo[2].toLowerCase(),\r\n\t\t\t\t\t\tzoom: emoteinfo[3],\r\n\t\t\t\t\t\tsfx: esfx.toLowerCase(),\r\n\t\t\t\t\t\tsfxdelay: esfxd,\r\n\t\t\t\t\t\tbutton_off: AO_HOST + `characters/${escape(me.name).toLowerCase()}/emotions/button${i}_off.png`,\r\n\t\t\t\t\t\tbutton_on: AO_HOST + `characters/${escape(me.name).toLowerCase()}/emotions/button${i}_on.png`\r\n\t\t\t\t\t};\r\n\t\t\t\t\temotesList.innerHTML += \r\n\t\t\t\t\t\t`<img src=${emotes[i].button_off}\r\n\t\t\t\t\t\t id=\"emo_${i}\"\r\n\t\t\t\t\t\t alt=\"${emotes[i].desc}\"\r\n\t\t\t\t\t\t class=\"client_button\"\r\n\t\t\t\t\t\t onclick=\"pickEmotion(${i})\">`;\r\n\t\t\t\t}\r\n\t\t\t\tpickEmotion(1);\r\n\t\t\t}\r\n\t\t};\r\n\t\txhr.send();\r\n\t}\r\n}\r\n\r\nclass Viewport {\r\n\tconstructor() {\r\n\t\tthis.textnow = \"\";\r\n\t\tthis.chatmsg = {\r\n\t\t\t\"isnew\": false,\r\n\t\t\t\"content\": \"\",\r\n\t\t\t\"objection\": \"0\",\r\n\t\t\t\"sound\": \"\",\r\n\t\t\t\"startpreanim\": false,\r\n\t\t\t\"startspeaking\": false,\r\n\t\t\t\"side\": null,\r\n\t\t\t\"color\": \"0\",\r\n\t\t\t\"snddelay\": 0,\r\n\t\t\t\"preanimdelay\": 0\r\n\t\t};\r\n\t\tthis.blip = new Audio(AO_HOST + \"sounds/general/sfx-blipmale.wav\");\r\n\t\tthis.blip.volume = 0.5;\r\n\r\n\t\t// Allocate multiple blip audio channels to make blips less jittery\r\n\r\n\t\t// TODO: read blip type (\"gender\") from ini\r\n\t\tthis.blipChannels = new Array(6);\r\n\t\tfor (let i = 0; i < this.blipChannels.length; i++) {\r\n\t\t\tthis.blipChannels[i] = new Audio(AO_HOST + \"sounds/general/sfx-blipmale.wav\");\r\n\t\t\tthis.blipChannels[i].volume = 0.5;\r\n\t\t}\r\n\t\tthis.currentBlipChannel = 0;\r\n\r\n\t\tthis.sfxaudio = new Audio(AO_HOST + \"sounds/general/sfx-blipmale.wav\");\r\n\t\tthis.sfxplayed = 0;\r\n\r\n\t\tthis.music = new Audio();\r\n\t\tthis.music.play();\r\n\r\n\t\tthis.updater = null;\r\n\t\tthis.testimonyUpdater = null;\r\n\r\n\t\tthis.bgname = \"gs4\";\r\n\r\n\t\tthis.testimonyTimer = 0;\r\n\t\tthis.shoutTimer = 0;\r\n\t\tthis.textTimer = 0;\r\n\r\n\t\tthis._animating = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns whether or not the viewport is busy\r\n\t * performing a task (animating).\r\n\t */\r\n\tisAnimating() {\r\n\t\treturn this._animating;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the volume of the blip sound.\r\n\t * @param {number} volume\r\n\t */\r\n\tsetBlipVolume(volume) {\r\n\t\tfor (let i = 0; i < this.blipChannels.length; i++) {\r\n\t\t\tthis.blipChannels[i].volume = volume;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the path which the background is located in.\r\n\t */\r\n\tbgFolder() {\r\n\t\treturn `${AO_HOST}background/${this.bgname.toLowerCase()}/`;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a new emote.\r\n\t * @param {object} chatmsg the new chat message\r\n\t */\r\n\tsay(chatmsg) {\r\n\t\tthis.chatmsg = chatmsg;\r\n\t\tappendICLog(chatmsg.content, chatmsg.nameplate);\r\n\t\tchangeBackground(chatmsg.side);\r\n\t\tthis.textnow = \"\";\r\n\t\tthis.sfxplayed = 0;\r\n\t\tthis.textTimer = 0;\r\n\t\tthis._animating = true;\r\n\t\tclearTimeout(this.updater);\r\n\t\t// If preanim existed then determine the length\r\n\t\tif (chatmsg.preanim != \"-\") {\r\n\t\t\tchatmsg.preanimdelay = this.getAnimLength(`${AO_HOST}characters/${escape(chatmsg.name.toLowerCase())}/${chatmsg.preanim.toLowerCase()}.gif`, this.initUpdater);\r\n\t\t} else {\r\n\t\t\tthis.initUpdater(0);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Intialize updater\r\n\t * @param {number} animdelay the length of pre-animation \r\n\t */\r\n\tinitUpdater(animdelay) {\r\n\t\tviewport.chatmsg.preanimdelay = parseInt(animdelay);\r\n\t\tviewport.updater = setTimeout(() => viewport.updateText(), UPDATE_INTERVAL);\r\n\t}\r\n\r\n\t/**\r\n\t * Intialize testimony updater \r\n\t */\r\n\tinitTestimonyUpdater() {\r\n\t\tif (client.testimonyID > 0) {\r\n\t\t\tlet testimony = \"\";\r\n\t\t\tif (client.testimonyID == 1) {\r\n\t\t\t\ttestimony = \"witnesstestimony\";\r\n\t\t\t} else if (client.testimonyID == 2) {\r\n\t\t\t\ttestimony = \"crossexamination\";\r\n\t\t\t}\r\n\t\t\t(new Audio(client.resources[testimony][\"sfx\"])).play();\r\n\t\t\tthis.testimonyTimer = 0;\r\n\t\t\tconst testimonyOverlay = document.getElementById(\"client_testimony\");\r\n\t\t\ttestimonyOverlay.src = client.resources[testimony][\"src\"];\r\n\t\t\ttestimonyOverlay.style.display = \"\";\r\n\t\t\tthis.testimonyUpdater = setTimeout(() => this.updateTestimony(), UPDATE_INTERVAL);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Gets animation length.\r\n\t * @param {string} filename the animation file name\r\n\t * @param {function} callback the callback function\r\n\t * @param {object} param \r\n\t */\r\n\tgetAnimLength(filename, callback, param) {\r\n\t\tconst request = new XMLHttpRequest();\r\n\t\trequest.open(\"GET\", filename, true);\r\n\t\trequest.responseType = \"arraybuffer\";\r\n\t\trequest.addEventListener(\"load\", function () {\r\n\t\t\tconst gifInfo = gify.getInfo(request.response);\r\n\t\t\tconsole.log(gifInfo[\"duration\"]);\r\n\t\t\t// Return animation length\r\n\t\t\tcallback(gifInfo[\"duration\"], param);\r\n\t\t});\r\n\t\trequest.send();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the testimony overaly\r\n\t */\r\n\tupdateTestimony() {\r\n\t\t//Update timer\r\n\t\tthis.testimonyTimer = this.testimonyTimer + UPDATE_INTERVAL;\r\n\r\n\t\tif (client.testimonyID == 1) {\r\n\t\t\t//Witness Testimony\r\n\t\t\tif (this.testimonyTimer >= client.resources[\"witnesstestimony\"][\"duration\"]) {\r\n\t\t\t\t//Finish\r\n\t\t\t\tthis.disposeTestimony();\r\n\t\t\t} else {\r\n\t\t\t\tthis.testimonyUpdater = setTimeout(() => this.updateTestimony(), UPDATE_INTERVAL);\r\n\t\t\t}\r\n\t\t} else if (client.testimonyID == 2) {\r\n\t\t\t//Cross Examination\r\n\t\t\tif (this.testimonyTimer >= client.resources[\"crossexamination\"][\"duration\"]) {\r\n\t\t\t\t//Finish\r\n\t\t\t\tthis.disposeTestimony();\r\n\t\t\t} else {\r\n\t\t\t\tthis.testimonyUpdater = setTimeout(() => this.updateTestimony(), UPDATE_INTERVAL);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.disposeTestimony();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Dispose the testimony overlay\r\n\t */\r\n\tdisposeTestimony() {\r\n\t\tclient.testimonyID = 0;\r\n\t\tthis.testimonyTimer = 0;\r\n\t\tdocument.getElementById(\"client_testimony\").style.display = \"none\";\r\n\t\tclearTimeout(this.testimonyUpdater);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the chatbox based on the given text.\r\n\t * \r\n\t * XXX: This relies on a global variable `this.chatmsg`!\r\n\t */\r\n\tupdateText() {\r\n\t\tconst nameBox = document.getElementById(\"client_name\");\r\n\t\tconst chatBox = document.getElementById(\"client_chat\");\r\n\t\tconst charSprite = document.getElementById(\"client_char\");\r\n\t\tconst eviBox = document.getElementById(\"client_evi\");\r\n\t\tconst background = document.getElementById(\"client_background\");\r\n\t\tconst shoutSprite = document.getElementById(\"client_shout\");\r\n\t\tconst chatBoxInner = document.getElementById(\"client_inner_chat\");\r\n\r\n\t\t// Flip the character\r\n\t\tif (this.chatmsg.flip == 1) {\r\n\t\t\tcharSprite.style.transform = \"scaleX(-1)\";\r\n\t\t} else {\r\n\t\t\tcharSprite.style.transform = \"scaleX(1)\";\r\n\t\t}\r\n\r\n\t\tif (this._animating) {\r\n\t\t\tthis.updater = setTimeout(() => this.updateText(), UPDATE_INTERVAL);\r\n\t\t}\r\n\r\n\t\tif (this.chatmsg.isnew) {\r\n\t\t\t// Reset screen background\r\n\t\t\tbackground.style.backgroundColor = \"transparent\";\r\n\t\t\t// Hide message and evidence window\r\n\t\t\tnameBox.style.display = \"none\";\r\n\t\t\tchatBox.style.display = \"none\";\r\n\t\t\teviBox.style.opacity = \"0\";\r\n\t\t\teviBox.style.height = \"0%\";\r\n\t\t\tconst shouts = {\r\n\t\t\t\t\"1\": \"holdit\",\r\n\t\t\t\t\"2\": \"objection\",\r\n\t\t\t\t\"3\": \"takethat\"\r\n\t\t\t};\r\n\r\n\t\t\tlet shout = shouts[this.chatmsg.objection];\r\n\t\t\tif (typeof shout !== \"undefined\") {\r\n\t\t\t\tshoutSprite.src = client.resources[shout][\"src\"];\r\n\t\t\t\t(new Audio(`${AO_HOST}characters/${this.chatmsg.name.toLowerCase()}/${shout}.wav`)).play();\r\n\t\t\t\tthis.shoutTimer = 850;\r\n\t\t\t} else {\r\n\t\t\t\tthis.shoutTimer = 0;\r\n\t\t\t}\r\n\r\n\t\t\tthis.chatmsg.isnew = false;\r\n\t\t\tthis.chatmsg.startpreanim = true;\r\n\t\t}\r\n\r\n\t\tif (this.textTimer >= this.shoutTimer && this.chatmsg.startpreanim) {\r\n\t\t\t// Effect stuff\r\n\t\t\tif (this.chatmsg.flash == 2) {\r\n\t\t\t\t//Shake screen\r\n\t\t\t\tthis.sfxaudio.pause();\r\n\t\t\t\tthis.sfxplayed = 1;\r\n\t\t\t\tthis.sfxaudio.src = AO_HOST + \"sounds/general/sfx-stab.wav\";\r\n\t\t\t\tthis.sfxaudio.play();\r\n\t\t\t\t$(\"#client_gamewindow\").effect(\"shake\", {\r\n\t\t\t\t\t\"direction\": \"up\"\r\n\t\t\t\t});\r\n\t\t\t} else if (this.chatmsg.flash == 1) {\r\n\t\t\t\t//Flash screen\r\n\t\t\t\tbackground.style.backgroundColor = \"white\";\r\n\t\t\t\tthis.sfxaudio.pause();\r\n\t\t\t\tthis.sfxplayed = 1;\r\n\t\t\t\tthis.sfxaudio.src = AO_HOST + \"sounds/general/sfx-realization.wav\";\r\n\t\t\t\tthis.sfxaudio.play();\r\n\t\t\t\t$(\"#client_gamewindow\").effect(\"pulsate\");\r\n\t\t\t}\r\n\r\n\t\t\t//Pre-animation stuff\r\n\t\t\tif (this.chatmsg.preanimdelay > 0) {\r\n\t\t\t\tshoutSprite.src = \"misc/placeholder.gif\";\r\n\t\t\t\tchangeBackground(this.chatmsg.side);\r\n\t\t\t\tcharSprite.src = AO_HOST + \"characters/\" + escape(this.chatmsg.name.toLowerCase()) + \"/\" + this.chatmsg.preanim.toLowerCase() + \".gif\";\r\n\t\t\t}\r\n\t\t\tthis.chatmsg.startpreanim = false;\r\n\t\t\tthis.chatmsg.startspeaking = true;\r\n\t\t} else if (this.textTimer >= this.shoutTimer + this.chatmsg.preanimdelay && !this.chatmsg.startpreanim) {\r\n\t\t\tif (this.chatmsg.startspeaking) {\r\n\t\t\t\tif (this.chatmsg.evidence > 0) {\r\n\t\t\t\t\t// Prepare evidence\r\n\t\t\t\t\teviBox.style.backgroundImage = \"url('\" + client.evidences[this.chatmsg.evidence - 1].icon + \"')\";\r\n\r\n\t\t\t\t\tif (this.chatmsg.side == \"def\") {\r\n\t\t\t\t\t\t// Only def show evidence on right\r\n\t\t\t\t\t\teviBox.style.right = \"1.5em\";\r\n\t\t\t\t\t\teviBox.style.left = \"initial\";\r\n\t\t\t\t\t\t$(\"#client_evi\").animate({\r\n\t\t\t\t\t\t\theight: \"30%\",\r\n\t\t\t\t\t\t\topacity: 1\r\n\t\t\t\t\t\t}, 250);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\teviBox.style.right = \"initial\";\r\n\t\t\t\t\t\teviBox.style.left = \"1.5em\";\r\n\t\t\t\t\t\t$(\"#client_evi\").animate({\r\n\t\t\t\t\t\t\theight: \"30%\",\r\n\t\t\t\t\t\t\topacity: 1\r\n\t\t\t\t\t\t}, 250);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnameBox.style.display = \"block\";\r\n\t\t\t\tnameBox.style.fontSize = (nameBox.offsetHeight * 0.7) + \"px\";\r\n\r\n\t\t\t\twhile (nameBox.hasChildNodes()) {\r\n\t\t\t\t\tnameBox.removeChild(nameBox.firstChild);\r\n\t\t\t\t}\r\n\t\t\t\tnameBox.appendChild(document.createTextNode(this.chatmsg.nameplate));\r\n\r\n\t\t\t\tchatBox.style.display = \"block\";\r\n\t\t\t\tchatBox.style.fontSize = (chatBox.offsetHeight * 0.25) + \"px\";\r\n\r\n\t\t\t\tconst colors = {\r\n\t\t\t\t\t\"0\": \"#ffffff\",\r\n\t\t\t\t\t\"1\": \"#00ff00\",\r\n\t\t\t\t\t\"2\": \"#ff0000\",\r\n\t\t\t\t\t\"3\": \"#ffaa00\",\r\n\t\t\t\t\t\"4\": \"#0000ff\",\r\n\t\t\t\t\t\"5\": \"#ffff00\",\r\n\t\t\t\t\t\"6\": \"#aa00aa\"\r\n\t\t\t\t};\r\n\t\t\t\tchatBoxInner.style.color = colors[this.chatmsg.color] || \"#ffffff\";\r\n\t\t\t\tthis.chatmsg.startspeaking = false;\r\n\r\n\t\t\t\tif (this.chatmsg.preanimdelay == 0) {\r\n\t\t\t\t\tshoutSprite.src = \"misc/placeholder.gif\";\r\n\t\t\t\t\tchangeBackground(this.chatmsg.side);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcharSprite.src = AO_HOST + \"characters/\" + escape(this.chatmsg.name.toLowerCase()) + \"/\" + this.chatmsg.speaking.toLowerCase() + \".gif\";\r\n\r\n\t\t\t\tif (this.textnow == this.chatmsg.content) {\r\n\t\t\t\t\tcharSprite.src = AO_HOST + \"characters/\" + escape(this.chatmsg.name.toLowerCase()) + \"/\" + this.chatmsg.silent.toLowerCase() + \".gif\";\r\n\t\t\t\t\tthis._animating = false;\r\n\t\t\t\t\tclearTimeout(this.updater);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (this.textnow != this.chatmsg.content) {\r\n\t\t\t\t\tif (this.chatmsg.content.charAt(this.textnow.length) != \" \") {\r\n\t\t\t\t\t\tthis.blipChannels[this.currentBlipChannel].play();\r\n\t\t\t\t\t\tthis.currentBlipChannel++;\r\n\t\t\t\t\t\tthis.currentBlipChannel %= this.blipChannels.length;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.textnow = this.chatmsg.content.substring(0, this.textnow.length + 1);\r\n\r\n\t\t\t\t\twhile (chatBoxInner.hasChildNodes()) {\r\n\t\t\t\t\t\tchatBoxInner.removeChild(chatBoxInner.firstChild);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchatBoxInner.appendChild(document.createTextNode(this.textnow));\r\n\r\n\t\t\t\t\tif (this.textnow == this.chatmsg.content) {\r\n\t\t\t\t\t\tthis.textTimer = 0;\r\n\t\t\t\t\t\tthis._animating = false;\r\n\t\t\t\t\t\tcharSprite.src = AO_HOST + \"characters/\" + escape(this.chatmsg.name.toLowerCase()) + \"/\" + this.chatmsg.silent.toLowerCase() + \".gif\";\r\n\t\t\t\t\t\tclearTimeout(this.updater);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!this.sfxplayed && this.chatmsg.snddelay + this.shoutTimer >= this.textTimer) {\r\n\t\t\tthis.sfxaudio.pause();\r\n\t\t\tthis.sfxplayed = 1;\r\n\t\t\tif (this.chatmsg.sound != \"0\" && this.chatmsg.sound != \"1\") {\r\n\t\t\t\tthis.sfxaudio.src = AO_HOST + \"sounds/general/\" + escape(this.chatmsg.sound.toLowerCase()) + \".wav\";\r\n\t\t\t\tthis.sfxaudio.play();\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.textTimer = this.textTimer + UPDATE_INTERVAL;\r\n\t}\r\n}\r\n\r\nclass INI {\r\n\tstatic parse(data) {\r\n\t\tlet regex = {\r\n\t\t\tsection: /^\\s*\\[\\s*([^\\]]*)\\s*\\]\\s*$/,\r\n\t\t\tparam: /^\\s*([\\w.\\-_]+)\\s*=\\s*(.*?)\\s*$/,\r\n\t\t\tcomment: /^\\s*;.*$/\r\n\t\t};\r\n\t\tlet value = {};\r\n\t\tlet lines = data.split(/\\r\\n|\\r|\\n/);\r\n\t\tlet section = null;\r\n\t\tlines.forEach(function (line) {\r\n\t\t\tif (regex.comment.test(line)) {\r\n\t\t\t\treturn;\r\n\t\t\t} else if (line.length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t} else if (regex.param.test(line)) {\r\n\t\t\t\tlet match = line.match(regex.param);\r\n\t\t\t\tif (section) {\r\n\t\t\t\t\tvalue[section][match[1]] = match[2];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvalue[match[1]] = match[2];\r\n\t\t\t\t}\r\n\t\t\t} else if (regex.section.test(line)) {\r\n\t\t\t\tlet match = line.match(regex.section);\r\n\t\t\t\tvalue[match[1]] = {};\r\n\t\t\t\tsection = match[1];\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when the Return key is pressed on the out-of-character chat input box.\r\n * @param {KeyboardEvent} event\r\n */\r\nexport function onOOCEnter(event) {\r\n\tif (event.keyCode == 13) {\r\n\t\tclient.sendOOC(document.getElementById(\"client_oocinputbox\").value);\r\n\t\tdocument.getElementById(\"client_oocinputbox\").value = \"\";\r\n\t}\r\n}\r\nwindow.onOOCEnter = onOOCEnter;\r\n\r\n/**\r\n * Triggered when the Return key is pressed on the in-character chat input box.\r\n * @param {KeyboardEvent} event\r\n */\r\nexport function onEnter(event) {\r\n\tif (event.keyCode == 13) {\r\n\t\tlet mychar = client.me();\r\n\t\tlet myemo = client.myEmote();\r\n\t\tlet myevi = client.myEvidence();\r\n\t\tlet myflip = ((client.flip) ? 1 : 0);\r\n\t\tlet mycolor = document.getElementById(\"textcolor\").value;\r\n\t\tlet ssfxname = \"0\";\r\n\t\tlet ssfxdelay = \"0\";\r\n\t\tif (document.getElementById(\"sendsfx\").checked) {\r\n\t\t\tssfxname = myemo.sfx;\r\n\t\t\tssfxdelay = myemo.sfxdelay;\r\n\t\t}\r\n\t\tclient.sendIC(myemo.speaking, mychar.name, myemo.silent, document.getElementById(\"client_inputbox\").value, mychar.side, ssfxname, myemo.zoom, ssfxdelay, selectedShout, myevi, myflip, selectedEffect, mycolor);\r\n\t}\r\n}\r\nwindow.onEnter = onEnter;\r\n\r\n/**\r\n * Resets the IC parameters for the player to enter a new chat message.\r\n * This should only be called when the player's previous chat message\r\n * was successfully sent/presented.\r\n */\r\nfunction resetICParams() {\r\n\tdocument.getElementById(\"client_inputbox\").value = \"\";\r\n\tif (selectedEffect) {\r\n\t\tdocument.getElementById(\"button_effect_\" + selectedEffect).className = \"client_button\";\r\n\t\tselectedEffect = 0;\r\n\t}\r\n\tif (selectedShout) {\r\n\t\tdocument.getElementById(\"button_\" + selectedShout).className = \"client_button\";\r\n\t\tselectedShout = 0;\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when an item on the music list is clicked.\r\n * @param {MouseEvent} event\r\n */\r\nexport function musiclist_click(event) {\r\n\tconst playtrack = document.getElementById(\"client_musiclist\").value;\r\n\tclient.sendMusicChange(playtrack);\r\n}\r\nwindow.musiclist_click = musiclist_click;\r\n\r\n/**\r\n * Triggered when an item on the area list is clicked.\r\n * @param {MouseEvent} event\r\n */\r\nexport function area_click(el) {\r\n\tconst area = el.textContent;\r\n\tclient.sendMusicChange(area);\r\n\r\n\tconst areaHr = document.createElement(\"div\");\r\n\tareaHr.className = \"hrtext\";\r\n\tareaHr.textContent = `switched to ${el.textContent}`;\r\n\tdocument.getElementById(\"client_log\").appendChild(areaHr);\r\n}\r\nwindow.area_click = area_click;\r\n\r\n/**\r\n * Triggered by the music volume slider.\r\n */\r\nexport function changeMusicVolume() {\r\n\tviewport.music.volume = document.getElementById(\"client_mvolume\").value / 100;\r\n}\r\nwindow.changeMusicVolume = changeMusicVolume;\r\n\r\n/**\r\n * Triggered by the sound effect volume slider.\r\n */\r\nexport function changeSFXVolume() {\r\n\tviewport.sfxaudio.volume = document.getElementById(\"client_svolume\").value / 100;\r\n}\r\nwindow.changeSFXVolume = changeSFXVolume;\r\n\r\n/**\r\n * Triggered by the blip volume slider.\r\n */\r\nexport function changeBlipVolume() {\r\n\tviewport.setBlipVolume(document.getElementById(\"client_bvolume\").value / 100);\r\n}\r\nwindow.changeBlipVolume = changeBlipVolume;\r\n\r\n/**\r\n * Triggered when a character icon is clicked in the character selection menu.\r\n * @param {MouseEvent} event\r\n */\r\nexport function changeCharacter(event) {\r\n\tclient.sendLeaveRoom();\r\n\tdocument.getElementById(\"client_charselect\").style.display = \"block\";\r\n\tdocument.getElementById(\"client_emo\").innerHTML = \"\";\r\n}\r\nwindow.changeCharacter = changeCharacter;\r\n\r\n/**\r\n * Triggered when there was an error loading a character sprite.\r\n * @param {HTMLImageElement} image the element containing the missing image\r\n */\r\nexport function imgError(image) {\r\n\timage.onerror = \"\";\r\n\timage.src = \"misc/placeholder.gif\";\r\n\treturn true;\r\n}\r\nwindow.imgError = imgError;\r\n\r\n/**\r\n * Triggered when there was an error loading a character icon.\r\n * @param {HTMLImageElement} image the element containing the missing image\r\n */\r\nexport function demoError(image) {\r\n\timage.onerror = \"\";\r\n\timage.src = \"/misc/placeholder.png\";\r\n\treturn true;\r\n}\r\nwindow.demoError = demoError;\r\n\r\n/**\r\n * Checks if a file exists at the specified URI.\r\n * @param {string} url the URI to be checked\r\n * @param {function} callback the function to be called when finished\r\n * @param {object} param \r\n */\r\nfunction fileExists(url, callback, param) {\r\n\tconst xhttp = new XMLHttpRequest();\r\n\txhttp.onreadystatechange = function () {\r\n\t\tif (this.readyState == 4 && this.status == 200) {\r\n\t\t\tcallback(true, param, url);\r\n\t\t} else {\r\n\t\t\tcallback(false, param, url);\r\n\t\t}\r\n\t};\r\n\txhttp.open(\"GET\", url, true);\r\n\txhttp.send();\r\n}\r\n\r\n/**\r\n * Changes the viewport background based on a given position.\r\n * \r\n * Valid positions: `def, pro, hld, hlp, wit, jud`\r\n * @param {string} position the position to change into\r\n */\r\nfunction changeBackground(position) {\r\n\tlet standname;\r\n\tconst bgfolder = viewport.bgFolder();\r\n\tdocument.getElementById(\"client_fg\").style.display = \"none\";\r\n\tdocument.getElementById(\"client_bench\").style.display = \"none\";\r\n\tswitch (position) {\r\n\tcase \"def\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"defenseempty.png\";\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"block\";\r\n\t\tfileExists(bgfolder + \"defensedesk.png\", callbackChangeBackground, position);\r\n\t\tstandname = \"defense\";\r\n\t\tbreak;\r\n\tcase \"pro\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"prosecutorempty.png\";\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"block\";\r\n\t\tfileExists(bgfolder + \"defensedesk.png\", callbackChangeBackground, position);\r\n\t\tstandname = \"prosecution\";\r\n\t\tbreak;\r\n\tcase \"hld\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"helperstand.png\";\r\n\t\tstandname = \"defense\";\r\n\t\tbreak;\r\n\tcase \"hlp\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"prohelperstand.png\";\r\n\t\tstandname = \"prosecution\";\r\n\t\tbreak;\r\n\tcase \"wit\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"witnessempty.png\";\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"block\";\r\n\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"estrado.png\";\r\n\t\tstandname = \"prosecution\";\r\n\t\tbreak;\r\n\tcase \"jud\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"judgestand.png\";\r\n\t\tstandname = \"prosecution\";\r\n\t\tbreak;\r\n\t}\r\n\tif (viewport.chatmsg.type == 5) {\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_court\").src = AO_HOST + \"themes/default/\" + standname + \"_speedlines.gif\";\r\n\t}\r\n}\r\n\r\n/**\r\n * Callback for desk resource\r\n * \r\n * Valid positions: `def, pro, hld, hlp, wit, jud`\r\n * @param {boolean} result the image is existed or not\r\n * @param {string} position the position to change into\r\n */\r\nfunction callbackChangeBackground(result, position) {\r\n\tlet bgfolder = viewport.bgFolder();\r\n\tif (position == \"def\") {\r\n\t\tif (result) {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"defensedesk.png\";\r\n\t\t} else {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"bancodefensa.png\";\r\n\t\t}\r\n\t} else {\r\n\t\tif (result) {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"prosecutiondesk.png\";\r\n\t\t} else {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"bancoacusacion.png\";\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when the reconnect button is pushed.\r\n */\r\nexport function ReconnectButton() {\r\n\tclient.cleanup();\r\n\tclient = new Client(serverIP);\r\n\tif (client) {\r\n\t\tmode = \"join\"; // HACK: see client.onOpen\r\n\t\tdocument.getElementById(\"client_error\").style.display = \"none\";\r\n\t}\r\n}\r\nwindow.ReconnectButton = ReconnectButton;\r\n\r\n/**\r\n * Triggered when the retry button is pushed (during the loading process).\r\n */\r\nexport function RetryButton() {\r\n\tclient.joinServer();\r\n}\r\nwindow.RetryButton = RetryButton;\r\n\r\n/**\r\n * Appends a message to the in-character chat log.\r\n * @param {string} toadd the string to be added\r\n * @param {string} name the name of the sender\r\n */\r\nfunction appendICLog(toadd, name = \"\", time = new Date()) {\r\n\tconst entry = document.createElement(\"p\");\r\n\tconst nameField = document.createElement(\"span\");\r\n\tnameField.id = \"iclog_name\";\r\n\tnameField.appendChild(document.createTextNode(name));\r\n\tentry.appendChild(nameField);\r\n\tentry.appendChild(document.createTextNode(toadd));\r\n\r\n\t// Only put a timestamp if the minute has changed.\r\n\tif (lastICMessageTime.getMinutes() !== time.getMinutes()) {\r\n\t\tconst timeStamp = document.createElement(\"span\");\r\n\t\ttimeStamp.id = \"iclog_time\";\r\n\t\ttimeStamp.innerText = time.toLocaleTimeString(undefined, {\r\n\t\t\thour: \"numeric\",\r\n\t\t\tminute: \"2-digit\"\r\n\t\t});\r\n\t\tentry.appendChild(timeStamp);\r\n\t}\r\n\r\n\tconst clientLog = document.getElementById(\"client_log\");\r\n\tclientLog.appendChild(entry);\r\n\r\n\tif (clientLog.scrollTop > clientLog.scrollHeight - 800) {\r\n\t\tclientLog.scrollTop = clientLog.scrollHeight;\r\n\t}\r\n\r\n\tlastICMessageTime = new Date();\r\n}\r\n\r\n/**\r\n * Requests to play as a character.\r\n * @param {number} ccharacter the character ID; if this is a large number, then spectator is chosen instead.\r\n */\r\nexport function pickChar(ccharacter) {\r\n\tif (ccharacter < 1000) {\r\n\t\tclient.sendCharacter(ccharacter);\r\n\t} else {\r\n\t\t// Spectator\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_inputbox\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_emo\").style.display = \"none\";\r\n\t}\r\n}\r\nwindow.pickChar = pickChar;\r\n\r\n/**\r\n * Highlights and selects an emotion for in-character chat.\r\n * @param {string} emo the new emotion to be selected\r\n */\r\nexport function pickEmotion(emo) {\r\n\tif (client.selectedEmote != -1) {\r\n\t\tdocument.getElementById(\"emo_\" + client.selectedEmote).src = client.myEmote().button_off;\r\n\t}\r\n\tclient.selectedEmote = emo;\r\n\tdocument.getElementById(\"emo_\" + emo).src = client.myEmote().button_on;\r\n}\r\nwindow.pickEmotion = pickEmotion;\r\n\r\n/**\r\n * Highlights and selects an evidence for in-character chat.\r\n * @param {string} evidence the evidence to be presented\r\n */\r\nexport function pickEvidence(evidence) {\r\n\tif (client.selectedEvidence !== evidence) {\r\n\t\t//Update selected evidence\t\t\r\n\t\tif (client.selectedEvidence > 0) {\r\n\t\t\tdocument.getElementById(\"evi_\" + client.selectedEvidence).className = \"client_button\";\r\n\t\t}\r\n\t\tdocument.getElementById(\"evi_\" + evidence).className = \"client_button dark\";\r\n\t\tclient.selectedEvidence = evidence;\r\n\r\n\t\t// Show evidence on information window\r\n\t\tdocument.getElementById(\"evi_name\").value = client.evidences[evidence - 1].name;\r\n\t\tdocument.getElementById(\"evi_desc\").value = client.evidences[evidence - 1].desc;\r\n\r\n\t\t//Update Icon\r\n\t\tlet icon_id = getIndexFromSelect(\"evi_select\", client.evidences[evidence - 1].filename);\r\n\t\tdocument.getElementById(\"evi_select\").selectedIndex = icon_id;\r\n\t\tif (icon_id == 0) {\r\n\t\t\tdocument.getElementById(\"evi_filename\").value = client.evidences[evidence - 1].filename;\r\n\t\t}\r\n\t\tupdateEvidenceIcon();\r\n\r\n\t\t// Update button\r\n\t\tdocument.getElementById(\"evi_add\").className = \"client_button hover_button inactive\";\r\n\t\tdocument.getElementById(\"evi_edit\").className = \"client_button hover_button\";\r\n\t\tdocument.getElementById(\"evi_cancel\").className = \"client_button hover_button\";\r\n\t\tdocument.getElementById(\"evi_del\").className = \"client_button hover_button\";\r\n\t} else {\r\n\t\tcancelEvidence();\r\n\t}\r\n}\r\nwindow.pickEvidence = pickEvidence;\r\n\r\n/**\r\n * Add evidence.\r\n */\r\nexport function addEvidence() {\r\n\tlet evidence_select = document.getElementById(\"evi_select\");\r\n\tclient.sendPE(document.getElementById(\"evi_name\").value,\r\n\t\tdocument.getElementById(\"evi_desc\").value,\r\n\t\tevidence_select.selectedIndex == 0 ?\r\n\t\t\tdocument.getElementById(\"evi_filename\").value :\r\n\t\t\tevidence_select.options[evidence_select.selectedIndex].text\r\n\t);\r\n\tcancelEvidence();\r\n}\r\nwindow.addEvidence = addEvidence;\r\n\r\n/**\r\n * Edit selected evidence.\r\n */\r\nexport function editEvidence() {\r\n\tlet evidence_select = document.getElementById(\"evi_select\");\r\n\tlet id = parseInt(client.selectedEvidence) - 1;\r\n\tclient.sendEE(id,\r\n\t\tdocument.getElementById(\"evi_name\").value,\r\n\t\tdocument.getElementById(\"evi_desc\").value,\r\n\t\tevidence_select.selectedIndex == 0 ?\r\n\t\t\tdocument.getElementById(\"evi_filename\").value :\r\n\t\t\tevidence_select.options[evidence_select.selectedIndex].text\r\n\t);\r\n\tcancelEvidence();\r\n}\r\nwindow.editEvidence = editEvidence;\r\n\r\n/**\r\n * Delete selected evidence.\r\n */\r\nexport function deleteEvidence() {\r\n\tlet id = parseInt(client.selectedEvidence) - 1;\r\n\tclient.sendDE(id);\r\n\tcancelEvidence();\r\n}\r\nwindow.deleteEvidence = deleteEvidence;\r\n\r\n/**\r\n * Cancel evidence selection.\r\n */\r\nexport function cancelEvidence() {\r\n\t//Clear evidence data\r\n\tif (client.selectedEvidence > 0) {\r\n\t\tdocument.getElementById(\"evi_\" + client.selectedEvidence).className = \"client_button\";\r\n\t}\r\n\tclient.selectedEvidence = 0;\r\n\r\n\t// Clear evidence on information window\r\n\tdocument.getElementById(\"evi_select\").selectedIndex = 0;\r\n\tupdateEvidenceIcon(); // Update icon widget\r\n\tdocument.getElementById(\"evi_filename\").value = \"\";\r\n\tdocument.getElementById(\"evi_name\").value = \"\";\r\n\tdocument.getElementById(\"evi_desc\").value = \"\";\r\n\tdocument.getElementById(\"evi_icon\").style.backgroundImage = \"url('misc/empty.png')\"; //Clear icon\r\n\r\n\t// Update button\r\n\tdocument.getElementById(\"evi_add\").className = \"client_button hover_button\";\r\n\tdocument.getElementById(\"evi_edit\").className = \"client_button hover_button inactive\";\r\n\tdocument.getElementById(\"evi_cancel\").className = \"client_button hover_button inactive\";\r\n\tdocument.getElementById(\"evi_del\").className = \"client_button hover_button inactive\";\r\n}\r\nwindow.cancelEvidence = cancelEvidence;\r\n\r\n/**\r\n * Find index of anything in select box.\r\n * @param {string} select_box the select element name\r\n * @param {string} value the value that need to be compared\r\n */\r\nexport function getIndexFromSelect(select_box, value) {\r\n\t//Find if icon alraedy existed in select box\r\n\tconst select_element = document.getElementById(select_box);\r\n\tfor (let i = 1; i < select_element.length; ++i) {\r\n\t\tif (select_element.options[i].value == value) {\r\n\t\t\treturn i;\r\n\t\t}\r\n\t}\r\n\treturn 0;\r\n}\r\nwindow.getIndexFromSelect = getIndexFromSelect;\r\n\r\n/**\r\n * Update evidence icon.\r\n */\r\nexport function updateEvidenceIcon() {\r\n\tlet evidence_select = document.getElementById(\"evi_select\");\r\n\tlet evidence_filename = document.getElementById(\"evi_filename\");\r\n\tlet evidence_iconbox = document.getElementById(\"evi_icon\");\r\n\r\n\tif (evidence_select.selectedIndex === 0) {\r\n\t\tevidence_filename.style.display = \"initial\";\r\n\t\tevidence_iconbox.style.backgroundImage = `url(${AO_HOST}evidence/${evidence_filename.value.toLowerCase()})`;\r\n\t} else {\r\n\t\tevidence_filename.style.display = \"none\";\r\n\t\tevidence_iconbox.style.backgroundImage = `url(${AO_HOST}evidence/${evidence_select.value.toLowerCase()})`;\r\n\t}\r\n}\r\nwindow.updateEvidenceIcon = updateEvidenceIcon;\r\n\r\n/**\r\n * Update evidence icon.\r\n */\r\nexport function updateActionCommands(side) {\r\n\tif (side == \"jud\") {\r\n\t\tdocument.getElementById(\"judge_action\").style.display = \"inline-table\";\r\n\t\tdocument.getElementById(\"no_action\").style.display = \"none\";\r\n\t} else {\r\n\t\tdocument.getElementById(\"no_action\").style.display = \"inline-table\";\r\n\t\tdocument.getElementById(\"judge_action\").style.display = \"none\";\r\n\t}\r\n\t//Update role selector\r\n\tfor (let i = 0, role_select = document.getElementById(\"role_select\").options; i < role_select.length; i++) {\r\n\t\tif (side == role_select[i].value) {\r\n\t\t\trole_select.selectedIndex = i;\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\nwindow.updateActionCommands = updateActionCommands;\r\n\r\n/**\r\n * Change background via OOC.\r\n */\r\nexport function changeBackgroundOOC() {\r\n\tlet filename = \"\",\r\n\t\tbackground_select = document.getElementById(\"bg_select\"),\r\n\t\tbg_command = document.getElementById(\"bg_command\").value;\r\n\tif (background_select.selectedIndex == 0) {\r\n\t\tfilename = document.getElementById(\"bg_filename\").value;\r\n\t} else {\r\n\t\tfilename = background_select.value;\r\n\t}\r\n\tclient.sendOOC(\"/\" + bg_command.replace(\"$1\", filename));\r\n}\r\nwindow.changeBackgroundOOC = changeBackgroundOOC;\r\n\r\n/**\r\n * Change role via OOC.\r\n */\r\nexport function changeRoleOOC() {\r\n\tlet role_select = document.getElementById(\"role_select\"),\r\n\t\trole_command = document.getElementById(\"role_command\").value;\r\n\r\n\tclient.sendOOC(\"/\" + role_command.replace(\"$1\", role_select.value));\r\n\tupdateActionCommands(role_select.value);\r\n}\r\nwindow.changeRoleOOC = changeRoleOOC;\r\n\r\n/**\r\n * Random character via OOC.\r\n */\r\nexport function randomCharacterOOC() {\r\n\tclient.sendOOC(\"/\" + document.getElementById(\"randomchar_command\").value);\r\n}\r\nwindow.randomCharacterOOC = randomCharacterOOC;\r\n\r\n/**\r\n * Call mod.\r\n */\r\nexport function callMod() {\r\n\t$(\"#callmod_dialog\").dialog(\"open\");\r\n}\r\nwindow.callMod = callMod;\r\n\r\n/**\r\n * Declare witness testimony.\r\n */\r\nexport function initWT() {\r\n\tclient.sendRT(\"testimony1\");\r\n}\r\nwindow.initWT = initWT;\r\n\r\n/**\r\n * Declare cross examination.\r\n */\r\nexport function initCE() {\r\n\tclient.sendRT(\"testimony2\");\r\n}\r\nwindow.initCE = initCE;\r\n\r\n/**\r\n * Increment defense health point.\r\n */\r\nexport function addHPD() {\r\n\tclient.sendHP(1, String(parseInt(client.hp[0]) + 1));\r\n}\r\nwindow.addHPD = addHPD;\r\n\r\n/**\r\n * Decrement defense health point.\r\n */\r\nexport function redHPD() {\r\n\tclient.sendHP(1, String(parseInt(client.hp[0]) - 1));\r\n}\r\nwindow.redHPD = redHPD;\r\n\r\n/**\r\n * Increment prosecution health point.\r\n */\r\nexport function addHPP() {\r\n\tclient.sendHP(2, String(parseInt(client.hp[1]) + 1));\r\n}\r\nwindow.addHPP = addHPP;\r\n\r\n/**\r\n * Decrement prosecution health point.\r\n */\r\nexport function redHPP() {\r\n\tclient.sendHP(2, String(parseInt(client.hp[1]) - 1));\r\n}\r\nwindow.redHPP = redHPP;\r\n\r\n/**\r\n * Update background preview.\r\n */\r\nexport function updateBackgroundPreview() {\r\n\tlet background_select = document.getElementById(\"bg_select\");\r\n\tlet background_filename = document.getElementById(\"bg_filename\");\r\n\tlet background_preview = document.getElementById(\"bg_preview\");\r\n\r\n\tif (background_select.selectedIndex == 0) {\r\n\t\tbackground_filename.style.display = \"initial\";\r\n\t\tbackground_preview.src = AO_HOST + \"background/\" + background_filename.value.toLowerCase() + \"/defenseempty.png\";\r\n\t} else {\r\n\t\tbackground_filename.style.display = \"none\";\r\n\t\tbackground_preview.src = AO_HOST + \"background/\" + background_select.value.toLowerCase() + \"/defenseempty.png\";\r\n\t}\r\n}\r\nwindow.updateBackgroundPreview = updateBackgroundPreview;\r\n\r\n/**\r\n * Highlights and selects an effect for in-character chat.\r\n * If the same effect button is selected, then the effect is canceled.\r\n * @param {string} effect the new effect to be selected\r\n */\r\nexport function toggleEffect(effect) {\r\n\tif (effect == selectedEffect) {\r\n\t\tdocument.getElementById(\"button_effect_\" + effect).className = \"client_button\";\r\n\t\tselectedEffect = 0;\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_effect_\" + effect).className = \"client_button dark\";\r\n\t\tif (selectedEffect) {\r\n\t\t\tdocument.getElementById(\"button_effect_\" + selectedEffect).className = \"client_button\";\r\n\t\t}\r\n\t\tselectedEffect = effect;\r\n\t}\r\n}\r\nwindow.toggleEffect = toggleEffect;\r\n\r\n/**\r\n * Toggle flip for in-character chat.\r\n */\r\nexport function toggleFlip() {\r\n\tif (client.flip) {\r\n\t\tdocument.getElementById(\"button_flip\").className = \"client_button\";\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_flip\").className = \"client_button dark\";\r\n\t}\r\n\tclient.flip = !client.flip;\r\n}\r\nwindow.toggleFlip = toggleFlip;\r\n\r\n/**\r\n * Toggle presentable for presenting evidence in-character chat.\r\n */\r\nexport function togglePresent() {\r\n\tif (client.presentable) {\r\n\t\tdocument.getElementById(\"button_present\").className = \"client_button\";\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_present\").className = \"client_button dark\";\r\n\t}\r\n\tclient.presentable = !client.presentable;\r\n}\r\nwindow.togglePresent = togglePresent;\r\n\r\n/**\r\n * Highlights and selects a menu.\r\n * @param {string} menu the menu to be selected\r\n */\r\nexport function toggleMenu(menu) {\r\n\tif (menu != selectedMenu) {\r\n\t\tdocument.getElementById(\"menu_\" + menu).className = \"menu_icon active\";\r\n\t\tdocument.getElementById(\"content_\" + menu).className = \"menu_content active\";\r\n\t\tdocument.getElementById(\"menu_\" + selectedMenu).className = \"menu_icon\";\r\n\t\tdocument.getElementById(\"content_\" + selectedMenu).className = \"menu_content\";\r\n\t\tselectedMenu = menu;\r\n\t}\r\n}\r\nwindow.toggleMenu = toggleMenu;\r\n\r\n/**\r\n * Highlights and selects a shout for in-character chat.\r\n * If the same shout button is selected, then the shout is canceled.\r\n * @param {string} shout the new shout to be selected\r\n */\r\nexport function toggleShout(shout) {\r\n\tif (shout == selectedShout) {\r\n\t\tdocument.getElementById(\"button_\" + shout).className = \"client_button\";\r\n\t\tselectedShout = 0;\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_\" + shout).className = \"client_button dark\";\r\n\t\tif (selectedShout) {\r\n\t\t\tdocument.getElementById(\"button_\" + selectedShout).className = \"client_button\";\r\n\t\t}\r\n\t\tselectedShout = shout;\r\n\t}\r\n}\r\nwindow.toggleShout = toggleShout;\r\n\r\n/**\r\n * Escapes a string to be HTML-safe.\r\n * \r\n * XXX: This is unnecessary if we use `createTextNode` instead!\r\n * @param {string} unsafe an unsanitized string\r\n */\r\nfunction escapeHtml(unsafe) {\r\n\treturn unsafe\r\n\t\t.replace(/&/g, \"&amp;\")\r\n\t\t.replace(/</g, \"&lt;\")\r\n\t\t.replace(/>/g, \"&gt;\")\r\n\t\t.replace(/\"/g, \"&quot;\")\r\n\t\t.replace(/'/g, \"&#039;\");\r\n}\r\n\r\n/**\r\n * Escapes a string to AO1 escape codes.\r\n * @param {string} estring the string to be escaped\r\n */\r\nfunction escapeChat(estring) {\r\n\treturn estring\r\n\t\t.replace(/#/g, \"<pound>\")\r\n\t\t.replace(/&/g, \"<and>\")\r\n\t\t.replace(/%/g, \"<percent>\")\r\n\t\t.replace(/\\$/g, \"<dollar>\");\r\n}\r\n\r\n/**\r\n * Unescapes a string to AO1 escape codes.\r\n * @param {string} estring the string to be unescaped\r\n */\r\nfunction unescapeChat(estring) {\r\n\treturn estring\r\n\t\t.replace(/<pound>/g, \"#\")\r\n\t\t.replace(/<and>/g, \"&\")\r\n\t\t.replace(/<percent>/g, \"%\")\r\n\t\t.replace(/<dollar>/g, \"$\");\r\n}\r\n\r\n/**\r\n * Encode text on client side.\r\n * @param {string} estring the string to be encoded\r\n */\r\nfunction encodeChat(estring) {\r\n\tlet selectedEncoding = document.getElementById(\"client_encoding\").value;\r\n\tif (selectedEncoding == \"unicode\") {\r\n\t\t// This approach works by escaping all special characters to Unicode escape sequences.\r\n\t\t// Source: https://gist.github.com/mathiasbynens/1243213\r\n\t\treturn estring.replace(/[^\\0-~]/g, function (ch) {\r\n\t\t\treturn \"\\\\u\" + (\"000\" + ch.charCodeAt().toString(16)).slice(-4);\r\n\t\t});\r\n\t} else if (selectedEncoding == \"utf16\") {\r\n\t\t// Source: https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String\r\n\t\tconst buffer = new ArrayBuffer(estring.length * 2);\r\n\t\tconst result = new Uint16Array(buffer);\r\n\t\tfor (let i = 0, strLen = estring.length; i < strLen; i++) {\r\n\t\t\tresult[i] = estring.charCodeAt(i);\r\n\t\t}\r\n\t\treturn String(result);\r\n\t} else {\r\n\t\treturn estring;\r\n\t}\r\n}\r\nfunction hash6ode() {\r\n\treturn uid;\r\n}\r\n\r\n/**\r\n * Decodes text on client side.\r\n * @param {string} estring the string to be decoded\r\n */\r\nfunction decodeChat(estring) {\r\n\tlet selectedDecoding = document.getElementById(\"client_decoding\").value;\r\n\tif (selectedDecoding == \"unicode\") {\r\n\t\t// Source: https://stackoverflow.com/questions/7885096/how-do-i-decode-a-string-with-escaped-unicode\r\n\t\treturn estring.replace(/\\\\u([\\d\\w]{1,})/gi, function (match, group) {\r\n\t\t\treturn String.fromCharCode(parseInt(group, 16));\r\n\t\t});\r\n\t} else if (selectedDecoding == \"utf16\") {\r\n\t\t// Source: https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String\r\n\t\treturn String.fromCharCode.apply(null, new Uint16Array(estring.split(\",\")));\r\n\t} else {\r\n\t\treturn estring;\r\n\t}\r\n}\r\n\r\n/**\r\n * Decoding text on client side.\r\n * @param {string} estring the string to be decoded\r\n */\r\nfunction decodeBBCode(estring) {\r\n\treturn estring\r\n\t\t.replace(/\\\\n/g, \"<br>\") // Newline \\n\r\n\t\t.replace(/\\[(\\/?)b\\]/g, \"<$1b>\") // Bold [b][/b]\r\n\t\t.replace(/\\[(\\/?)i\\]/g, \"<$1i>\") // Italic [i][/i]\r\n\t\t.replace(/\\[(\\/?)s\\]/g, \"<$1del>\") // Strikethrough [s][/s]\r\n\t\t.replace(/\\[(\\/?)u\\]/g, \"<$1u>\") // Underline [u][/u]\r\n\t\t.replace(/\\[(\\/?)sub\\]/g, \"<$1sub>\") // Subscript [sub][/sub]\r\n\t\t.replace(/\\[(\\/?)sup\\]/g, \"<$1sup>\") // Superscript [sup][/sup]\r\n\t\t.replace(/\\[m=([#a-zA-Z0-9]+)\\]/g, \"<m a=\\\"$1\\\">\") // Markup [m=#0ff]\r\n\t\t.replace(/\\[(\\/?)m\\]/g, \"<$1m>\") // [m][/m]\r\n\t\t.replace(/\\[c=?([#a-zA-Z0-9]+)\\]/g, \"<c a=\\\"$1\\\">\") // Color [c=red]\r\n\t\t.replace(/\\[\\/c\\]/g, \"</c>\"); // [/c]\r\n}\r\n\r\n\r\n// TODO: Possibly safe to remove, since we are using a transpiler.\r\nif (typeof (String.prototype.trim) === \"undefined\") {\r\n\tString.prototype.trim = function () {\r\n\t\treturn String(this).replace(/^\\s+|\\s+$/g, \"\");\r\n\t};\r\n}\r\n\r\n// Used for HDID calculation.\r\nfunction hashCode() {\r\n\tlet hash = 0;\r\n\tlet hashString = navigator.userAgent;\r\n\tif (hashString.length === 0) return hash;\r\n\tfor (let i = 0; i < hashString.length; i++) {\r\n\t\tconst chr = hashString.charCodeAt(i);\r\n\t\thash = ((hash << 5) - hash) + chr;\r\n\t\thash |= 0; // Convert to 32bit integer\r\n\t}\r\n\treturn hash;\r\n};\r\n\r\n\r\n//\r\n// Client code\r\n//\r\n\r\nlet client = new Client(serverIP);\r\nlet viewport = new Viewport();\r\n\r\n$(document).ready(function () {\r\n\tclient.initialObservBBCode();\r\n\tclient.loadResources();\r\n});\r\n\r\n// Create dialog and link to button\t\r\n$(function () {\r\n\t$(\"#callmod_dialog\").dialog({\r\n\t\tautoOpen: false,\r\n\t\tresizable: false,\r\n\t\tshow: {\r\n\t\t\teffect: \"drop\",\r\n\t\t\tdirection: \"down\",\r\n\t\t\tduration: 500\r\n\t\t},\r\n\t\thide: {\r\n\t\t\teffect: \"drop\",\r\n\t\t\tdirection: \"down\",\r\n\t\t\tduration: 500\r\n\t\t},\r\n\t\theight: \"auto\",\r\n\t\twidth: 400,\r\n\t\tmodal: true,\r\n\t\tbuttons: {\r\n\t\t\tSure: function () {\r\n\t\t\t\tvar reason = prompt(\"Please enter the reason\", \"\");\r\n\t\t\t\tclient.sendZZ(reason);\r\n\t\t\t\t$(this).dialog(\"close\");\r\n\t\t\t},\r\n\t\t\tCancel: function () {\r\n\t\t\t\t$(this).dialog(\"close\");\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n});"],"sourceRoot":""} \ No newline at end of file
diff --git a/webAO/client.css b/webAO/client.css
index dce841e..29ff3cd 100644
--- a/webAO/client.css
+++ b/webAO/client.css
@@ -1,13 +1,13 @@
-body {
- font-family: "Ace Attorney","メイリオ",Meiryo,Hiragino Kaku Gothic Pro,"ヒラギノ角ゴ Pro W3",Osaka,"MS Gothic","MS Pゴシック",Tahoma,Sans;
+body {
+ font-family: "Ace Attorney", "メイリオ", Meiryo, Hiragino Kaku Gothic Pro, "ヒラギノ角ゴ Pro W3", Osaka, "MS Gothic", "MS Pゴシック", Tahoma, Sans;
}
img {
image-rendering: -moz-crisp-edges;
- image-rendering: -o-crisp-edges;
- image-rendering: -webkit-optimize-contrast;
- image-rendering: crisp-edges;
- -ms-interpolation-mode: nearest-neighbor;
+ image-rendering: -o-crisp-edges;
+ image-rendering: -webkit-optimize-contrast;
+ image-rendering: crisp-edges;
+ -ms-interpolation-mode: nearest-neighbor;
}
#about-logo {
@@ -16,20 +16,34 @@ img {
image-rendering: auto;
}
-@keyframes error_blink {
- 0% { color: white; }
- 50% { color: red; }
- 100% { color: white; }
+.lm_content :link {
+ color: #4288f2;
+}
+
+.lm_content :visited {
+ color: #a65bd4;
+}
+
+@keyframes error_blink {
+ 0% {
+ color: white;
+ }
+ 50% {
+ color: red;
+ }
+ 100% {
+ color: white;
+ }
}
.error {
position: absolute;
width: 50vw;
height: 25vh;
- top: 50%;
- left: 50%;
- margin-right: -50%;
- transform: translate(-50%, -50%);
+ top: 50%;
+ left: 50%;
+ margin-right: -50%;
+ transform: translate(-50%, -50%);
display: flex;
margin: 0 auto;
justify-content: center;
@@ -47,10 +61,10 @@ img {
position: absolute;
width: 90vw;
height: 30vh;
- top: 50%;
- left: 50%;
- margin-right: -50%;
- transform: translate(-50%, -50%);
+ top: 50%;
+ left: 50%;
+ margin-right: -50%;
+ transform: translate(-50%, -50%);
justify-content: center;
display: flex;
align-items: center;
@@ -62,10 +76,7 @@ img {
#client_gamewindow {
position: relative;
- /*! top: 0; */
- /*! left: 0; */
- /*! width: 100%; */
- padding-bottom: 75%;
+ padding-bottom: 75%;
}
#client_charselect {
@@ -84,13 +95,15 @@ img {
}
#client_chartable {
- height: 360px;
- width: 320px;
- margin: 0 auto;
- vertical-align: middle;
background: #eeeeee;
}
+#client_chartable_container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
.demothing {
height: 60px;
width: 60px;
@@ -99,19 +112,9 @@ img {
}
#client_wrapper {
- /*! position: absolute; */
- /*! top: 0; */
- /*! left: 0; */
background-color: #888888;
- /*! height: 99%; */
- /*! width: 512px; */
- /*! margin: 0; */
- /*! padding: 0; */
- /*! float: left; */
- /*! resize: horizontal; */
overflow: auto;
- overflow-y:hidden;
- /*! border: 1px solid; */
+ overflow-y: hidden;
min-width: 256px;
resize: horizontal;
}
@@ -129,11 +132,7 @@ img {
}
#client_settings {
- /*! position: absolute; */
- /*! top: 100%; */
width: 100%;
- /*! grid-column: 1; */
- /*! grid-row: 2; */
}
.area_btn {
@@ -159,9 +158,9 @@ img {
#client_bench {
display: none;
position: absolute;
- height: 100%;
+ height: auto;
width: 100%;
- top: 0;
+ bottom: 0;
left: 0;
}
@@ -174,11 +173,37 @@ img {
left: 0;
}
+#client_evi {
+ opacity: 0;
+ position: absolute;
+ background-repeat: no-repeat;
+ background-size: contain;
+ height: 0%;
+ width: auto;
+ top: 1.5em;
+}
+
+#client_shout {
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+}
+
+#client_background {
+ position: absolute;
+ background-color: transparent;
+ width: 100%;
+ height: auto;
+ padding-bottom: 75%;
+}
+
#client_name {
display: none;
height: 7%;
- border: 1px solid rgba(255,255,255,0.7);
- background:rgba(73,0,254,0.5);
+ border: 1px solid rgba(255, 255, 255, 0.7);
+ background: rgba(73, 0, 254, 0.5);
top: 63%;
border-radius: 3px;
position: absolute;
@@ -194,13 +219,14 @@ img {
}
#client_chat {
+ font-size: 1em;
display: none;
- width: 98%; /* fallback if needed */
- width: calc(100% - 4px);
+ width: 98%;
+ width: calc(100% - 4px);
margin: auto;
height: 30%;
- border: 2px solid rgba(255,255,255,0.7);
- background-color: rgba(0,0,0,0.5);
+ border: 2px solid rgba(255, 255, 255, 0.7);
+ background-color: rgba(0, 0, 0, 0.5);
top: 70%;
border-radius: 4px;
position: absolute;
@@ -216,6 +242,7 @@ img {
margin: 4px;
color: white;
}
+
.long {
width: 100%;
background-color: #dddddd;
@@ -226,40 +253,26 @@ img {
}
#client_chatlog {
- /*! width: 244px; */
- /*! height: 100%; */
- /*! background: #dbdbdb url("misc/chat2.png") no-repeat; */
- /*! padding: 0; */
- /*! position: absolute; */
top: 0;
right: 0;
- /* grid-column: 2; */
flex: 1;
}
#client_log {
position: relative;
- /* top: 3px; */
- /*! left: 10px; */
height: 100%;
- /*! width: 99%; */
color: white;
word-break: keep-all;
- word-wrap:break-word;
+ word-wrap: break-word;
overflow-wrap: break-word;
overflow-y: scroll;
font-size: medium;
- /* margin-bottom: 10px; */
background-color: #242424;
- border: black;
- border-style: solid;
- /* max-width: 50em; */
- /* min-height: 30em; */
text-align: start;
line-height: .85em;
}
-#client_log > p {
+#client_log>p {
line-height: 1.1em;
}
@@ -275,9 +288,6 @@ img {
}
#client_ooclog {
- /*! width: 99%; */
- /* margin-top: 25px; */
- /* height: 50%; */
position: relative;
background-color: #242424;
color: white;
@@ -293,19 +303,53 @@ img {
#client_musiclist {
width: 99%;
- /* margin-top: 20px; */
- /*! height: 50%; */
background-color: #222;
color: white;
}
#client_bars {
position: relative;
- /*! margin-bottom: 30px; */
text-align: center;
- /* display: flex; */
- /* flex-direction: row; */
- height: 20px;
+ display: flex;
+ display: -webkit-flex;
+}
+
+#client_testimony {
+ display: block;
+ position: absolute;
+ width: 100%;
+ height: auto;
+}
+
+#evi_icon {
+ background-image: url('misc/empty.png');
+ background-repeat: no-repeat;
+ background-size: contain;
+}
+
+#evi_options {
+ display: inline-block;
+ padding-left: 5px;
+}
+
+#evi_options label {
+ display: inline-block;
+ width: 3em;
+}
+
+#evi_desc {
+ flex: 1 auto;
+}
+
+#bg_preview {
+ max-width: 150px;
+ max-height: 112px;
+ width: 100%;
+ height: 100%;
+ border-style: double;
+ border-radius: 7px;
+ border-color: white;
+ border-width: 3px;
}
.slider {
@@ -316,19 +360,65 @@ img {
margin-right: auto;
}
-.client_defense {
- /* position: absolute; */
- /* left: 30px; */
- width: 90px;
+#client_defense_hp {
+ text-align: left;
+}
+
+#client_defense_hp>.health-bar {
+ background-color: #169de0;
+}
+
+#client_prosecutor_hp {
+ text-align: right;
+}
+
+#client_prosecutor_hp>.health-bar {
+ background-color: #e01f5f;
+}
+
+.health-box {
+ background-color: #555;
height: 20px;
+ width: 50%;
+ margin: 0 auto;
+ border: solid 2px #aaa;
+ border-radius: 5px;
+ box-sizing: border-box;
+ display: block;
}
-.client_prosecutor {
- /* left: 130px; */
+.health-bar {
+ width: 100%;
+ height: 100%;
+ border-radius: 3px;
+ bottom: 0;
+ position: relative;
+ display: inline-block;
}
.client_button {
padding: 1px;
+ cursor: pointer;
+}
+
+.client_button.hover_button.inactive {
+ display: none;
+}
+
+.client_button.hover_button:hover {
+ margin: -2px;
+ border-radius: 5px;
+ border-style: dashed;
+ border-width: 2px;
+ border-color: #FFD081;
+}
+
+.client_button.hover_button:hover {
+ margin: -2px;
+ border-radius: 5px;
+ border-style: dashed;
+ border-width: 2px;
+ border-color: #FFD081;
}
.dark {
@@ -361,4 +451,54 @@ img {
.hrtext:after {
left: 0.5em;
margin-right: -50%;
+}
+
+.menu_content {
+ margin: 15px 15px;
+ display: none;
+}
+
+.menu_content.active {
+ display: block;
+}
+
+.menu_icon {
+ cursor: pointer;
+ line-height: 15px;
+ display: inline-table;
+ margin: 10px 15px;
+ opacity: 1;
+}
+
+.menu_icon.active {
+ opacity: 0.25;
+}
+
+.menu_icon:hover {
+ color: #FFD081;
+}
+
+.material-icons.em-3 {
+ font-size: 3em;
+}
+
+.material-icons.em-1-5 {
+ font-size: 1.5em;
+}
+
+.location-box {
+ border-style: solid;
+ background-color: #7B2900;
+ min-width: 120px;
+ margin: 5px;
+ display: inline-block;
+ padding: 6px;
+ border-radius: 5px;
+ border-color: white;
+ border-width: 1px;
+ cursor: pointer;
+}
+
+.location-box:hover {
+ border-color: #FFD081;
} \ No newline at end of file
diff --git a/webAO/client.html b/webAO/client.html
index 0d32c73..73d9ec6 100644
--- a/webAO/client.html
+++ b/webAO/client.html
@@ -1,110 +1,327 @@
<!DOCTYPE html>
-<html lang="en"><head>
- <title>Attorney Online session</title>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link rel="stylesheet" type="text/css" href="client.css">
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
- <!--<script src="golden/js/goldenlayout.js"></script>-->
- <link type="text/css" rel="stylesheet" href="golden/css/goldenlayout.css" />
- <link type="text/css" rel="stylesheet" href="https://golden-layout.com/files/latest/css/goldenlayout-dark-theme.css" />
- <script src="ui.b.js"></script>
- <script src="client.b.js"></script>
+<html lang="en">
+
+<head>
+ <title>Attorney Online session</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" type="text/css" href="client.css">
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
+ <script src="https://code.jquery.com/jquery-migrate-3.0.0.min.js"></script>
+ <script src="https://code.jquery.com/ui/1.10.4/jquery-ui.min.js"></script>
+ <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
+ <link type="text/css" rel="stylesheet" href="golden/css/goldenlayout.css" />
+ <link type="text/css" rel="stylesheet" href="https://golden-layout.com/files/latest/css/goldenlayout-dark-theme.css" />
+ <link type="text/css" rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+ <script src="lib/jquery.ui.touch-punch.min.js"></script>
+ <script src="lib/jdataview.min.js"></script>
+ <script src="lib/gify.min.js"></script>
+ <script src="ui.b.js"></script>
+ <script src="client.b.js"></script>
</head>
<template id="client_wrapper">
- <meta name="frame-title" lang="en" content="Game">
- <div id="client_gamewindow">
- <img id="client_court" alt="Courtroom background" onerror="imgError(this);">
- <img id="client_char" alt="Character sprite" onerror="imgError(this);">
- <img id="client_bench" alt="Bench overlay">
- <img id="client_fg" alt="Various overlay" onerror="imgError(this);">
- <div id="client_name">
- <p>Dolan</p>
- </div>
- <div id="client_chat">
- <p id="client_inner_chat"></p>
- </div>
- </div>
- <input id="client_inputbox" class="long" type="text" onkeypress="onEnter(event)" style="padding-left: 1px; padding-right: 1px;">
- <div id="client_emo">
- </div>
- <br>
- <div id="client_buttons">
- <img src="misc/holdit.png" id="button_1" alt="Hold it!" class="client_button" onclick="toggleshout(1)">
- <img src="misc/objection.png" id="button_2" alt="OBJECTION!" class="client_button" onclick="toggleshout(2)">
- <img src="misc/takethat.png" id="button_3" alt="Take That!" class="client_button" onclick="toggleshout(3)">
- <br>
- <input type="checkbox" id="sendsfx" name="sendsfx" value="sendsfx">
- <label for="sendsfx">SFX</label>
- </div>
+ <meta name="frame-title" lang="en" content="Game">
+ <div id="client_background"></div>
+ <div id="client_gamewindow">
+ <img id="client_court" alt="Courtroom background" onerror="imgError(this);">
+ <img id="client_char" onerror="imgError(this);">
+ <img id="client_bench">
+ <img id="client_fg" alt="Various overlay" onerror="imgError(this);">
+ <img id="client_evi" src="misc/evidence_selector.png" alt="Character Evidence" onerror="imgError(this);">
+ <img id="client_shout" alt="Effect overlay" src="misc/placeholder.gif" onerror="imgError(this);">
+ <div id="client_name">
+ <p>Dolan</p>
+ </div>
+ <div id="client_chat">
+ <p id="client_inner_chat"></p>
+ </div>
+ <img id="client_testimony" alt="Testimony overlay" style="display: none;" onerror="imgError(this);">
+ </div>
+ <input id="client_inputbox" class="long" type="text" onkeypress="onEnter(event)" style="padding-left: 1px; padding-right: 1px;" placeholder="Say something&hellip;">
+ <meta name="frame-title" lang="en" content="Miscellaneous">
+ <div id="client_bars">
+ <span id="client_defense_hp" class="health-box">
+ <div class="health-bar"></div>
+ </span>
+ <span id="client_prosecutor_hp" class="health-box">
+ <div class="health-bar"></div>
+ </span>
+ </div>
+ <div id="client_emo">
+ </div>
+ <br>
+ <div id="client_buttons">
+ <img src="misc/holdit.png" id="button_1" alt="Hold it!" class="client_button" onclick="toggleShout(1)">
+ <img src="misc/objection.png" id="button_2" alt="OBJECTION!" class="client_button" onclick="toggleShout(2)">
+ <img src="misc/takethat.png" id="button_3" alt="Take That!" class="client_button" onclick="toggleShout(3)">
+ <br>
+ <br>
+ <label for="textcolor">Text Color:</label>
+ <select id="textcolor" name="textcolor">
+ <option value="0">Default</option>
+ <option value="1">Green</option>
+ <option value="2">Red</option>
+ <option value="3">Orange</option>
+ <option value="4">Blue</option>
+ <option value="5">Yellow</option>
+ <option value="6">Margenta</option>
+ </select>
+ <label for="sendsfx">SFX</label>
+ <input type="checkbox" id="sendsfx" name="sendsfx" value="sendsfx">
+ <br>
+ <br>
+ <img src="misc/flip.png" id="button_flip" alt="Flip" class="client_button" onclick="toggleFlip()">
+ <img src="misc/flash.png" id="button_effect_1" alt="Flash" class="client_button" onclick="toggleEffect(1)">
+ <img src="misc/shake.png" id="button_effect_2" alt="Shake" class="client_button" onclick="toggleEffect(2)">
+ </div>
+ <fieldset style="margin:10px;">
+ <legend>Actions</legend>
+ <!-- Judge Commands -->
+ <span id="judge_action" style="display:none">
+ <span id="menu_wt" onclick="initWT()" class="menu_icon">
+ <i class="material-icons em-3">record_voice_over</i>
+ <div>Witness
+ <br>Testimony</div>
+ </span>
+ <span id="menu_ce" onclick="initCE()" class="menu_icon">
+ <i class="material-icons em-3">question_answer</i>
+ <div>Cross
+ <br>Examination</div>
+ </span>
+ <br>
+ <span style="display:inline-block; vertical-align: middle;">
+ <span id="menu_ahpd" onclick="addHPD()" class="menu_icon">
+ <i class="material-icons em1-5">add_circle</i>
+ </span>
+ <span style="font-size: 1.25em">Defense</span>
+ <span id="menu_rhpd" onclick="redHPD()" class="menu_icon">
+ <i class="material-icons em1-5">remove_circle</i>
+ </span>
+ </span>
+ <span style="display:inline-block; vertical-align: middle;">
+ <span id="menu_ahpp" onclick="addHPP()" class="menu_icon">
+ <i class="material-icons em-1-5">add_circle</i>
+ </span>
+ <span style="font-size: 1.25em">Prosecution</span>
+ <span id="menu_rhpp" onclick="redHPP()" class="menu_icon">
+ <i class="material-icons em-1-5">remove_circle</i>
+ </span>
+ </span>
+ </span>
+ <!-- No Commands -->
+ <span id="no_action">
+ No actions available for this role.
+ </span>
+ </fieldset>
</template>
-<template id="client_settings">
- <meta name="frame-title" lang="en" content="Settings">
- <div class="slider">Music<input id="client_mvolume" class="long" type="range" min="0" max="100" value="80" onchange="changeMusicVolume()"></div>
- <div class="slider">SFX <input id="client_svolume" class="long" type="range" min="0" max="100" value="70" onchange="changeSFXVolume()"></div>
- <div class="slider">Blip <input id="client_bvolume" class="long" type="range" min="0" max="100" value="60" onchange="changeBlipVolume()"></div>
- <input id="change_character" type="button" onclick="changeCharacter()" value="Change character">
-</template>
+<template id="mainmenu">
+ <meta name="frame-title" lang="en" content="Log">
+ <div id="client_menu">
+ <div class="hrtext">Main Menu</div>
+ <span id="menu_1" onclick="toggleMenu(1)" class="menu_icon active">
+ <i class="material-icons em-3">room</i>
+ <div>Areas</div>
+ </span>
+ <span id="menu_2" onclick="toggleMenu(2)" class="menu_icon">
+ <i class="material-icons em-3">work</i>
+ <div>Evidence</div>
+ </span>
+ <span id="menu_3" onclick="toggleMenu(3)" class="menu_icon">
+ <i class="material-icons em-3">settings</i>
+ <div>Settings</div>
+ </span>
+ <span id="menu_4" onclick="toggleMenu(4)" class="menu_icon">
+ <i class="material-icons em-3">person</i>
+ <div>About</div>
+ </span>
+ <span id="menu_cm" onclick="callMod()" class="menu_icon">
+ <i class="material-icons em-3" style="color: #ce2727;">report</i>
+ <div>Call Mod</div>
+ </span>
+ <div class="hrtext">
+ <span id="content_name">Content</span>
+ </div>
+ <!-- Areas section -->
+ <span class="menu_content active" id="content_1">
+ <meta name="frame-title" lang="en" content="Areas">
+ <div id="areas"></div>
+ <br>
+ <fieldset style="text-align: left">
+ <legend>Current Area Background</legend>
+ <span>
+ <img id="bg_preview" src="misc/placeholder.gif" alt="Background Preview" onerror="imgError(this);">
+ </span>
+ <span style="display:inline-block">
+ <label for="bg_filename">Background:</label>
+ <br>
+ <select id="bg_select" name="bg_select" onchange="updateBackgroundPreview()" style="margin-top:10px"></select>
+ <br>
+ <input id="bg_filename" name="bg_filename" class="short" type="text" style="margin-top:10px">
+ <br>
+ <br>
+ <img src="misc/location_change.png" id="bg_change" alt="Change" class="client_button hover_button" onclick="changeBackgroundOOC()">
+ </span>
+ </fieldset>
+ </span>
-<template id="log">
- <meta name="frame-title" lang="en" content="Log">
- <div id="client_log">
- <div class="hrtext">↓ log starts here ↓</div>
- </div>
+ <!-- Evidence section -->
+ <span class="menu_content" id="content_2">
+ <meta name="frame-title" lang="en" content="Evidence">
+ <fieldset style="text-align: left; display: flex; flex-direction: column;">
+ <legend>Information</legend>
+ <div style="display: flex;">
+ <img id="evi_icon" src="misc/evidence_selector.png" alt="Evidence Icon" onerror="imgError(this);">
+ <div id="evi_options">
+ <label for="evi_filename">Icon:</label>
+ <select id="evi_select" name="evi_select" onchange="updateEvidenceIcon()"></select>
+ <input id="evi_filename" name="evi_filename" class="short" type="text" placeholder="Custom filename">
+ <br>
+ <label for="evi_name">Name:</label>
+ <input id="evi_name" name="evi_name" class="short" type="text" placeholder="Evidence name">
+ </div>
+ </div>
+ <div style="display: flex; padding-top: 5px;">
+ <textarea id="evi_desc" name="evi_desc" rows="2" cols="20" placeholder="Evidence description"></textarea>
+ </div>
+ <div style="display: block; text-align: center; padding-top: 20px;">
+ <img src="misc/evidence_add.png" id="evi_add" alt="Add Evidence" class="client_button hover_button" onclick="addEvidence()">
+ <img src="misc/evidence_edit.png" id="evi_edit" alt="Edit Evidence" class="client_button hover_button inactive" onclick="editEvidence()">
+ <img src="misc/evidence_cancel.png" id="evi_cancel" alt="Cancel Evidence" class="client_button hover_button inactive" onclick="cancelEvidence()">
+ <img src="misc/evidence_remove.png" id="evi_del" alt="Remove Evidence" class="client_button hover_button inactive" onclick="deleteEvidence()">
+ </div>
+ </fieldset>
+ <br>
+ <div id="evidences"></div>
+ <br>
+ <img src="misc/present.png" id="button_present" alt="Present" class="client_button" onclick="togglePresent()">
+ </span>
+
+ <!-- Settings section -->
+ <span class="menu_content" id="content_3">
+ <meta name="frame-title" lang="en" content="Settings">
+ <label for="OOC_name">Server chat name:</label>
+ <input id="OOC_name" name="OOC_name" class="short" type="text">
+ <label for="role_select">Role:</label>
+ <select id="role_select" name="role_select" onchange="changeRoleOOC()">
+ <option value="def">Defense</option>
+ <option value="pro">Prosecution</option>
+ <option value="jud">Judge</option>
+ <option value="wit">Witness</option>
+ <option value="hld">Helper Defense</option>
+ <option value="hlp">Helper Prosecution</option>
+ </select>
+ <br>
+ <br>
+ <div class="slider">Music
+ <input id="client_mvolume" class="long" type="range" min="0" max="100" value="80" onchange="changeMusicVolume()">
+ </div>
+ <div class="slider">SFX
+ <input id="client_svolume" class="long" type="range" min="0" max="100" value="70" onchange="changeSFXVolume()">
+ </div>
+ <div class="slider">Blip
+ <input id="client_bvolume" class="long" type="range" min="0" max="100" value="60" onchange="changeBlipVolume()">
+ </div>
+ <br>
+ <img src="misc/character_change.png" id="char_change" alt="Change" class="client_button hover_button" onclick="changeCharacter()">
+ <img src="misc/character_random.png" id="char_random" alt="Random" class="client_button hover_button" onclick="randomCharacterOOC()">
+ <br>
+ <br>
+ <label for="client_encoding"> Client side chat encoding:</label>
+ <select id="client_encoding" name="client_encoding">
+ <option value="none" selected>None</option>
+ <option value="unicode">Unicode</option>
+ <option value="utf16">UTF-16</option>
+ </select>
+ <br>
+ <br>
+ <label for="client_decoding"> Client side chat decoding:</label>
+ <select id="client_decoding" name="client_decoding">
+ <option value="none">None</option>
+ <option value="unicode" selected>Unicode</option>
+ <option value="utf16">UTF-16</option>
+ </select>
+ <br>
+ <br>
+ <span style="color:red">Only touch these settings if you know what you are doing.</span>
+ <br>
+ <br>
+ <label for="bg_command">Change background command:</label>
+ <input id="bg_command" name="bg_command" class="short" type="text" value="bg $1">
+ <br>
+ <br>
+ <label for="role_command">Change role command:</label>
+ <input id="role_command" name="role_command" class="short" type="text" value="pos $1">
+ <br>
+ <br>
+ <label for="randomchar_command">Random character command:</label>
+ <input id="randomchar_command" name="randomchar_command" class="short" type="text" value="randomchar">
+ </span>
+
+ <!-- About section -->
+ <span class="menu_content" id="content_4">
+ <meta name="frame-title" lang="en" content="About">
+ <img id="about-logo" src="images/logo-new.png" alt="Attorney Online logo">
+ <h1 style="line-height: .3em;">webAO</h1>
+ <h3>version 2.3</h3>
+ <p>Client created by
+ <a href="https://github.com/stonedDiscord">@stonedDiscord</a> and fixed up by
+ <a href="https://github.com/oldmud0">@oldmud0</a> and
+ <a href="https://github.com/qubrick">Qubrick</a>.</p>
+ <p>Special thanks to Aleks for reverse engineering the original Delphi client written by FanatSors.</p>
+ </span>
+ </div>
</template>
-<template id="misc" style="display: flex; flex-direction: column;">
- <meta name="frame-title" lang="en" content="Miscellaneous">
- <div id="client_bars">
- <span style="background-image: url(&quot;misc/zdoh.png&quot;); width: 90px; height: 20px;">
- <img class="client_defense" alt="Defense health" id="client_defense_hp" src="misc/advocat.png" style="clip-path: polygon(0px 0px, 90px 0px, 90px 20px, 0px 20px, 0px 0px); clip: rect(0px, 90px, 20px, 0px);">
- </span>
- <span style="background-image: url(&quot;misc/zdoh.png&quot;); width: 90px; height: 20px;" misc="">
- <img class="client_prosecutor" alt="Prosecution health" id="client_prosecutor_hp" src="misc/procuror.png" style="clip-path: polygon(0px 0px, 90px 0px, 90px 20px, 0px 20px, 0px 0px); clip: rect(0px, 90px, 20px, 0px);" misc="">
- </span>
- </div>
+<template id="log">
+ <meta name="frame-title" lang="en" content="Log">
+ <div id="client_log">
+ <div class="hrtext">↓ log starts here ↓</div>
+ </div>
</template>
<template id="ooc">
- <meta name="frame-title" lang="en" content="Server">
- <div style="height: 100%; display: flex; flex-direction: column;">
- <textarea id="client_ooclog" style="flex: 1 auto"></textarea>
- <input id="client_oocinputbox" class="long" type="text" onkeypress="onOOCEnter(event)">
- </div>
+ <meta name="frame-title" lang="en" content="Server">
+ <div style="height: 100%; display: flex; flex-direction: column;">
+ <textarea id="client_ooclog" style="flex: 1 auto" readonly></textarea>
+ <input id="client_oocinputbox" class="long" type="text" onkeypress="onOOCEnter(event)">
+ </div>
</template>
<template id="music">
- <meta name="frame-title" lang="en" content="Music">
- <select id="client_musiclist" size="5" onclick="musiclist_click(event)" style="width: 100%; height: 100%;">
- </select>
+ <meta name="frame-title" lang="en" content="Music">
+ <select id="client_musiclist" size="5" onclick="musiclist_click(event)" style="width: 100%; height: 100%;">
+ </select>
</template>
-<template id="about">
- <meta name="frame-title" lang="en" content="About">
- <img id="about-logo" src="images/logo-new.png" alt="Attorney Online logo">
- <h1 style="line-height: .3em;">webAO</h1>
- <h3>version 2.1.1</h3>
- <p>Client created by <a href="https://github.com/stonedDiscord">@stonedDiscord</a> and fixed up by <a href="https://github.com/oldmud0">@oldmud0</a>.</p>
- <p>Special thanks to Aleks for reverse engineering the original Delphi client written by FanatSors.</p>
-</template>
+<div id="callmod_dialog" title="Call Mod">
+ <p>
+ <span class="ui-icon ui-icon-alert" style="float:left; margin:12px 12px 20px 0;"></span>
+ Are you sure you want to call a moderator?
+ </p>
+</div>
<body>
- <span id="sound"></span>
- <div id="here"></div>
- <div id="client_loading">
- <h1 id="client_loadingtext">Loading</h1>
- <button onclick="RetryButton()">RETRY</button>
- </div>
- <div id="client_charselect">
- <button onclick="pickchar(1001)">SPECTATE</button>
- <table id="client_chartable"></table>
- </div>
- <div id="client_error" class="error" style="display: none">
- <p>You were disconnected from the server.</p>
- <p>Code: <span id="error_id">(none)</span></p>
- <button onclick="ReconnectButton()">Reconnect</button>
- </div>
+ <span id="sound"></span>
+ <div id="here"></div>
+ <div id="client_loading">
+ <h1 id="client_loadingtext">Loading</h1>
+ <button onclick="RetryButton()">RETRY</button>
+ </div>
+ <div id="client_charselect">
+ <div id="client_chartable_container">
+ <table id="client_chartable"></table>
+ <button onclick="pickChar(1001)">Spectate</button>
+ </div>
+ </div>
+ <div id="client_error" class="error" style="display: none">
+ <p>You were disconnected from the server.</p>
+ <p>Code:
+ <span id="error_id">(none)</span>
+ </p>
+ <button onclick="ReconnectButton()">Reconnect</button>
+ </div>
</body>
+
</html> \ No newline at end of file
diff --git a/webAO/client.js b/webAO/client.js
index d6d388e..c690e1f 100644
--- a/webAO/client.js
+++ b/webAO/client.js
@@ -1,12 +1,23 @@
/*
* Glorious webAO
- * made by sD, refactored by oldmud0
+ * made by sD, refactored by oldmud0 and Qubrick
* credits to aleks for original idea and source
*/
-let queryDict = {};
-location.search.substr(1).split("&").forEach(function(item) {
- queryDict[item.split("=")[0]] = item.split("=")[1]
+// Uses the Gify library:
+// https://github.com/rfrench/gify
+// The following comment is needed for ESLint:
+/* global gify */
+
+import background_arr from "./backgrounds.js";
+import evidence_arr from "./evidence.js";
+import Fingerprint from "./fingerprint.js";
+
+import { EventEmitter } from "events";
+
+const queryDict = {};
+location.search.substr(1).split("&").forEach(function (item) {
+ queryDict[item.split("=")[0]] = item.split("=")[1];
});
/* Server magic */
@@ -16,64 +27,119 @@ let mode = queryDict.mode;
const AO_HOST = queryDict.asset || "http://s3.wasabisys.com/webao/base/";
const MUSIC_HOST = AO_HOST + "sounds/music/";
-const BAR_WIDTH = 90;
-const BAR_HEIGHT = 20;
const CHAR_SELECT_WIDTH = 8;
-const UPDATE_INTERVAL = 65;
+const UPDATE_INTERVAL = 60;
+/**
+ * Toggles AO1-style loading using paginated music packets.
+ * (It is unclear why AO2 loading does not work on mobile platforms.)
+ */
let oldLoading = false;
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) {
oldLoading = true;
}
+let selectedEffect = 0;
+let selectedMenu = 1;
let selectedShout = 0;
+
+const fp = new Fingerprint({
+ canvas: true,
+ ie_activex: true,
+ screen_resolution: true
+});
+
+/** An emulated, semi-unique HDID that is generally safe for HDID bans. */
+const hdid = fp.get();
+console.log(`Your emulated HDID is ${hdid}`);
+
let lastICMessageTime = new Date(0);
-class Client {
+class Client extends EventEmitter {
constructor(address) {
+ super();
this.serv = new WebSocket("ws://" + address);
- this.serv.onopen = (evt) => this.onOpen(evt);
- this.serv.onclose = (evt) => this.onClose(evt);
- this.serv.onmessage = (evt) => this.onMessage(evt);
- this.serv.onerror = (evt) => this.onError(evt);
+ this.serv.addEventListener("open", this.emit.bind(this, "open"));
+ this.serv.addEventListener("close", this.emit.bind(this, "close"));
+ this.serv.addEventListener("message", this.emit.bind(this, "message"));
+ this.serv.addEventListener("error", this.emit.bind(this, "error"));
+
+ this.on("open", this.onOpen.bind(this));
+ this.on("close", this.onClose.bind(this));
+ this.on("message", this.onMessage.bind(this));
+ this.on("error", this.onError.bind(this));
+
+ this.flip = false;
+ this.presentable = false;
+
+ this.hp = [0, 0];
this.playerID = 1;
this.charID = -1;
+ this.testimonyID = 0;
this.chars = [];
this.emotes = [];
+ this.evidences = [];
+
+ this.resources = {
+ "holdit": {
+ "src": "misc/holdit.gif",
+ "duration": 720
+ },
+ "objection": {
+ "src": "misc/objection.gif",
+ "duration": 720
+ },
+ "takethat": {
+ "src": "misc/takethat.gif",
+ "duration": 840
+ },
+ "witnesstestimony": {
+ "src": "misc/witnesstestimony.gif",
+ "duration": 1560,
+ "sfx": "sounds/general/sfx-testimony.wav"
+ },
+ "crossexamination": {
+ "src": "misc/crossexamination.gif",
+ "duration": 1600,
+ "sfx": "sounds/general/sfx-testimony2.wav"
+ }
+ };
this.selectedEmote = -1;
+ this.selectedEvidence = 0;
this.checkUpdater = null;
// Only used for RMC/`music` packets, not EM/SM/MC packets.
this.musicList = Object();
- this.handlers = {
- "MS": (args) => this.handleMS(args),
- "CT": (args) => this.handleCT(args),
- "MC": (args) => this.handleMC(args),
- "RMC": (args) => this.handleRMC(args),
- "CI": (args) => this.handleCI(args),
- "SC": (args) => this.handleSC(args),
- "EI": (args) => this.handleEI(args),
- "EM": (args) => this.handleEM(args),
- "SM": (args) => this.handleSM(args),
- "BD": (args) => this.handleBD(args),
- "music": (args) => this.handlemusic(args),
- "DONE": (args) => this.handleDONE(args),
- "BN": (args) => this.handleBN(args),
- "NBG": (args) => this.handleNBG(args),
- "HP": (args) => this.handleHP(args),
- "ID": (args) => this.handleID(args),
- "PN": (args) => this.handlePN(args),
- "SI": (args) => this.handleSI(args),
- "CharsCheck": (args) => this.handleCharsCheck(args),
- "PV": (args) => this.handlePV(args),
- "CHECK": (args) => {}
- }
+ this.on("MS", this.handleMS.bind(this));
+ this.on("CT", this.handleCT.bind(this));
+ this.on("MC", this.handleMC.bind(this));
+ this.on("RMC", this.handleRMC.bind(this));
+ this.on("CI", this.handleCI.bind(this));
+ this.on("SC", this.handleSC.bind(this));
+ this.on("EI", this.handleEI.bind(this));
+ this.on("LE", this.handleLE.bind(this));
+ this.on("EM", this.handleEM.bind(this));
+ this.on("SM", this.handleSM.bind(this));
+ this.on("BD", this.handleBD.bind(this));
+ this.on("music", this.handlemusic.bind(this));
+ this.on("DONE", this.handleDONE.bind(this));
+ this.on("BN", this.handleBN.bind(this));
+ this.on("NBG", this.handleNBG.bind(this));
+ this.on("HP", this.handleHP.bind(this));
+ this.on("RT", this.handleRT.bind(this));
+ this.on("ZZ", this.handleZZ.bind(this));
+ this.on("ID", this.handleID.bind(this));
+ this.on("PN", this.handlePN.bind(this));
+ this.on("SI", this.handleSI.bind(this));
+ this.on("CharsCheck", this.handleCharsCheck.bind(this));
+ this.on("PV", this.handlePV.bind(this));
+ this.on("CHECK", () => {});
this._lastTimeICReceived = new Date(0);
}
@@ -81,23 +147,30 @@ class Client {
/**
* Gets the current player's character.
*/
- me() {
+ get character() {
return this.chars[this.charID];
}
/**
* Gets the player's currently selected emote.
*/
- myEmote() {
+ get emote() {
return this.emotes[this.selectedEmote];
}
/**
+ * Gets the player's currently selected evidence if presentable.
+ */
+ get evidence() {
+ return this.presentable ? this.selectedEvidence : 0;
+ }
+
+ /**
* Sends an out-of-character chat message.
* @param {string} message the message to send
*/
sendOOC(message) {
- this.serv.send(`CT#web${this.playerID}#${escapeChat(message)}#%`);
+ this.serv.send(`CT#${escapeChat(encodeChat(document.getElementById("OOC_name").value))}#${escapeChat(encodeChat(message))}#%`);
}
/**
@@ -109,18 +182,78 @@ class Client {
* @param {string} side the name of the side in the background
* @param {string} ssfxname the name of the sound effect
* @param {string} zoom whether or not to zoom
- * @param {string} ssfxdelay the delay (in milliseconds) to play the sound effect
+ * @param {number} ssfxdelay the delay (in milliseconds) to play the sound effect
* @param {string} objection the number of the shout to play
+ * @param {string} evidence the filename of evidence to show
+ * @param {number} flip change to 1 to reverse sprite for position changes
+ * @param {string} flash screen flash effect
+ * @param {string} color text color
*/
- sendIC(speaking, name, silent, message, side, ssfxname, zoom, ssfxdelay, objection) {
+ sendIC(speaking, name, silent, message, side, ssfxname, zoom, ssfxdelay, objection, evidence, flip, flash, color) {
this.serv.send(
`MS#chat#${speaking}#${name}#${silent}` +
- `#${escapeChat(message)}#${side}#${ssfxname}#${zoom}` +
- `#${this.charID}#${ssfxdelay}#${selectedShout}#0#0#0#0#%`
+ `#${escapeChat(encodeChat(message))}#${side}#${ssfxname}#${zoom}` +
+ `#${this.charID}#${ssfxdelay}#${selectedShout}#${evidence}#${flip}#${flash}#${color}#%`
);
}
/**
+ * Sends add evidence command.
+ * @param {string} evidence name
+ * @param {string} evidence description
+ * @param {string} evidence image filename
+ */
+ sendPE(name, desc, img) {
+ this.serv.send(`PE#${escapeChat(encodeChat(name))}#${escapeChat(encodeChat(desc))}#${img}#%`);
+ }
+
+ /**
+ * Sends edit evidence command.
+ * @param {number} evidence id
+ * @param {string} evidence name
+ * @param {string} evidence description
+ * @param {string} evidence image filename
+ */
+ sendEE(id, name, desc, img) {
+ this.serv.send(`EE#${id}#${escapeChat(encodeChat(name))}#${escapeChat(encodeChat(desc))}#${img}#%`);
+ }
+
+ /**
+ * Sends delete evidence command.
+ * @param {number} evidence id
+ */
+ sendDE(id) {
+ this.serv.send(`DE#${id}#%`);
+ }
+
+ /**
+ * Sends health point command.
+ * @param {number} side the position
+ * @param {number} hp the health point
+ */
+ sendHP(side, hp) {
+ this.serv.send(`HP#${side}#${hp}#%`);
+ }
+
+ /**
+ * Sends call mod command.
+ * @param {string} message to mod
+ */
+ sendZZ(msg) {
+ this.serv.send(`ZZ#${msg}#%`);
+ }
+
+ /**
+ * Sends testimony command.
+ * @param {string} testimony type
+ */
+ sendRT(testimony) {
+ if (this.chars[this.charID].side === "jud") {
+ this.serv.send(`RT#${testimony}#%`);
+ }
+ }
+
+ /**
* Requests to change the music to the specified track.
* @param {string} track the track ID
*/
@@ -143,12 +276,86 @@ class Client {
* to the server.
*/
joinServer() {
- this.serv.send(`HI#${navigator.userAgent.hashCode()}#%`);
- this.serv.send("ID#webAO#2.4.5#%");
+ this.serv.send(`HI#${hdid}#%`);
+ this.serv.send("ID#webAO#2.3#%");
this.checkUpdater = setInterval(() => this.sendCheck(), 5000);
}
/**
+ * Load game resources.
+ */
+ loadResources() {
+ // Set to playerID to server chat name
+ // TODO: Make a text box for this!
+ document.getElementById("OOC_name").value = "web" + this.playerID;
+
+ // Load evidence array to select
+ const evidence_select = document.getElementById("evi_select");
+ evidence_select.add(new Option("Custom", 0));
+ evidence_arr.forEach(evidence => {
+ evidence_select.add(new Option(evidence));
+ });
+
+ // Load background array to select
+ const background_select = document.getElementById("bg_select");
+ background_select.add(new Option("Custom", 0));
+ background_arr.forEach(background => {
+ background_select.add(new Option(background));
+ });
+
+ this.resources.map(async (resource) => {
+ // Check if image exists and replace `src` with an absolute URL
+ const spriteSrc = `${AO_HOST}themes/default/${resource.src}.gif`;
+ if (await fileExists(spriteSrc)) {
+ Object.assign(resource, {
+ src: spriteSrc,
+ duration: await viewport.getAnimLength(spriteSrc)
+ });
+ }
+
+ // Check if sfx exists and replace `sfx` with an absolute URL
+ if (resource.sfx) {
+ const sfxSrc = AO_HOST + resource.sfx.toLowerCase();
+ if (await fileExists(sfxSrc)) {
+ resource.sfx = sfxSrc;
+ }
+ }
+ });
+ }
+
+ /**
+ * Create observer to detect BBCode elements
+ * then manipulate them.
+ */
+ initialObservBBCode() {
+ const target = document.getElementById("client_inner_chat");
+ const observer = new MutationObserver(mutations => {
+ mutations.forEach(mutation => {
+ const children = mutation.addedNodes;
+ if (children !== null) {
+ children.forEach(function (node) {
+ if (node.tagName === "C") {
+ node.style.color = node.getAttribute("a");
+ } else if (node.tagName === "M") {
+ if (node.hasAttribute("a")) {
+ node.style.backgroundColor = node.getAttribute("a");
+ } else {
+ node.style.backgroundColor = "yellow";
+ node.style.color = "black";
+ }
+ }
+ });
+ }
+ });
+ });
+ const config = {
+ attributes: true,
+ childList: true
+ };
+ observer.observe(target, config);
+ }
+
+ /**
* Requests to play as a specified character.
* @param {number} character the character ID
*/
@@ -174,7 +381,7 @@ class Client {
/**
* Triggered when a connection is established to the server.
*/
- onOpen(e) {
+ onOpen(_e) {
// XXX: Why does watching mean just SITTING there and doing nothing?
if (mode === "watch") {
document.getElementById("client_loading").style.display = "none";
@@ -202,15 +409,14 @@ class Client {
* @param {MessageEvent} e
*/
onMessage(e) {
- let msg = e.data;
+ const msg = e.data;
console.debug(msg);
- let lines = msg.split('%');
- let args = lines[0].split('#');
- let header = args[0];
- let handler = this.handlers[header];
- if (typeof handler !== "undefined") {
- handler(args);
- } else {
+
+ const lines = msg.split("%");
+ const args = lines[0].split("#");
+ const header = args[0];
+
+ if (!this.emit(header, args)) {
console.warn(`Invalid packet header ${header}`);
}
}
@@ -229,10 +435,18 @@ class Client {
cleanup() {
try {
this.serv.close(1001);
- } catch (e) {
- // I don't care if this errors
+ } finally {
+ clearInterval(this.checkUpdater);
}
- clearInterval(this.checkUpdater);
+ }
+
+ /**
+ * XXX: a nasty hack made by gameboyprinter.
+ * @param {string} msg chat message to prepare for display
+ */
+ prepChat(msg){
+ // TODO: make this less awful
+ return decodeBBCode(unescapeChat(decodeChat(msg)));
}
/**
@@ -241,17 +455,17 @@ class Client {
*/
handleMS(args) {
// TODO: this if-statement might be a bug.
- if (args[4] != viewport.chatmsg.content) {
+ if (args[4] !== viewport.chatmsg.content) {
document.getElementById("client_inner_chat").innerHTML = "";
- let chatmsg = {
- pre: escape(args[2]),
+ const chatmsg = {
+ // pre: escape(args[2]),
character: -1, // Will do a linear search
preanim: escape(args[2]), // XXX: why again?
nameplate: args[3], // TODO: parse INI to get this info
name: args[3],
speaking: "(b)" + escape(args[4]),
silent: "(a)" + escape(args[4]),
- content: args[5],
+ content: this.prepChat(args[5]), // Escape HTML tag, Use BBCode Only!
side: args[6],
sound: escape(args[7]),
type: args[8],
@@ -259,7 +473,7 @@ class Client {
snddelay: args[10],
objection: args[11],
evidence: args[12],
- // flip: args[13],
+ flip: args[13],
flash: args[14],
color: args[15],
isnew: true,
@@ -267,17 +481,17 @@ class Client {
// The dreaded linear search...
for (let i = 0; i < this.chars.length; i++) {
- if (this.chars[i].name == args[3]) {
+ if (this.chars[i].name === args[3]) {
chatmsg.character = i;
break;
}
}
- if (chatmsg.character == this.charID) {
+ if (chatmsg.character === this.charID) {
resetICParams();
}
- viewport.say(chatmsg);
+ viewport.say(chatmsg); // no await
}
}
@@ -287,8 +501,8 @@ class Client {
*/
handleCT(args) {
const oocLog = document.getElementById("client_ooclog");
- oocLog.innerHTML += `${args[1]}: ${args[2]}\r\n`;
- if (oocLog.scrollTop > oocLog.scrollHeight - 60) {
+ oocLog.innerHTML += `${decodeChat(unescapeChat(args[1]))}: ${decodeChat(unescapeChat(args[2]))}\r\n`;
+ if (oocLog.scrollTop > oocLog.scrollHeight - 600) {
oocLog.scrollTop = oocLog.scrollHeight;
}
}
@@ -298,15 +512,16 @@ class Client {
* @param {Array} args packet arguments
*/
handleMC(args) {
+ const [ _packet, track, charID ] = args;
const music = viewport.music;
music.pause();
- music.src = MUSIC_HOST + args[1];
+ music.src = MUSIC_HOST + track.toLowerCase();
music.play();
if (args[2] >= 0) {
- let musicname = this.chars[args[2]].name;
- appendICLog(`${musicname} changed music to ${args[1]}`);
+ const musicname = this.chars[charID].name;
+ appendICLog(`${musicname} changed music to ${track}`);
} else {
- appendICLog(`The music was changed to ${args[1]}`);
+ appendICLog(`The music was changed to ${track}`);
}
}
@@ -321,7 +536,7 @@ class Client {
// Music offset + drift from song loading
music.totime = args[1];
music.offset = new Date().getTime() / 1000;
- music.addEventListener('loadedmetadata', function() {
+ music.addEventListener("loadedmetadata", function () {
music.currentTime += parseFloat(music.totime + (new Date().getTime() / 1000 - music.offset)).toFixed(3);
music.play();
}, false);
@@ -336,13 +551,13 @@ class Client {
document.getElementById("client_loadingtext").innerHTML = "Loading Character " + args[1];
this.serv.send("AN#" + ((args[1] / 10) + 1) + "#%");
for (let i = 2; i < args.length - 1; i++) {
- if (i % 2 == 0) {
- let chargs = args[i].split("&");
+ if (i % 2 === 0) {
+ const chargs = args[i].split("&");
this.chars[args[i - 1]] = {
- "name": chargs[0],
- "desc": chargs[1],
- "evidence": chargs[3],
- "icon": AO_HOST + "characters/" + escape(chargs[0]) + "/char_icon.png"
+ name: chargs[0],
+ desc: chargs[1],
+ evidence: chargs[3],
+ icon: AO_HOST + "characters/" + escape(chargs[0].toLowerCase()) + "/char_icon.png"
};
}
}
@@ -356,13 +571,13 @@ class Client {
handleSC(args) {
document.getElementById("client_loadingtext").innerHTML = "Loading Characters";
for (let i = 1; i < args.length - 1; i++) {
- let chargs = args[i].split("&");
+ const chargs = args[i].split("&");
this.chars[i - 1] = {
- "name": chargs[0],
- "desc": chargs[1],
- "evidence": chargs[3],
- "icon": AO_HOST + "characters/" + escape(chargs[0]) + "/char_icon.png"
- }
+ name: chargs[0],
+ desc: chargs[1],
+ evidence: chargs[3],
+ icon: AO_HOST + "characters/" + escape(chargs[0].toLowerCase()) + "/char_icon.png"
+ };
}
this.serv.send("RM#%");
}
@@ -381,6 +596,35 @@ class Client {
}
/**
+ * Handles incoming evidence list, all evidences at once
+ * item per packet.
+ *
+ * @param {Array} args packet arguments
+ */
+ handleLE(args) {
+ this.evidences = [];
+ for (let i = 1; i < args.length - 1; i++) {
+ const arg = args[i].split("&");
+ this.evidences[i - 1] = {
+ name: decodeChat(unescapeChat(arg[0])),
+ desc: decodeChat(unescapeChat(arg[1])),
+ filename: escape(arg[2]),
+ icon: AO_HOST + "evidence/" + escape(arg[2].toLowerCase())
+ };
+ }
+
+ const evidence_box = document.getElementById("evidences");
+ evidence_box.innerHTML = "";
+ for (let i = 1; i <= this.evidences.length; i++) {
+ evidence_box.innerHTML += `<img src="${this.evidences[i - 1].icon}"
+ id="evi_${i}"
+ alt="${this.evidences[i - 1].name}"
+ class="client_button"
+ onclick="pickEvidence(${i})">`;
+ }
+ }
+
+ /**
* Handles incoming music information, containing multiple entries
* per packet.
* @param {Array} args packet arguments
@@ -388,10 +632,10 @@ class Client {
handleEM(args) {
document.getElementById("client_loadingtext").innerHTML = "Loading Music " + args[1];
this.serv.send("AM#" + ((args[1] / 10) + 1) + "#%");
- let hmusiclist = document.getElementById("client_musiclist");
+ const hmusiclist = document.getElementById("client_musiclist");
for (let i = 2; i < args.length - 1; i++) {
- if (i % 2 == 0) {
- let newentry = document.createElement("OPTION");
+ if (i % 2 === 0) {
+ const newentry = document.createElement("OPTION");
newentry.text = args[i];
hmusiclist.options.add(newentry);
}
@@ -405,12 +649,42 @@ class Client {
*/
handleSM(args) {
document.getElementById("client_loadingtext").innerHTML = "Loading Music ";
- let hmusiclist = document.getElementById("client_musiclist");
+ const hmusiclist = document.getElementById("client_musiclist");
+ let flagAudio = false;
+
for (let i = 1; i < args.length - 1; i++) {
- let newentry = document.createElement("OPTION");
- newentry.text = args[i];
- hmusiclist.options.add(newentry);
+ // Check when found the song for the first time
+ if (/\.(?:wav|mp3|mp4|ogg|opus)$/i.test(args[i]) && !flagAudio) {
+ flagAudio = true;
+ }
+
+ if (flagAudio) {
+ // After reached the audio put everything in the music list
+ const newentry = document.createElement("OPTION");
+ newentry.text = args[i];
+ hmusiclist.options.add(newentry);
+ } else {
+ // Create area button
+ const newarea = document.createElement("SPAN");
+ newarea.className = "location-box";
+ newarea.textContent = args[i];
+ newarea.onclick = function () {
+ area_click(this);
+ };
+ document.getElementById("areas").appendChild(newarea);
+ }
}
+
+ // We need to check if the last area that we got was actually a category
+ // header for music. If it was, then move it over to the music list.
+ const area_box = document.getElementById("areas");
+ if (area_box.lastChild.textContent.startsWith("=")) {
+ const audio_title = document.createElement("OPTION");
+ audio_title.text = area_box.lastChild.textContent;
+ hmusiclist.insertBefore(audio_title, hmusiclist.firstChild);
+ area_box.removeChild(area_box.lastChild);
+ }
+
this.serv.send("RD#%");
}
@@ -423,6 +697,14 @@ class Client {
}
/**
+ * Handles the banned packet
+ * @param {Array} args packet arguments
+ */
+ handleBD(args) {
+ document.getElementById("client_loadingtext").innerHTML = "Banned: " + args[1];
+ }
+
+ /**
* Handles incoming music information, containing all entries
* in the same packet.
* @param {Array} args packet arguments
@@ -439,7 +721,7 @@ class Client {
*
* @param {Array} args packet arguments
*/
- handleDONE(args) {
+ handleDONE(_args) {
document.getElementById("client_loading").style.display = "none";
document.getElementById("client_charselect").style.display = "block";
}
@@ -450,9 +732,22 @@ class Client {
*/
handleBN(args) {
viewport.bgname = escape(args[1]);
+ const bg_index = getIndexFromSelect("bg_select", escape(args[1]));
+ document.getElementById("bg_select").selectedIndex = bg_index;
+ updateBackgroundPreview();
+ if (bg_index === 0) {
+ document.getElementById("bg_filename").value = args[1];
+ }
+ document.getElementById("bg_preview").src = AO_HOST + "background/" + escape(args[1].toLowerCase()) + "/defenseempty.png";
+ if (this.charID === -1) {
+ changeBackground("jud");
+ } else {
+ changeBackground(this.chars[this.charID].side);
+ }
+
}
- handleNBG(args) {
+ handleNBG(_args) {
// TODO (set by sD)
}
@@ -461,15 +756,49 @@ class Client {
* @param {Array} args packet arguments
*/
handleHP(args) {
- // TODO (set by sD)
- // Also, this is broken.
- if (args[1] == 1) {
- document.getElementById("client_defense_hp").style.clip = "rect(0px," + BAR_WIDTH * args[2] / 10 + "px," + BAR_HEIGHT + "px,0px)";
+ const percent_hp = args[2] * 10;
+ if (args[1] === 1) {
+ // Def hp
+ this.hp[0] = args[2];
+ $("#client_defense_hp > .health-bar").animate({
+ "width": percent_hp + "%"
+ }, 500);
} else {
- document.getElementById("client_prosecutor_hp").style.clip = "rect(0px," + BAR_WIDTH * args[2] / 10 + "px," + BAR_HEIGHT + "px,0px)";
+ // Pro hp
+ this.hp[1] = args[2];
+ $("#client_prosecutor_hp > .health-bar").animate({
+ "width": percent_hp + "%"
+ }, 500);
}
}
-
+
+ /**
+ * Handles a testimony states.
+ * @param {Array} args packet arguments
+ */
+ handleRT(args) {
+ if (args[1] === "testimony1") {
+ //Witness Testimony
+ this.testimonyID = 1;
+ } else {
+ //Cross Examination
+ this.testimonyID = 2;
+ }
+ viewport.initTestimonyUpdater();
+ }
+
+ /**
+ * Handles a call mod message.
+ * @param {Array} args packet arguments
+ */
+ handleZZ(args) {
+ const oocLog = document.getElementById("client_ooclog");
+ oocLog.innerHTML += `$Alert: ${decodeChat(unescapeChat(args[1]))}\r\n`;
+ if (oocLog.scrollTop > oocLog.scrollHeight - 60) {
+ oocLog.scrollTop = oocLog.scrollHeight;
+ }
+ }
+
/**
* Handles the issuance of a player ID by the server.
* @param {Array} args packet arguments
@@ -478,7 +807,7 @@ class Client {
this.playerID = args[1];
}
- handlePN(args) {
+ handlePN(_args) {
this.serv.send("askchaa#%");
}
@@ -487,7 +816,7 @@ class Client {
* but we use it as a cue to begin retrieving characters.
* @param {Array} args packet arguments
*/
- handleSI(args) {
+ handleSI(_args) {
if (oldLoading) {
this.serv.send("askchar2#%");
} else {
@@ -501,72 +830,71 @@ class Client {
*/
handleCharsCheck(args) {
document.getElementById("client_chartable").innerHTML = "";
+ let tr;
for (let i = 0; i < this.chars.length; i++) {
- if (i % CHAR_SELECT_WIDTH == 0) {
- var tr = document.createElement('TR');
+ if (i % CHAR_SELECT_WIDTH === 0) {
+ tr = document.createElement("TR");
}
- let td = document.createElement('TD');
- let icon_chosen;
- let thispick = this.chars[i].icon;
- if (args[i + 1] == "-1") {
+ const td = document.createElement("TD");
+ let icon_chosen = "";
+ const thispick = this.chars[i].icon;
+ if (args[i + 1] === "-1") {
icon_chosen = " dark";
- } else {
- icon_chosen = "";
}
td.innerHTML = `<img class='demothing${icon_chosen}' id='demo_${i}' ` +
- `src='${thispick}' alt='${this.chars[i].name}' onclick='pickchar(${i})' ` +
- `onerror='demoError(this);'>`;
+ `src='${thispick}' alt='${this.chars[i].name}' onclick='pickChar(${i})' ` +
+ "onerror='demoError(this);'>";
tr.appendChild(td);
- if (i % CHAR_SELECT_WIDTH == 0) {
+ if (i % CHAR_SELECT_WIDTH === 0) {
document.getElementById("client_chartable").appendChild(tr);
}
}
- changeBackground("def");
+ //changeBackground("def");
}
/**
* Handles the server's assignment of a character for the player to use.
* @param {Array} args packet arguments
*/
- handlePV(args) {
+ async handlePV(args) {
this.charID = args[3];
+
document.getElementById("client_charselect").style.display = "none";
- let me = this.me();
- let emotes = this.emotes;
- let xhr = new XMLHttpRequest();
- xhr.open('GET', AO_HOST + 'characters/' + escape(this.me().name) + '/char.ini', true);
- xhr.responseType = 'text';
- xhr.onload = function (e) {
- if (this.status == 200) {
- let linifile = this.responseText;
- let pinifile = INI.parse(linifile);
- me.side = pinifile.Options.side;
- for (let i = 1; i < pinifile.Emotions.number; i++) {
- let emoteinfo = pinifile.Emotions[i].split('#');
- let esfx = "0";
- let esfxd = "0";
- if (typeof pinifile.SoundN !== 'undefined') {
- esfx = pinifile.SoundN[i];
- }
- if (typeof pinifile.SoundT !== 'undefined') {
- esfxd = pinifile.SoundT[i];
- }
- emotes[i] = {
- desc: emoteinfo[0],
- speaking: emoteinfo[1],
- silent: emoteinfo[2],
- zoom: emoteinfo[3],
- sfx: esfx,
- sfxdelay: esfxd,
- button_off: AO_HOST + 'characters/' + escape(me.name) + '/emotions/button' + i + '_off.png',
- button_on: AO_HOST + 'characters/' + escape(me.name) + '/emotions/button' + i + '_on.png'
- };
- document.getElementById("client_emo").innerHTML += "<img src='" + emotes[i].button_off + "' id='emo_" + i + "' alt='" + emotes[i].desc + "' class='client_button' onclick='pickemotion(" + i + ")'>";
- }
- pickemotion(1);
- }
- };
- xhr.send();
+ document.getElementById("client_inputbox").style.display = "";
+
+ const me = this.character;
+ const emotes = this.emotes;
+ const emotesList = document.getElementById("client_emo");
+ emotesList.innerHTML = ""; // Clear emote box
+ emotesList.style.display = "";
+
+ const data = await request(AO_HOST + "characters/" + escape(this.character.name.toLowerCase()) + "/char.ini");
+ const ini = INI.parse(data);
+ me.side = ini.Options.side;
+ updateActionCommands(me.side);
+ for (let i = 1; i <= ini.Emotions.number; i++) {
+ const emoteinfo = ini.Emotions[i].split("#");
+ const esfx = ini.SoundN ? ini.SoundN[i] : "0";
+ const esfxd = ini.SoundT ? ini.SoundT[i] : "0";
+ // Make sure the asset server is case insensitive, or that everything on it is lowercase
+ emotes[i] = {
+ desc: emoteinfo[0].toLowerCase(),
+ speaking: emoteinfo[1].toLowerCase(),
+ silent: emoteinfo[2].toLowerCase(),
+ zoom: emoteinfo[3],
+ sfx: esfx.toLowerCase(),
+ sfxdelay: esfxd,
+ button_off: AO_HOST + `characters/${escape(me.name).toLowerCase()}/emotions/button${i}_off.png`,
+ button_on: AO_HOST + `characters/${escape(me.name).toLowerCase()}/emotions/button${i}_on.png`
+ };
+ emotesList.innerHTML +=
+ `<img src=${emotes[i].button_off}
+ id="emo_${i}"
+ alt="${emotes[i].desc}"
+ class="client_button"
+ onclick="pickEmotion(${i})">`;
+ }
+ pickEmotion(1);
}
}
@@ -578,34 +906,36 @@ class Viewport {
"content": "",
"objection": "0",
"sound": "",
+ "startpreanim": false,
"startspeaking": false,
"side": null,
"color": "0",
- "snddelay": 0
+ "snddelay": 0,
+ "preanimdelay": 0
};
- this.blip = new Audio(AO_HOST + 'sounds/general/sfx-blipmale.wav');
+ this.blip = new Audio(AO_HOST + "sounds/general/sfx-blipmale.wav");
this.blip.volume = 0.5;
// Allocate multiple blip audio channels to make blips less jittery
// TODO: read blip type ("gender") from ini
this.blipChannels = new Array(6);
- for (let i = 0; i < this.blipChannels.length; i++) {
- this.blipChannels[i] = new Audio(AO_HOST + 'sounds/general/sfx-blipmale.wav');
- this.blipChannels[i].volume = 0.5;
- }
+ this.blipChannels.fill(new Audio(AO_HOST + "sounds/general/sfx-blipmale.wav"))
+ .forEach(channel => channel.volume = 0.5);
this.currentBlipChannel = 0;
- this.sfxaudio = new Audio(AO_HOST + 'sounds/general/sfx-blipmale.wav');
+ this.sfxaudio = new Audio(AO_HOST + "sounds/general/sfx-blipmale.wav");
this.sfxplayed = 0;
this.music = new Audio();
this.music.play();
this.updater = null;
+ this.testimonyUpdater = null;
this.bgname = "gs4";
+ this.testimonyTimer = 0;
this.shoutTimer = 0;
this.textTimer = 0;
@@ -616,7 +946,7 @@ class Viewport {
* Returns whether or not the viewport is busy
* performing a task (animating).
*/
- isAnimating() {
+ get isAnimating() {
return this._animating;
}
@@ -624,33 +954,122 @@ class Viewport {
* Sets the volume of the blip sound.
* @param {number} volume
*/
- setBlipVolume(volume) {
- for (let i = 0; i < this.blipChannels.length; i++) {
- this.blipChannels[i].volume = volume;
- }
+ set blipVolume(volume) {
+ this.blipChannels.forEach(channel => channel.volume = volume);
}
/**
* Returns the path which the background is located in.
*/
- bgFolder() {
- return `${AO_HOST}background/${this.bgname}/`;
+ get bgFolder() {
+ return `${AO_HOST}background/${this.bgname.toLowerCase()}/`;
}
/**
* Sets a new emote.
* @param {object} chatmsg the new chat message
*/
- say(chatmsg) {
+ async say(chatmsg) {
this.chatmsg = chatmsg;
appendICLog(chatmsg.content, chatmsg.nameplate);
changeBackground(chatmsg.side);
- this.textnow = '';
+ this.textnow = "";
this.sfxplayed = 0;
this.textTimer = 0;
this._animating = true;
clearTimeout(this.updater);
- this.updater = setTimeout(() => this.updateText(), UPDATE_INTERVAL);
+ // If preanim existed then determine the length
+ if (chatmsg.preanim !== "-") {
+ const delay = await this.getAnimLength(`${AO_HOST}characters/${escape(chatmsg.name.toLowerCase())}/${chatmsg.preanim.toLowerCase()}.gif`);
+ chatmsg.preanimdelay = delay;
+ this.initUpdater(delay);
+ } else {
+ this.initUpdater(0);
+ }
+ }
+
+ /**
+ * Intialize updater
+ * @param {number} animdelay the length of pre-animation
+ */
+ initUpdater(animdelay) {
+ viewport.chatmsg.preanimdelay = parseInt(animdelay);
+ viewport.updater = setTimeout(() => viewport.tick(), UPDATE_INTERVAL);
+ }
+
+ /**
+ * Intialize testimony updater
+ */
+ initTestimonyUpdater() {
+ const testimonyFilenames = {
+ 1: "witnesstestimony",
+ 2: "crossexamination"
+ };
+
+ const testimony = testimonyFilenames[client.testimonyID];
+ if (!testimony) {
+ console.warn(`Invalid testimony ID ${client.testimonyID}`);
+ return;
+ }
+
+ (new Audio(client.resources[testimony].sfx)).play();
+
+ const testimonyOverlay = document.getElementById("client_testimony");
+ testimonyOverlay.src = client.resources[testimony].src;
+ testimonyOverlay.style.display = "";
+
+ this.testimonyTimer = 0;
+ this.testimonyUpdater = setTimeout(() => this.updateTestimony(), UPDATE_INTERVAL);
+ }
+
+ /**
+ * Gets animation length. If the animation cannot be found, it will
+ * silently fail and return 0 instead.
+ * @param {string} filename the animation file name
+ */
+ async getAnimLength(filename) {
+ try {
+ const file = await request(filename);
+ return gify.getInfo(file).duration;
+ } catch (err) {
+ return 0;
+ }
+ }
+
+ /**
+ * Updates the testimony overaly
+ */
+ updateTestimony() {
+ const testimonyFilenames = {
+ 1: "witnesstestimony",
+ 2: "crossexamination"
+ };
+
+ // Update timer
+ this.testimonyTimer = this.testimonyTimer + UPDATE_INTERVAL;
+
+ const testimony = testimonyFilenames[client.testimonyID];
+ const resource = client.resources[testimony];
+ if (!resource) {
+ this.disposeTestimony();
+ return;
+ }
+
+ if (this.testimonyTimer >= resource.duration) {
+ this.disposeTestimony();
+ } else {
+ this.testimonyUpdater = setTimeout(() => this.updateTestimony(), UPDATE_INTERVAL);
+ }
+ }
+
+ /**
+ * Dispose the testimony overlay
+ */
+ disposeTestimony() {
+ client.testimonyID = 0;
+ this.testimonyTimer = 0;
+ document.getElementById("client_testimony").style.display = "none";
+ clearTimeout(this.testimonyUpdater);
}
/**
@@ -658,46 +1077,119 @@ class Viewport {
*
* XXX: This relies on a global variable `this.chatmsg`!
*/
- updateText() {
- if (this.chatmsg.content.trim() == "") {
- document.getElementById("client_name").style.display = "none";
- document.getElementById("client_chat").style.display = "none";
+ tick() {
+ const nameBox = document.getElementById("client_name");
+ const chatBox = document.getElementById("client_chat");
+ const charSprite = document.getElementById("client_char");
+ const eviBox = document.getElementById("client_evi");
+ const background = document.getElementById("client_background");
+ const shoutSprite = document.getElementById("client_shout");
+ const chatBoxInner = document.getElementById("client_inner_chat");
+
+ // Flip the character
+ if (this.chatmsg.flip === 1) {
+ charSprite.style.transform = "scaleX(-1)";
} else {
- document.getElementById("client_name").style.display = "block";
- document.getElementById("client_chat").style.display = "block";
+ charSprite.style.transform = "scaleX(1)";
}
if (this._animating) {
- this.updater = setTimeout(() => this.updateText(), UPDATE_INTERVAL);
+ this.updater = setTimeout(() => this.tick(), UPDATE_INTERVAL);
}
if (this.chatmsg.isnew) {
+ // Reset screen background
+ background.style.backgroundColor = "transparent";
+ // Hide message and evidence window
+ nameBox.style.display = "none";
+ chatBox.style.display = "none";
+ eviBox.style.opacity = "0";
+ eviBox.style.height = "0%";
const shouts = {
"1": "holdit",
- "2": "takethat",
- "3": "objection"
+ "2": "objection",
+ "3": "takethat"
};
- let shout = shouts[this.chatmsg.objection];
- if (typeof shout !== "undefined") {
- document.getElementById("client_char").src = AO_HOST + "misc/" + shout + ".gif";
- (new Audio(`${AO_HOST}/characters/${this.chatmsg.name}/${shout}.wav`)).play();
- this.shoutTimer = 800;
+ const shout = shouts[this.chatmsg.objection];
+ if (shout) {
+ shoutSprite.src = client.resources[shout]["src"];
+ (new Audio(`${AO_HOST}characters/${this.chatmsg.name.toLowerCase()}/${shout}.wav`)).play();
+ this.shoutTimer = 850;
} else {
this.shoutTimer = 0;
}
this.chatmsg.isnew = false;
- this.chatmsg.startspeaking = true;
+ this.chatmsg.startpreanim = true;
}
- if (this.textTimer >= this.shoutTimer) {
- if (this.chatmsg.startspeaking) {
+ if (this.textTimer >= this.shoutTimer && this.chatmsg.startpreanim) {
+ // Effect stuff
+ if (this.chatmsg.flash === 2) {
+ // Shake screen
+ this.sfxaudio.pause();
+ this.sfxplayed = 1;
+ this.sfxaudio.src = AO_HOST + "sounds/general/sfx-stab.wav";
+ this.sfxaudio.play();
+ $("#client_gamewindow").effect("shake", {
+ "direction": "up"
+ });
+ } else if (this.chatmsg.flash === 1) {
+ // Flash screen
+ background.style.backgroundColor = "white";
+ this.sfxaudio.pause();
+ this.sfxplayed = 1;
+ this.sfxaudio.src = AO_HOST + "sounds/general/sfx-realization.wav";
+ this.sfxaudio.play();
+ $("#client_gamewindow").effect("pulsate");
+ }
+
+ // Pre-animation stuff
+ if (this.chatmsg.preanimdelay > 0) {
+ shoutSprite.src = "misc/placeholder.gif";
changeBackground(this.chatmsg.side);
- document.getElementById("client_char").src = AO_HOST + "characters/" + escape(this.chatmsg.name) + "/" + this.chatmsg.speaking + ".gif";
- document.getElementById("client_name").style.fontSize = (document.getElementById("client_name").offsetHeight * 0.7) + "px";
- document.getElementById("client_chat").style.fontSize = (document.getElementById("client_chat").offsetHeight * 0.25) + "px";
- document.getElementById("client_name").innerHTML = "<p>" + escapeHtml(this.chatmsg.nameplate) + "</p>";
+ const charName = escape(this.chatmsg.name.toLowerCase());
+ const preanim = this.chatmsg.preanim.toLowerCase();
+ charSprite.src = `${AO_HOST}characters/${charName}/${preanim}.gif`;
+ }
+
+ this.chatmsg.startpreanim = false;
+ this.chatmsg.startspeaking = true;
+ } else if (this.textTimer >= this.shoutTimer + this.chatmsg.preanimdelay && !this.chatmsg.startpreanim) {
+ if (this.chatmsg.startspeaking) {
+ if (this.chatmsg.evidence > 0) {
+ // Prepare evidence
+ eviBox.style.backgroundImage = "url('" + client.evidences[this.chatmsg.evidence - 1].icon + "')";
+
+ if (this.chatmsg.side === "def") {
+ // Only def show evidence on right
+ eviBox.style.right = "1.5em";
+ eviBox.style.left = "initial";
+ $("#client_evi").animate({
+ height: "30%",
+ opacity: 1
+ }, 250);
+ } else {
+ eviBox.style.right = "initial";
+ eviBox.style.left = "1.5em";
+ $("#client_evi").animate({
+ height: "30%",
+ opacity: 1
+ }, 250);
+ }
+ }
+
+ nameBox.style.display = "block";
+ nameBox.style.fontSize = (nameBox.offsetHeight * 0.7) + "px";
+
+ while (nameBox.hasChildNodes()) {
+ nameBox.removeChild(nameBox.firstChild);
+ }
+ nameBox.appendChild(document.createTextNode(this.chatmsg.nameplate));
+
+ chatBox.style.display = "block";
+ chatBox.style.fontSize = (chatBox.offsetHeight * 0.25) + "px";
const colors = {
"0": "#ffffff",
@@ -707,39 +1199,51 @@ class Viewport {
"4": "#0000ff",
"5": "#ffff00",
"6": "#aa00aa"
- }
- let stylecolor = "color: " + (colors[this.chatmsg.color] || "#ffffff");
- document.getElementById("client_inner_chat").style = stylecolor;
+ };
+ chatBoxInner.style.color = colors[this.chatmsg.color] || "#ffffff";
this.chatmsg.startspeaking = false;
- if (this.textnow == this.chatmsg.content) {
- document.getElementById("client_char").src = AO_HOST + "characters/" + escape(this.chatmsg.name) + "/" + this.chatmsg.silent + ".gif";
+ if (this.chatmsg.preanimdelay === 0) {
+ shoutSprite.src = "misc/placeholder.gif";
+ changeBackground(this.chatmsg.side);
+ }
+
+ charSprite.src = AO_HOST + "characters/" + escape(this.chatmsg.name.toLowerCase()) + "/" + this.chatmsg.speaking.toLowerCase() + ".gif";
+
+ if (this.textnow === this.chatmsg.content) {
+ charSprite.src = AO_HOST + "characters/" + escape(this.chatmsg.name.toLowerCase()) + "/" + this.chatmsg.silent.toLowerCase() + ".gif";
this._animating = false;
clearTimeout(this.updater);
}
} else {
- if (this.textnow != this.chatmsg.content) {
- if (this.chatmsg.content.charAt(this.textnow.length) != " ") {
+ if (this.textnow !== this.chatmsg.content) {
+ if (this.chatmsg.content.charAt(this.textnow.length) !== " ") {
this.blipChannels[this.currentBlipChannel].play();
this.currentBlipChannel++;
this.currentBlipChannel %= this.blipChannels.length;
}
this.textnow = this.chatmsg.content.substring(0, this.textnow.length + 1);
- document.getElementById("client_inner_chat").innerHTML = this.textnow;
- if (this.textnow == this.chatmsg.content) {
+
+ while (chatBoxInner.hasChildNodes()) {
+ chatBoxInner.removeChild(chatBoxInner.firstChild);
+ }
+ chatBoxInner.appendChild(document.createTextNode(this.textnow));
+
+ if (this.textnow === this.chatmsg.content) {
this.textTimer = 0;
this._animating = false;
- document.getElementById("client_char").src = AO_HOST + "characters/" + escape(this.chatmsg.name) + "/" + this.chatmsg.silent + ".gif";
+ charSprite.src = AO_HOST + "characters/" + escape(this.chatmsg.name.toLowerCase()) + "/" + this.chatmsg.silent.toLowerCase() + ".gif";
clearTimeout(this.updater);
}
}
}
}
+
if (!this.sfxplayed && this.chatmsg.snddelay + this.shoutTimer >= this.textTimer) {
this.sfxaudio.pause();
this.sfxplayed = 1;
- if (this.chatmsg.sound != "0" && this.chatmsg.sound != "1") {
- this.sfxaudio.src = AO_HOST + "sounds/general/" + escape(this.chatmsg.sound) + ".wav";
+ if (this.chatmsg.sound !== "0" && this.chatmsg.sound !== "1") {
+ this.sfxaudio.src = AO_HOST + "sounds/general/" + escape(this.chatmsg.sound.toLowerCase()) + ".wav";
this.sfxaudio.play();
}
}
@@ -749,31 +1253,31 @@ class Viewport {
class INI {
static parse(data) {
- let regex = {
+ const regex = {
section: /^\s*\[\s*([^\]]*)\s*\]\s*$/,
- param: /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/,
+ param: /^\s*([\w.\-_]+)\s*=\s*(.*?)\s*$/,
comment: /^\s*;.*$/
};
- let value = {};
- let lines = data.split(/\r\n|\r|\n/);
- let section = null;
- lines.forEach(function(line) {
+ const value = {};
+ const lines = data.split(/\r\n|\r|\n/);
+ let section;
+ lines.forEach(function (line) {
if (regex.comment.test(line)) {
return;
- } else if (line.length == 0) {
+ } else if (line.length === 0) {
return;
} else if (regex.param.test(line)) {
- let match = line.match(regex.param);
+ const match = line.match(regex.param);
if (section) {
value[section][match[1]] = match[2];
} else {
value[match[1]] = match[2];
}
} else if (regex.section.test(line)) {
- let match = line.match(regex.section);
+ const match = line.match(regex.section);
value[match[1]] = {};
section = match[1];
- };
+ }
});
return value;
}
@@ -784,7 +1288,7 @@ class INI {
* @param {KeyboardEvent} event
*/
export function onOOCEnter(event) {
- if (event.keyCode == 13) {
+ if (event.keyCode === 13) {
client.sendOOC(document.getElementById("client_oocinputbox").value);
document.getElementById("client_oocinputbox").value = "";
}
@@ -796,16 +1300,23 @@ window.onOOCEnter = onOOCEnter;
* @param {KeyboardEvent} event
*/
export function onEnter(event) {
- if (event.keyCode == 13) {
- let mychar = client.me();
- let myemo = client.myEmote();
+ if (event.keyCode === 13) {
+ const mychar = client.character;
+ const myemo = client.emote;
+ const myevi = client.evidence;
+ const myflip = ((client.flip) ? 1 : 0);
+ const mycolor = document.getElementById("textcolor").value;
let ssfxname = "0";
let ssfxdelay = "0";
if (document.getElementById("sendsfx").checked) {
ssfxname = myemo.sfx;
ssfxdelay = myemo.sfxdelay;
}
- client.sendIC(myemo.speaking, mychar.name, myemo.silent, document.getElementById("client_inputbox").value, mychar.side, ssfxname, myemo.zoom, ssfxdelay, selectedShout);
+
+ client.sendIC(myemo.speaking, mychar.name, myemo.silent,
+ document.getElementById("client_inputbox").value, mychar.side,
+ ssfxname, myemo.zoom, ssfxdelay, selectedShout, myevi, myflip,
+ selectedEffect, mycolor);
}
}
window.onEnter = onEnter;
@@ -817,6 +1328,10 @@ window.onEnter = onEnter;
*/
function resetICParams() {
document.getElementById("client_inputbox").value = "";
+ if (selectedEffect) {
+ document.getElementById("button_effect_" + selectedEffect).className = "client_button";
+ selectedEffect = 0;
+ }
if (selectedShout) {
document.getElementById("button_" + selectedShout).className = "client_button";
selectedShout = 0;
@@ -827,13 +1342,28 @@ function resetICParams() {
* Triggered when an item on the music list is clicked.
* @param {MouseEvent} event
*/
-export function musiclist_click(event) {
- let playtrack = document.getElementById("client_musiclist").value;
+export function musiclist_click(_event) {
+ const playtrack = document.getElementById("client_musiclist").value;
client.sendMusicChange(playtrack);
}
window.musiclist_click = musiclist_click;
/**
+ * Triggered when an item on the area list is clicked.
+ * @param {MouseEvent} event
+ */
+export function area_click(el) {
+ const area = el.textContent;
+ client.sendMusicChange(area);
+
+ const areaHr = document.createElement("div");
+ areaHr.className = "hrtext";
+ areaHr.textContent = `switched to ${el.textContent}`;
+ document.getElementById("client_log").appendChild(areaHr);
+}
+window.area_click = area_click;
+
+/**
* Triggered by the music volume slider.
*/
export function changeMusicVolume() {
@@ -853,7 +1383,7 @@ window.changeSFXVolume = changeSFXVolume;
* Triggered by the blip volume slider.
*/
export function changeBlipVolume() {
- viewport.setBlipVolume(document.getElementById("client_bvolume").value / 100);
+ viewport.blipVolume = document.getElementById("client_bvolume").value / 100;
}
window.changeBlipVolume = changeBlipVolume;
@@ -861,7 +1391,7 @@ window.changeBlipVolume = changeBlipVolume;
* Triggered when a character icon is clicked in the character selection menu.
* @param {MouseEvent} event
*/
-export function changeCharacter(event) {
+export function changeCharacter(_event) {
client.sendLeaveRoom();
document.getElementById("client_charselect").style.display = "block";
document.getElementById("client_emo").innerHTML = "";
@@ -874,7 +1404,7 @@ window.changeCharacter = changeCharacter;
*/
export function imgError(image) {
image.onerror = "";
- image.src = "/misc/placeholder.gif";
+ image.src = "misc/placeholder.gif";
return true;
}
window.imgError = imgError;
@@ -891,13 +1421,50 @@ export function demoError(image) {
window.demoError = demoError;
/**
- * Checks if an image exists at the specified URI.
+ * Make a GET request for a specific URI.
+ * @param {string} url the URI to be requested
+ * @returns response data
+ * @throws {Error} if status code is not 2xx, or a network error occurs
+ */
+async function request(url) {
+ return new Promise((resolve, reject) => {
+ const xhr = new XMLHttpRequest();
+ xhr.addEventListener("error", () => {
+ const err = new Error(`Request for ${url} failed: ${xhr.statusText}`);
+ err.code = xhr.status;
+ reject(err);
+ });
+ xhr.addEventListener("abort", () => {
+ const err = new Error(`Request for ${url} was aborted!`);
+ err.code = xhr.status;
+ reject(err);
+ });
+ xhr.addEventListener("load", () => {
+ if (xhr.status < 200 || xhr.status >= 300) {
+ const err = new Error(`Request for ${url} failed with status code ${xhr.status}`);
+ err.code = xhr.status;
+ reject(err);
+ } else {
+ resolve(xhr.response);
+ }
+ });
+ xhr.open("GET", url, true);
+ xhr.send();
+ });
+}
+
+/**
+ * Checks if a file exists at the specified URI.
* @param {string} url the URI to be checked
*/
-function ImageExist(url) {
- var img = new Image();
- img.src = url;
- return img.height != 0;
+async function fileExists(url) {
+ try {
+ await request(url);
+ return true;
+ } catch (err) {
+ if (err.code >= 400) return false;
+ else throw err;
+ }
}
/**
@@ -906,46 +1473,56 @@ function ImageExist(url) {
* Valid positions: `def, pro, hld, hlp, wit, jud`
* @param {string} position the position to change into
*/
-function changeBackground(position) {
- var standname;
- let bgfolder = viewport.bgFolder();
+async function changeBackground(position) {
+ const bgfolder = viewport.bgFolder;
+
+ const positions = {
+ def: {
+ bg: "defenseempty.png",
+ desk: { ao2: "defensedesk.png", ao1: "bancodefensa.png" },
+ speedLines: "defense_speedlines.gif"
+ },
+ pro: {
+ bg: "prosecutorempty.png",
+ desk: { ao2: "prosecutiondesk.png", ao1: "bancoacusacion.png" },
+ speedLines: "prosecution_speedlines.gif"
+ },
+ hld: {
+ bg: "helperstand.png",
+ desk: null,
+ speedLines: "defense_speedlines.gif"
+ },
+ hlp: {
+ bg: "prohelperstand.png",
+ desk: null,
+ speedLines: "prosecution_speedlines.gif"
+ },
+ wit: {
+ bg: "witnessempty.png",
+ desk: { ao2: "stand.png", ao1: "estrado.png" },
+ speedLines: "prosecution_speedlines.gif"
+ },
+ jud: {
+ bg: "judgestand.png",
+ desk: null,
+ speedLines: "prosecution_speedlines.gif"
+ }
+ };
+
+ const { bg, desk, speedLines } = positions[position];
document.getElementById("client_fg").style.display = "none";
- document.getElementById("client_bench").style.display = "none";
- switch (position) {
- case "def":
- document.getElementById("client_court").src = bgfolder + "defenseempty.png"
+
+ if (viewport.chatmsg.type === 5) {
+ document.getElementById("client_court").src = `${AO_HOST}themes/default/${speedLines}`;
+ } else {
+ document.getElementById("client_court").src = bgfolder + bg;
+ if (desk) {
+ const deskFilename = await fileExists(bgfolder + desk.ao2) ? desk.ao2 : desk.ao1;
+ document.getElementById("client_bench").src = bgfolder + deskFilename;
document.getElementById("client_bench").style.display = "block";
- document.getElementById("client_bench").src = bgfolder + "defensedesk.png"
- standname = "defense";
- break;
- case "pro":
- document.getElementById("client_court").src = bgfolder + "prosecutorempty.png"
- document.getElementById("client_bench").style.display = "block"
- document.getElementById("client_bench").src = bgfolder + "prosecutiondesk.png"
- standname = "prosecution";
- break;
- case "hld":
- document.getElementById("client_court").src = bgfolder + "helperstand.png"
- standname = "defense";
- break;
- case "hlp":
- document.getElementById("client_court").src = bgfolder + "prohelperstand.png"
- standname = "prosecution";
- break;
- case "wit":
- document.getElementById("client_court").src = bgfolder + "witnessempty.png"
- document.getElementById("client_bench").style.display = "block"
- document.getElementById("client_bench").src = bgfolder + "estrado.png"
- standname = "prosecution";
- break;
- case "jud":
- document.getElementById("client_court").src = bgfolder + "judgestand.png"
- standname = "prosecution";
- break;
- }
- if (viewport.chatmsg.type == 5) {
- document.getElementById("client_bench").style.display = "none";
- document.getElementById("client_court").src = AO_HOST + "themes/default/" + standname + "_speedlines.gif";
+ } else {
+ document.getElementById("client_bench").style.display = "none";
+ }
}
}
@@ -972,16 +1549,16 @@ window.RetryButton = RetryButton;
/**
* Appends a message to the in-character chat log.
- * @param {string} toadd the string to be added
+ * @param {string} msg the string to be added
* @param {string} name the name of the sender
*/
-function appendICLog(toadd, name = "", time = new Date()) {
+function appendICLog(msg, name = "", time = new Date()) {
const entry = document.createElement("p");
const nameField = document.createElement("span");
nameField.id = "iclog_name";
nameField.appendChild(document.createTextNode(name));
entry.appendChild(nameField);
- entry.appendChild(document.createTextNode(toadd));
+ entry.appendChild(document.createTextNode(msg));
// Only put a timestamp if the minute has changed.
if (lastICMessageTime.getMinutes() !== time.getMinutes()) {
@@ -997,7 +1574,8 @@ function appendICLog(toadd, name = "", time = new Date()) {
const clientLog = document.getElementById("client_log");
clientLog.appendChild(entry);
- if (clientLog.scrollTop > clientLog.scrollHeight - 600) {
+ /* This is a little buggy - some troubleshooting might be desirable */
+ if (clientLog.scrollTop > clientLog.scrollHeight - 800) {
clientLog.scrollTop = clientLog.scrollHeight;
}
@@ -1006,9 +1584,10 @@ function appendICLog(toadd, name = "", time = new Date()) {
/**
* Requests to play as a character.
- * @param {number} ccharacter the character ID; if this is a large number, then spectator is chosen instead.
+ * @param {number} ccharacter the character ID; if this is a large number,
+ * then spectator is chosen instead.
*/
-export function pickchar(ccharacter) {
+export function pickChar(ccharacter) {
if (ccharacter < 1000) {
client.sendCharacter(ccharacter);
} else {
@@ -1018,28 +1597,361 @@ export function pickchar(ccharacter) {
document.getElementById("client_emo").style.display = "none";
}
}
-window.pickchar = pickchar;
+window.pickChar = pickChar;
/**
* Highlights and selects an emotion for in-character chat.
* @param {string} emo the new emotion to be selected
*/
-export function pickemotion(emo) {
- if (client.selectedEmote != -1) {
- document.getElementById("emo_" + client.selectedEmote).src = client.myEmote().button_off;
+export function pickEmotion(emo) {
+ if (client.selectedEmote !== -1) {
+ document.getElementById("emo_" + client.selectedEmote).src = client.emote.button_off;
+ }
+ client.selectedEmote = emo;
+ document.getElementById("emo_" + emo).src = client.emote.button_on;
+}
+window.pickEmotion = pickEmotion;
+
+/**
+ * Highlights and selects an evidence for in-character chat.
+ * @param {string} evidence the evidence to be presented
+ */
+export function pickEvidence(evidence) {
+ if (client.selectedEvidence !== evidence) {
+ //Update selected evidence
+ if (client.selectedEvidence > 0) {
+ document.getElementById("evi_" + client.selectedEvidence).className = "client_button";
+ }
+ document.getElementById("evi_" + evidence).className = "client_button dark";
+ client.selectedEvidence = evidence;
+
+ // Show evidence on information window
+ document.getElementById("evi_name").value = client.evidences[evidence - 1].name;
+ document.getElementById("evi_desc").value = client.evidences[evidence - 1].desc;
+
+ // Update icon
+ const icon_id = getIndexFromSelect("evi_select", client.evidences[evidence - 1].filename);
+ document.getElementById("evi_select").selectedIndex = icon_id;
+ if (icon_id === 0) {
+ document.getElementById("evi_filename").value = client.evidences[evidence - 1].filename;
+ }
+ updateEvidenceIcon();
+
+ // Update button
+ document.getElementById("evi_add").className = "client_button hover_button inactive";
+ document.getElementById("evi_edit").className = "client_button hover_button";
+ document.getElementById("evi_cancel").className = "client_button hover_button";
+ document.getElementById("evi_del").className = "client_button hover_button";
+ } else {
+ cancelEvidence();
+ }
+}
+window.pickEvidence = pickEvidence;
+
+/**
+ * Add evidence.
+ */
+export function addEvidence() {
+ const evidence_select = document.getElementById("evi_select");
+ client.sendPE(document.getElementById("evi_name").value,
+ document.getElementById("evi_desc").value,
+ evidence_select.selectedIndex === 0 ?
+ document.getElementById("evi_filename").value :
+ evidence_select.options[evidence_select.selectedIndex].text
+ );
+ cancelEvidence();
+}
+window.addEvidence = addEvidence;
+
+/**
+ * Edit selected evidence.
+ */
+export function editEvidence() {
+ const evidence_select = document.getElementById("evi_select");
+ const id = parseInt(client.selectedEvidence) - 1;
+ client.sendEE(id,
+ document.getElementById("evi_name").value,
+ document.getElementById("evi_desc").value,
+ evidence_select.selectedIndex === 0 ?
+ document.getElementById("evi_filename").value :
+ evidence_select.options[evidence_select.selectedIndex].text
+ );
+ cancelEvidence();
+}
+window.editEvidence = editEvidence;
+
+/**
+ * Delete selected evidence.
+ */
+export function deleteEvidence() {
+ const id = parseInt(client.selectedEvidence) - 1;
+ client.sendDE(id);
+ cancelEvidence();
+}
+window.deleteEvidence = deleteEvidence;
+
+/**
+ * Cancel evidence selection.
+ */
+export function cancelEvidence() {
+ //Clear evidence data
+ if (client.selectedEvidence > 0) {
+ document.getElementById("evi_" + client.selectedEvidence).className = "client_button";
+ }
+ client.selectedEvidence = 0;
+
+ // Clear evidence on information window
+ document.getElementById("evi_select").selectedIndex = 0;
+ updateEvidenceIcon(); // Update icon widget
+ document.getElementById("evi_filename").value = "";
+ document.getElementById("evi_name").value = "";
+ document.getElementById("evi_desc").value = "";
+ document.getElementById("evi_icon").style.backgroundImage = "url('misc/empty.png')"; //Clear icon
+
+ // Update button
+ document.getElementById("evi_add").className = "client_button hover_button";
+ document.getElementById("evi_edit").className = "client_button hover_button inactive";
+ document.getElementById("evi_cancel").className = "client_button hover_button inactive";
+ document.getElementById("evi_del").className = "client_button hover_button inactive";
+}
+window.cancelEvidence = cancelEvidence;
+
+/**
+ * Find index of anything in select box.
+ * @param {string} select_box the select element name
+ * @param {string} value the value that need to be compared
+ */
+export function getIndexFromSelect(select_box, value) {
+ //Find if icon alraedy existed in select box
+ const select_element = document.getElementById(select_box);
+ for (let i = 1; i < select_element.length; ++i) {
+ if (select_element.options[i].value === value) {
+ return i;
+ }
+ }
+ return 0;
+}
+window.getIndexFromSelect = getIndexFromSelect;
+
+/**
+ * Update evidence icon.
+ */
+export function updateEvidenceIcon() {
+ const evidence_select = document.getElementById("evi_select");
+ const evidence_filename = document.getElementById("evi_filename");
+ const evidence_iconbox = document.getElementById("evi_icon");
+
+ if (evidence_select.selectedIndex === 0) {
+ evidence_filename.style.display = "initial";
+ evidence_iconbox.style.backgroundImage = `url(${AO_HOST}evidence/${evidence_filename.value.toLowerCase()})`;
+ } else {
+ evidence_filename.style.display = "none";
+ evidence_iconbox.style.backgroundImage = `url(${AO_HOST}evidence/${evidence_select.value.toLowerCase()})`;
+ }
+}
+window.updateEvidenceIcon = updateEvidenceIcon;
+
+/**
+ * Update evidence icon.
+ */
+export function updateActionCommands(side) {
+ if (side === "jud") {
+ document.getElementById("judge_action").style.display = "inline-table";
+ document.getElementById("no_action").style.display = "none";
+ } else {
+ document.getElementById("judge_action").style.display = "none";
+ document.getElementById("no_action").style.display = "inline-table";
+ }
+
+ // Update role selector
+ for (let i = 0, role_select = document.getElementById("role_select").options; i < role_select.length; i++) {
+ if (side === role_select[i].value) {
+ role_select.selectedIndex = i;
+ return;
+ }
+ }
+}
+window.updateActionCommands = updateActionCommands;
+
+/**
+ * Change background via OOC.
+ */
+export function changeBackgroundOOC() {
+ const selectedBG = document.getElementById("bg_select");
+ const changeBGCommand = document.getElementById("bg_command").value;
+ const bgFilename = document.getElementById("bg_filename");
+
+ let filename = "";
+ if (selectedBG.selectedIndex === 0) {
+ filename = bgFilename.value;
+ } else {
+ filename = selectedBG.value;
}
- client.selectedEmote = emo
- document.getElementById("emo_" + emo).src = client.myEmote().button_on;
+ client.sendOOC("/" + changeBGCommand.replace("$1", filename));
}
-window.pickemotion = pickemotion;
+window.changeBackgroundOOC = changeBackgroundOOC;
+
+/**
+ * Change role via OOC.
+ */
+export function changeRoleOOC() {
+ const role_select = document.getElementById("role_select");
+ const role_command = document.getElementById("role_command").value;
+
+ client.sendOOC("/" + role_command.replace("$1", role_select.value));
+ updateActionCommands(role_select.value);
+}
+window.changeRoleOOC = changeRoleOOC;
+
+/**
+ * Random character via OOC.
+ */
+export function randomCharacterOOC() {
+ client.sendOOC("/" + document.getElementById("randomchar_command").value);
+}
+window.randomCharacterOOC = randomCharacterOOC;
+
+/**
+ * Call mod.
+ */
+export function callMod() {
+ $("#callmod_dialog").dialog("open");
+}
+window.callMod = callMod;
+
+/**
+ * Declare witness testimony.
+ */
+export function initWT() {
+ client.sendRT("testimony1");
+}
+window.initWT = initWT;
+
+/**
+ * Declare cross examination.
+ */
+export function initCE() {
+ client.sendRT("testimony2");
+}
+window.initCE = initCE;
+
+/**
+ * Increment defense health point.
+ */
+export function addHPD() {
+ client.sendHP(1, String(parseInt(client.hp[0]) + 1));
+}
+window.addHPD = addHPD;
+
+/**
+ * Decrement defense health point.
+ */
+export function redHPD() {
+ client.sendHP(1, String(parseInt(client.hp[0]) - 1));
+}
+window.redHPD = redHPD;
+
+/**
+ * Increment prosecution health point.
+ */
+export function addHPP() {
+ client.sendHP(2, String(parseInt(client.hp[1]) + 1));
+}
+window.addHPP = addHPP;
+
+/**
+ * Decrement prosecution health point.
+ */
+export function redHPP() {
+ client.sendHP(2, String(parseInt(client.hp[1]) - 1));
+}
+window.redHPP = redHPP;
+
+/**
+ * Update background preview.
+ */
+export function updateBackgroundPreview() {
+ const background_select = document.getElementById("bg_select");
+ const background_filename = document.getElementById("bg_filename");
+ const background_preview = document.getElementById("bg_preview");
+
+ if (background_select.selectedIndex === 0) {
+ background_filename.style.display = "initial";
+ background_preview.src = AO_HOST + "background/" + background_filename.value.toLowerCase() + "/defenseempty.png";
+ } else {
+ background_filename.style.display = "none";
+ background_preview.src = AO_HOST + "background/" + background_select.value.toLowerCase() + "/defenseempty.png";
+ }
+}
+window.updateBackgroundPreview = updateBackgroundPreview;
+
+/**
+ * Highlights and selects an effect for in-character chat.
+ * If the same effect button is selected, then the effect is canceled.
+ * @param {string} effect the new effect to be selected
+ */
+export function toggleEffect(effect) {
+ if (effect === selectedEffect) {
+ document.getElementById("button_effect_" + effect).className = "client_button";
+ selectedEffect = 0;
+ } else {
+ document.getElementById("button_effect_" + effect).className = "client_button dark";
+ if (selectedEffect) {
+ document.getElementById("button_effect_" + selectedEffect).className = "client_button";
+ }
+ selectedEffect = effect;
+ }
+}
+window.toggleEffect = toggleEffect;
+
+/**
+ * Toggle flip for in-character chat.
+ */
+export function toggleFlip() {
+ if (client.flip) {
+ document.getElementById("button_flip").className = "client_button";
+ } else {
+ document.getElementById("button_flip").className = "client_button dark";
+ }
+ client.flip = !client.flip;
+}
+window.toggleFlip = toggleFlip;
+
+/**
+ * Toggle presentable for presenting evidence in-character chat.
+ */
+export function togglePresent() {
+ if (client.presentable) {
+ document.getElementById("button_present").className = "client_button";
+ } else {
+ document.getElementById("button_present").className = "client_button dark";
+ }
+ client.presentable = !client.presentable;
+}
+window.togglePresent = togglePresent;
+
+/**
+ * Highlights and selects a menu.
+ * @param {string} menu the menu to be selected
+ */
+export function toggleMenu(menu) {
+ if (menu !== selectedMenu) {
+ document.getElementById("menu_" + menu).className = "menu_icon active";
+ document.getElementById("content_" + menu).className = "menu_content active";
+ document.getElementById("menu_" + selectedMenu).className = "menu_icon";
+ document.getElementById("content_" + selectedMenu).className = "menu_content";
+ selectedMenu = menu;
+ }
+}
+window.toggleMenu = toggleMenu;
/**
* Highlights and selects a shout for in-character chat.
* If the same shout button is selected, then the shout is canceled.
* @param {string} shout the new shout to be selected
*/
-export function toggleshout(shout) {
- if (shout == selectedShout) {
+export function toggleShout(shout) {
+ if (shout === selectedShout) {
document.getElementById("button_" + shout).className = "client_button";
selectedShout = 0;
} else {
@@ -1050,7 +1962,7 @@ export function toggleshout(shout) {
selectedShout = shout;
}
}
-window.toggleshout = toggleshout;
+window.toggleShout = toggleShout;
/**
* Escapes a string to be HTML-safe.
@@ -1079,27 +1991,80 @@ function escapeChat(estring) {
.replace(/\$/g, "<dollar>");
}
-// TODO: Possibly safe to remove, since we are using a transpiler.
-if (typeof(String.prototype.trim) === "undefined")
-{
- String.prototype.trim = function()
- {
- return String(this).replace(/^\s+|\s+$/g, '');
- };
+/**
+ * Unescapes a string to AO1 escape codes.
+ * @param {string} estring the string to be unescaped
+ */
+function unescapeChat(estring) {
+ return estring
+ .replace(/<pound>/g, "#")
+ .replace(/<and>/g, "&")
+ .replace(/<percent>/g, "%")
+ .replace(/<dollar>/g, "$");
+}
+
+/**
+ * Encode text on client side.
+ * @param {string} estring the string to be encoded
+ */
+function encodeChat(estring) {
+ const selectedEncoding = document.getElementById("client_encoding").value;
+ if (selectedEncoding === "unicode") {
+ // This approach works by escaping all special characters to Unicode escape sequences.
+ // Source: https://gist.github.com/mathiasbynens/1243213
+ return estring.replace(/[^\0-~]/g, function (ch) {
+ return "\\u" + ("000" + ch.charCodeAt().toString(16)).slice(-4);
+ });
+ } else if (selectedEncoding === "utf16") {
+ // Source: https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String
+ const buffer = new ArrayBuffer(estring.length * 2);
+ const result = new Uint16Array(buffer);
+ for (let i = 0, strLen = estring.length; i < strLen; i++) {
+ result[i] = estring.charCodeAt(i);
+ }
+ return String(result);
+ } else {
+ return estring;
+ }
}
-// Used for HDID calculation.
-String.prototype.hashCode = function() {
- var hash = 0, i, chr;
- if (this.length === 0) return hash;
- for (i = 0; i < this.length; i++) {
- chr = this.charCodeAt(i);
- hash = ((hash << 5) - hash) + chr;
- hash |= 0; // Convert to 32bit integer
+/**
+ * Decodes text on client side.
+ * @param {string} estring the string to be decoded
+ */
+function decodeChat(estring) {
+ const selectedDecoding = document.getElementById("client_decoding").value;
+ if (selectedDecoding === "unicode") {
+ // Source: https://stackoverflow.com/questions/7885096/how-do-i-decode-a-string-with-escaped-unicode
+ return estring.replace(/\\u([\d\w]{1,})/gi, function (match, group) {
+ return String.fromCharCode(parseInt(group, 16));
+ });
+ } else if (selectedDecoding === "utf16") {
+ // Source: https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String
+ return String.fromCharCode.apply(null, new Uint16Array(estring.split(",")));
+ } else {
+ return estring;
}
- return hash;
-};
+}
+/**
+ * Decoding text on client side.
+ * @param {string} estring the string to be decoded
+ */
+function decodeBBCode(estring) {
+ return estring
+ .replace(/\\n/g, "<br>") // Newline \n
+ .replace(/\[(\/?)b\]/g, "<$1b>") // Bold [b][/b]
+ .replace(/\[(\/?)i\]/g, "<$1i>") // Italic [i][/i]
+ .replace(/\[(\/?)s\]/g, "<$1del>") // Strikethrough [s][/s]
+ .replace(/\[(\/?)u\]/g, "<$1u>") // Underline [u][/u]
+ .replace(/\[(\/?)sub\]/g, "<$1sub>") // Subscript [sub][/sub]
+ .replace(/\[(\/?)sup\]/g, "<$1sup>") // Superscript [sup][/sup]
+ .replace(/\[m=([#a-zA-Z0-9]+)\]/g, "<m a=\"$1\">") // Markup [m=#0ff]
+ .replace(/\[(\/?)m\]/g, "<$1m>") // [m][/m]
+ .replace(/\[c=?([#a-zA-Z0-9]+)\]/g, "<c a=\"$1\">") // Color [c=red]
+ .replace(/\[\/c\]/g, "</c>"); // [/c]
+}
//
// Client code
@@ -1107,3 +2072,39 @@ String.prototype.hashCode = function() {
let client = new Client(serverIP);
let viewport = new Viewport();
+
+$(document).ready(function () {
+ client.initialObservBBCode();
+ client.loadResources();
+});
+
+// Create dialog and link to button
+$(function () {
+ $("#callmod_dialog").dialog({
+ autoOpen: false,
+ resizable: false,
+ show: {
+ effect: "drop",
+ direction: "down",
+ duration: 500
+ },
+ hide: {
+ effect: "drop",
+ direction: "down",
+ duration: 500
+ },
+ height: "auto",
+ width: 400,
+ modal: true,
+ buttons: {
+ Sure: function () {
+ const reason = prompt("Please enter the reason", "");
+ client.sendZZ(reason);
+ $(this).dialog("close");
+ },
+ Cancel: function () {
+ $(this).dialog("close");
+ }
+ }
+ });
+});
diff --git a/webAO/evidence.js b/webAO/evidence.js
new file mode 100644
index 0000000..99896c8
--- /dev/null
+++ b/webAO/evidence.js
@@ -0,0 +1,10 @@
+export default [
+ "1.png",
+ "2.png",
+ "3.png",
+ "4.png",
+ "5.png",
+ "6.png",
+ "empty.png",
+ "lawyerbadge.png"
+]; \ No newline at end of file
diff --git a/webAO/fingerprint.b.js b/webAO/fingerprint.b.js
new file mode 100644
index 0000000..e99f7f9
--- /dev/null
+++ b/webAO/fingerprint.b.js
@@ -0,0 +1,2 @@
+!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};var o=function e(t){var n,o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),n=Array.prototype.forEach,o=Array.prototype.map,this.each=function(e,t,r){if(null!==e)if(n&&e.forEach===n)e.forEach(t,r);else if(e.length===+e.length){for(var o=0,i=e.length;o<i;o++)if(t.call(r,e[o],o,e)==={})return}else for(var a in e)if(e.hasOwnProperty(a)&&t.call(r,e[a],a,e)==={})return},this.map=function(e,t,n){var r=[];return null==e?r:o&&e.map===o?e.map(t,n):(this.each(e,function(e,o,i){r[r.length]=t.call(n,e,o,i)}),r)},"object"==(void 0===t?"undefined":r(t))?(this.hasher=t.hasher,this.screen_resolution=t.screen_resolution,this.screen_orientation=t.screen_orientation,this.canvas=t.canvas,this.ie_activex=t.ie_activex):"function"==typeof t&&(this.hasher=t)};t.default=o,o.prototype={get:function(){var e=[];(e.push(navigator.userAgent),e.push(navigator.language),e.push(screen.colorDepth),this.screen_resolution)&&(void 0!==this.getScreenResolution()&&e.push(this.getScreenResolution().join("x")));return e.push((new Date).getTimezoneOffset()),e.push(this.hasSessionStorage()),e.push(this.hasLocalStorage()),e.push(!!window.indexedDB),document.body?e.push(r(document.body.addBehavior)):e.push("undefined"),e.push(r(window.openDatabase)),e.push(navigator.cpuClass),e.push(navigator.platform),e.push(navigator.doNotTrack),e.push(this.getPluginsString()),this.canvas&&this.isCanvasSupported()&&e.push(this.getCanvasFingerprint()),this.hasher?this.hasher(e.join("###"),31):this.murmurhash3_32_gc(e.join("###"),31)},murmurhash3_32_gc:function(e,t){var n,r,o,i,a,s,u,c;for(n=3&e.length,r=e.length-n,o=t,a=3432918353,s=461845907,c=0;c<r;)u=255&e.charCodeAt(c)|(255&e.charCodeAt(++c))<<8|(255&e.charCodeAt(++c))<<16|(255&e.charCodeAt(++c))<<24,++c,o=27492+(65535&(i=5*(65535&(o=(o^=u=(65535&(u=(u=(65535&u)*a+(((u>>>16)*a&65535)<<16)&4294967295)<<15|u>>>17))*s+(((u>>>16)*s&65535)<<16)&4294967295)<<13|o>>>19))+((5*(o>>>16)&65535)<<16)&4294967295))+((58964+(i>>>16)&65535)<<16);switch(u=0,n){case 3:u^=(255&e.charCodeAt(c+2))<<16;case 2:u^=(255&e.charCodeAt(c+1))<<8;case 1:o^=u=(65535&(u=(u=(65535&(u^=255&e.charCodeAt(c)))*a+(((u>>>16)*a&65535)<<16)&4294967295)<<15|u>>>17))*s+(((u>>>16)*s&65535)<<16)&4294967295}return o^=e.length,o=2246822507*(65535&(o^=o>>>16))+((2246822507*(o>>>16)&65535)<<16)&4294967295,o=3266489909*(65535&(o^=o>>>13))+((3266489909*(o>>>16)&65535)<<16)&4294967295,(o^=o>>>16)>>>0},hasLocalStorage:function(){try{return!!window.localStorage}catch(e){return!0}},hasSessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},isCanvasSupported:function(){var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))},isIE:function(){return"Microsoft Internet Explorer"===navigator.appName||!("Netscape"!==navigator.appName||!/Trident/.test(navigator.userAgent))},getPluginsString:function(){return this.isIE()&&this.ie_activex?this.getIEPluginsString():this.getRegularPluginsString()},getRegularPluginsString:function(){return this.map(navigator.plugins,function(e){var t=this.map(e,function(e){return[e.type,e.suffixes].join("~")}).join(",");return[e.name,e.description,t].join("::")},this).join(";")},getIEPluginsString:function(){if(window.ActiveXObject){return this.map(["ShockwaveFlash.ShockwaveFlash","AcroPDF.PDF","PDF.PdfCtrl","QuickTime.QuickTime","rmocx.RealPlayer G2 Control","rmocx.RealPlayer G2 Control.1","RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)","RealVideo.RealVideo(tm) ActiveX Control (32-bit)","RealPlayer","SWCtl.SWCtl","WMPlayer.OCX","AgControl.AgControl","Skype.Detection"],function(e){try{return new ActiveXObject(e),e}catch(e){return null}}).join(";")}return""},getScreenResolution:function(){return this.screen_orientation?screen.height>screen.width?[screen.height,screen.width]:[screen.width,screen.height]:[screen.height,screen.width]},getCanvasFingerprint:function(){var e=document.createElement("canvas"),t=e.getContext("2d"),n='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}|[]:"<>?;,.';return t.textBaseline="top",t.font="14px 'Arial'",t.textBaseline="alphabetic",t.fillStyle="#f60",t.fillRect(125,1,62,20),t.fillStyle="#069",t.fillText(n,2,15),t.fillStyle="rgba(102, 204, 0, 0.7)",t.fillText(n,4,17),e.toDataURL()}}}]);
+//# sourceMappingURL=fingerprint.b.js.map \ No newline at end of file
diff --git a/webAO/fingerprint.b.js.map b/webAO/fingerprint.b.js.map
new file mode 100644
index 0000000..d2de946
--- /dev/null
+++ b/webAO/fingerprint.b.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./webAO/evercookie.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Fingerprint","options","nativeForEach","nativeMap","_classCallCheck","this","Array","forEach","map","each","obj","iterator","context","length","results","index","list","_typeof","hasher","screen_resolution","screen_orientation","canvas","ie_activex","keys","push","navigator","userAgent","language","screen","colorDepth","getScreenResolution","join","Date","getTimezoneOffset","hasSessionStorage","hasLocalStorage","window","indexedDB","document","body","addBehavior","openDatabase","cpuClass","platform","doNotTrack","getPluginsString","isCanvasSupported","getCanvasFingerprint","murmurhash3_32_gc","seed","remainder","bytes","h1","h1b","c1","c2","k1","charCodeAt","localStorage","e","sessionStorage","elem","createElement","getContext","isIE","appName","test","getIEPluginsString","getRegularPluginsString","plugins","mimeTypes","mt","type","suffixes","description","ActiveXObject","height","width","ctx","txt","textBaseline","font","fillStyle","fillRect","fillText","toDataURL"],"mappings":"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","file":"fingerprint.b.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/*\r\n***************************************************\r\n** http://davealger.info\r\n***************************************************\r\n\r\nThis is a javascript only way to fingerprint a user with better than 90% accuracy in as few bytes as possible and no cookie storage!\r\n\r\nSpecial thanks to Valentin Vasilyev for the original fingerprintjs slightly modified and to Open Source Device Fingerprinting by Dark Wave Tech for the various identity functions\r\n\r\n***************************************************\r\n*/\r\nexport default class Fingerprint {\r\n\tconstructor(options) {\r\n\t\tvar nativeForEach, nativeMap;\r\n\t\tnativeForEach = Array.prototype.forEach;\r\n\t\tnativeMap = Array.prototype.map;\r\n\t\tthis.each = function(obj, iterator, context) {\r\n\t\t\tif (obj === null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (nativeForEach && obj.forEach === nativeForEach) {\r\n\t\t\t\tobj.forEach(iterator, context);\r\n\t\t\t} else if (obj.length === +obj.length) {\r\n\t\t\t\tfor (var i = 0, l = obj.length; i < l; i++) {\r\n\t\t\t\t\tif (iterator.call(context, obj[i], i, obj) === {})\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (var key in obj) {\r\n\t\t\t\t\tif (obj.hasOwnProperty(key)) {\r\n\t\t\t\t\t\tif (iterator.call(context, obj[key], key, obj) === {})\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.map = function(obj, iterator, context) {\r\n\t\t\tvar results = [];\r\n\t\t\tif (obj == null)\r\n\t\t\t\treturn results;\r\n\t\t\tif (nativeMap && obj.map === nativeMap)\r\n\t\t\t\treturn obj.map(iterator, context);\r\n\t\t\tthis.each(obj, function(value, index, list) {\r\n\t\t\t\tresults[results.length] = iterator.call(context, value, index, list);\r\n\t\t\t});\r\n\t\t\treturn results;\r\n\t\t};\r\n\t\tif (typeof options == \"object\") {\r\n\t\t\tthis.hasher = options.hasher;\r\n\t\t\tthis.screen_resolution = options.screen_resolution;\r\n\t\t\tthis.screen_orientation = options.screen_orientation;\r\n\t\t\tthis.canvas = options.canvas;\r\n\t\t\tthis.ie_activex = options.ie_activex;\r\n\t\t} else if (typeof options == \"function\") {\r\n\t\t\tthis.hasher = options;\r\n\t\t}\r\n\t}\r\n}\r\nFingerprint.prototype = {\r\n\tget: function() {\r\n\t\tvar keys = [];\r\n\t\tkeys.push(navigator.userAgent);\r\n\t\tkeys.push(navigator.language);\r\n\t\tkeys.push(screen.colorDepth);\r\n\t\tif (this.screen_resolution) {\r\n\t\t\tvar resolution = this.getScreenResolution();\r\n\t\t\tif (typeof resolution !== \"undefined\") {\r\n\t\t\t\tkeys.push(this.getScreenResolution().join(\"x\"));\r\n\t\t\t}\r\n\t\t}\r\n\t\tkeys.push(new Date().getTimezoneOffset());\r\n\t\tkeys.push(this.hasSessionStorage());\r\n\t\tkeys.push(this.hasLocalStorage());\r\n\t\tkeys.push(!!window.indexedDB);\r\n\t\tif (document.body) {\r\n\t\t\tkeys.push(typeof(document.body.addBehavior));\r\n\t\t} else {\r\n\t\t\tkeys.push(typeof undefined);\r\n\t\t}\r\n\t\tkeys.push(typeof(window.openDatabase));\r\n\t\tkeys.push(navigator.cpuClass);\r\n\t\tkeys.push(navigator.platform);\r\n\t\tkeys.push(navigator.doNotTrack);\r\n\t\tkeys.push(this.getPluginsString());\r\n\t\tif (this.canvas && this.isCanvasSupported()) {\r\n\t\t\tkeys.push(this.getCanvasFingerprint());\r\n\t\t}\r\n\t\tif (this.hasher) {\r\n\t\t\treturn this.hasher(keys.join(\"###\"), 31);\r\n\t\t} else {\r\n\t\t\treturn this.murmurhash3_32_gc(keys.join(\"###\"), 31);\r\n\t\t}\r\n\t},\r\n\tmurmurhash3_32_gc: function(key, seed) {\r\n\t\tvar remainder, bytes, h1, h1b, c1, c2, k1, i;\r\n\t\tremainder = key.length & 3;\r\n\t\tbytes = key.length - remainder;\r\n\t\th1 = seed;\r\n\t\tc1 = 0xcc9e2d51;\r\n\t\tc2 = 0x1b873593;\r\n\t\ti = 0;\r\n\t\twhile (i < bytes) {\r\n\t\t\tk1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24);\r\n\t\t\t++i;\r\n\t\t\tk1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\tk1 = (k1 << 15) | (k1 >>> 17);\r\n\t\t\tk1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\th1 ^= k1;\r\n\t\t\th1 = (h1 << 13) | (h1 >>> 19);\r\n\t\t\th1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\th1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\r\n\t\t}\r\n\t\tk1 = 0;\r\n\t\tswitch (remainder) {\r\n\t\t\tcase 3:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\r\n\t\t\tcase 2:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\r\n\t\t\tcase 1:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i) & 0xff);\r\n\t\t\t\tk1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\r\n\t\t\t\tk1 = (k1 << 15) | (k1 >>> 17);\r\n\t\t\t\tk1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\r\n\t\t\t\th1 ^= k1;\r\n\t\t}\r\n\t\th1 ^= key.length;\r\n\t\th1 ^= h1 >>> 16;\r\n\t\th1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\r\n\t\th1 ^= h1 >>> 13;\r\n\t\th1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\r\n\t\th1 ^= h1 >>> 16;\r\n\t\treturn h1 >>> 0;\r\n\t},\r\n\thasLocalStorage: function() {\r\n\t\ttry {\r\n\t\t\treturn !!window.localStorage;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n\thasSessionStorage: function() {\r\n\t\ttry {\r\n\t\t\treturn !!window.sessionStorage;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n\tisCanvasSupported: function() {\r\n\t\tvar elem = document.createElement(\"canvas\");\r\n\t\treturn !!(elem.getContext && elem.getContext(\"2d\"));\r\n\t},\r\n\tisIE: function() {\r\n\t\tif (navigator.appName === \"Microsoft Internet Explorer\") {\r\n\t\t\treturn true;\r\n\t\t} else if (navigator.appName === \"Netscape\" && /Trident/.test(navigator.userAgent)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\tgetPluginsString: function() {\r\n\t\tif (this.isIE() && this.ie_activex) {\r\n\t\t\treturn this.getIEPluginsString();\r\n\t\t} else {\r\n\t\t\treturn this.getRegularPluginsString();\r\n\t\t}\r\n\t},\r\n\tgetRegularPluginsString: function() {\r\n\t\treturn this.map(navigator.plugins, function(p) {\r\n\t\t\tvar mimeTypes = this.map(p, function(mt) {\r\n\t\t\t\treturn [mt.type, mt.suffixes].join(\"~\");\r\n\t\t\t}).join(\",\");\r\n\t\t\treturn [p.name, p.description, mimeTypes].join(\"::\");\r\n\t\t}, this).join(\";\");\r\n\t},\r\n\tgetIEPluginsString: function() {\r\n\t\tif (window.ActiveXObject) {\r\n\t\t\tvar names = [\"ShockwaveFlash.ShockwaveFlash\", \"AcroPDF.PDF\", \"PDF.PdfCtrl\", \"QuickTime.QuickTime\", \"rmocx.RealPlayer G2 Control\", \"rmocx.RealPlayer G2 Control.1\", \"RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)\", \"RealVideo.RealVideo(tm) ActiveX Control (32-bit)\", \"RealPlayer\", \"SWCtl.SWCtl\", \"WMPlayer.OCX\", \"AgControl.AgControl\", \"Skype.Detection\"];\r\n\t\t\treturn this.map(names, function(name) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tnew ActiveXObject(name);\r\n\t\t\t\t\treturn name;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}).join(\";\");\r\n\t\t} else {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t},\r\n\tgetScreenResolution: function() {\r\n\t\tvar resolution;\r\n\t\tif (this.screen_orientation) {\r\n\t\t\tresolution = (screen.height > screen.width) ? [screen.height, screen.width] : [screen.width, screen.height];\r\n\t\t} else {\r\n\t\t\tresolution = [screen.height, screen.width];\r\n\t\t}\r\n\t\treturn resolution;\r\n\t},\r\n\tgetCanvasFingerprint: function() {\r\n\t\tvar canvas = document.createElement(\"canvas\");\r\n\t\tvar ctx = canvas.getContext(\"2d\");\r\n\t\tvar txt = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}|[]\\:\\\"<>?;,.\";\r\n\t\tctx.textBaseline = \"top\";\r\n\t\tctx.font = \"14px 'Arial'\";\r\n\t\tctx.textBaseline = \"alphabetic\";\r\n\t\tctx.fillStyle = \"#f60\";\r\n\t\tctx.fillRect(125, 1, 62, 20);\r\n\t\tctx.fillStyle = \"#069\";\r\n\t\tctx.fillText(txt, 2, 15);\r\n\t\tctx.fillStyle = \"rgba(102, 204, 0, 0.7)\";\r\n\t\tctx.fillText(txt, 4, 17);\r\n\t\treturn canvas.toDataURL();\r\n\t}\r\n};\r\n\r\n/**************************************************/\r\n\r\n/**\r\nhttp://www.darkwavetech.com/fingerprint/fingerprint_code.html\r\n**/\r\nfunction fingerprint_flash() {\r\n\t\"use strict\";\r\n\tvar strOnError, objPlayerVersion, strVersion, strOut;\r\n\r\n\tstrOnError = \"N/A\";\r\n\tobjPlayerVersion = null;\r\n\tstrVersion = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tobjPlayerVersion = swfobject.getFlashPlayerVersion();\r\n\t\tstrVersion = objPlayerVersion.major + \".\" + objPlayerVersion.minor + \".\" + objPlayerVersion.release;\r\n\t\tif (strVersion === \"0.0.0\") {\r\n\t\t\tstrVersion = \"N/A\";\r\n\t\t}\r\n\t\tstrOut = strVersion;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_browser() {\r\n\t\"use strict\";\r\n\tvar strOnError, strUserAgent, numVersion, strBrowser, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstrUserAgent = null;\r\n\tnumVersion = null;\r\n\tstrBrowser = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t\tif (/msie (\\d+\\.\\d+);/.test(strUserAgent)) { //test for MSIE x.x;\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tif (strUserAgent.indexOf(\"trident/6\") > -1) {\r\n\t\t\t\tnumVersion = 10;\r\n\t\t\t}\r\n\t\t\tif (strUserAgent.indexOf(\"trident/5\") > -1) {\r\n\t\t\t\tnumVersion = 9;\r\n\t\t\t}\r\n\t\t\tif (strUserAgent.indexOf(\"trident/4\") > -1) {\r\n\t\t\t\tnumVersion = 8;\r\n\t\t\t}\r\n\t\t\tstrBrowser = \"Internet Explorer \" + numVersion;\r\n\t\t} else if (strUserAgent.indexOf(\"trident/7\") > -1) { //IE 11+ gets rid of the legacy 'MSIE' in the user-agent string;\r\n\t\t\tnumVersion = 11;\r\n\t\t\tstrBrowser = \"Internet Explorer \" + numVersion;\r\n\t\t} else if (/firefox[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Firefox \" + numVersion;\r\n\t\t} else if (/opera[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Opera/x.x or Opera x.x (ignoring remaining decimal places);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Opera \" + numVersion;\r\n\t\t} else if (/chrome[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Chrome/x.x or Chrome x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Chrome \" + numVersion;\r\n\t\t} else if (/version[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Version/x.x or Version x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Safari \" + numVersion;\r\n\t\t} else if (/rv[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for rv/x.x or rv x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Mozilla \" + numVersion;\r\n\t\t} else if (/mozilla[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Mozilla/x.x or Mozilla x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Mozilla \" + numVersion;\r\n\t\t} else if (/binget[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for BinGet/x.x or BinGet x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (BinGet) \" + numVersion;\r\n\t\t} else if (/curl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Curl/x.x or Curl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (cURL) \" + numVersion;\r\n\t\t} else if (/java[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Java/x.x or Java x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Java) \" + numVersion;\r\n\t\t} else if (/libwww-perl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for libwww-perl/x.x or libwww-perl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (libwww-perl) \" + numVersion;\r\n\t\t} else if (/microsoft url control -[\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Microsoft URL Control - x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Microsoft URL Control) \" + numVersion;\r\n\t\t} else if (/peach[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Peach/x.x or Peach x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Peach) \" + numVersion;\r\n\t\t} else if (/php[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for PHP/x.x or PHP x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (PHP) \" + numVersion;\r\n\t\t} else if (/pxyscand[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for pxyscand/x.x or pxyscand x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (pxyscand) \" + numVersion;\r\n\t\t} else if (/pycurl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for pycurl/x.x or pycurl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (PycURL) \" + numVersion;\r\n\t\t} else if (/python-urllib[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for python-urllib/x.x or python-urllib x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Python URLlib) \" + numVersion;\r\n\t\t} else if (/appengine-google/.test(strUserAgent)) { //test for AppEngine-Google;\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Cloud (Google AppEngine) \" + numVersion;\r\n\t\t} else {\r\n\t\t\tstrBrowser = \"Unknown\";\r\n\t\t}\r\n\t\tstrOut = strBrowser;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_canvas() {\r\n\t\"use strict\";\r\n\tvar strOnError, canvas, strCText, strText, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tcanvas = null;\r\n\tstrCText = null;\r\n\tstrText = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}|;:',<.>/?\";\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tcanvas = document.createElement(\"canvas\");\r\n\t\tstrCText = canvas.getContext(\"2d\");\r\n\t\tstrCText.textBaseline = \"top\";\r\n\t\tstrCText.font = \"14px 'Arial'\";\r\n\t\tstrCText.textBaseline = \"alphabetic\";\r\n\t\tstrCText.fillStyle = \"#f60\";\r\n\t\tstrCText.fillRect(125, 1, 62, 20);\r\n\t\tstrCText.fillStyle = \"#069\";\r\n\t\tstrCText.fillText(strText, 2, 15);\r\n\t\tstrCText.fillStyle = \"rgba(102, 204, 0, 0.7)\";\r\n\t\tstrCText.fillText(strText, 4, 17);\r\n\t\tstrOut = canvas.toDataURL();\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_connection() {\r\n\t\"use strict\";\r\n\tvar strOnError, strConnection, strOut;\r\n\r\n\tstrOnError = \"N/A\";\r\n\tstrConnection = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\t// only on android\r\n\t\tstrConnection = navigator.connection.type;\r\n\t\tstrOut = strConnection;\r\n\t} catch (err) {\r\n\t\t// return N/A if navigator.connection object does not apply to this device\r\n\t\treturn strOnError;\r\n\t}\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_cookie() {\r\n\t\"use strict\";\r\n\tvar strOnError, bolCookieEnabled, bolOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tbolCookieEnabled = null;\r\n\tbolOut = null;\r\n\r\n\ttry {\r\n\t\tbolCookieEnabled = (navigator.cookieEnabled) ? true : false;\r\n\r\n\t\t//if not IE4+ nor NS6+\r\n\t\tif (typeof navigator.cookieEnabled === \"undefined\" && !bolCookieEnabled) {\r\n\t\t\tdocument.cookie = \"testcookie\";\r\n\t\t\tbolCookieEnabled = (document.cookie.indexOf(\"testcookie\") !== -1) ? true : false;\r\n\t\t}\r\n\t\tbolOut = bolCookieEnabled;\r\n\t\treturn bolOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_display() {\r\n\t\"use strict\";\r\n\tvar strSep, strPair, strOnError, strScreen, strDisplay, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrPair = \"=\";\r\n\tstrOnError = \"Error\";\r\n\tstrScreen = null;\r\n\tstrDisplay = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrScreen = window.screen;\r\n\t\tif (strScreen) {\r\n\t\t\tstrDisplay = strScreen.colorDepth + strSep + strScreen.width + strSep + strScreen.height + strSep + strScreen.availWidth + strSep + strScreen.availHeight;\r\n\t\t}\r\n\t\tstrOut = strDisplay;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_fontsmoothing() {\r\n\t\"use strict\";\r\n\tvar strOnError, strFontSmoothing, canvasNode, ctx, i, j, imageData, alpha, strOut;\r\n\r\n\tstrOnError = \"Unknown\";\r\n\tstrFontSmoothing = null;\r\n\tcanvasNode = null;\r\n\tctx = null;\r\n\timageData = null;\r\n\talpha = null;\r\n\tstrOut = null;\r\n\r\n\tif (typeof(screen.fontSmoothingEnabled) !== \"undefined\") {\r\n\t\tstrFontSmoothing = screen.fontSmoothingEnabled;\r\n\t} else {\r\n\t\ttry {\r\n\t\t\tfontsmoothing = \"false\";\r\n\t\t\tcanvasNode = document.createElement(\"canvas\");\r\n\t\t\tcanvasNode.width = \"35\";\r\n\t\t\tcanvasNode.height = \"35\";\r\n\t\t\tcanvasNode.style.display = \"none\";\r\n\t\t\tdocument.body.appendChild(canvasNode);\r\n\t\t\tctx = canvasNode.getContext(\"2d\");\r\n\t\t\tctx.textBaseline = \"top\";\r\n\t\t\tctx.font = \"32px Arial\";\r\n\t\t\tctx.fillStyle = \"black\";\r\n\t\t\tctx.strokeStyle = \"black\";\r\n\t\t\tctx.fillText(\"O\", 0, 0);\r\n\t\t\tfor (j = 8; j <= 32; j = j + 1) {\r\n\t\t\t\tfor (i = 1; i <= 32; i = i + 1) {\r\n\t\t\t\t\timageData = ctx.getImageData(i, j, 1, 1).data;\r\n\t\t\t\t\talpha = imageData[3];\r\n\t\t\t\t\tif (alpha !== 255 && alpha !== 0) {\r\n\t\t\t\t\t\tstrFontSmoothing = \"true\"; // font-smoothing must be on.\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tstrOut = strFontSmoothing;\r\n\t\t} catch (err) {\r\n\t\t\treturn strOnError;\r\n\t\t}\r\n\t}\r\n\tstrOut = strFontSmoothing;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_fonts() {\r\n\t\"use strict\";\r\n\tvar strOnError, style, fonts, count, template, fragment, divs, i, font, div, body, result, e;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstyle = null;\r\n\tfonts = null;\r\n\tfont = null;\r\n\tcount = 0;\r\n\ttemplate = null;\r\n\tdivs = null;\r\n\te = null;\r\n\tdiv = null;\r\n\tbody = null;\r\n\ti = 0;\r\n\r\n\ttry {\r\n\t\tstyle = \"position: absolute; visibility: hidden; display: block !important\";\r\n\t\tfonts = [\"8bitoperator\", \"Abadi MT Condensed Light\", \"Adobe Fangsong Std\", \"Adobe Hebrew\", \"Adobe Ming Std\", \"Agency FB\", \"Aharoni\", \"Andalus\", \"Angsana New\", \"AngsanaUPC\", \"Aparajita\", \"Arab\", \"Arabic Transparent\", \"Arabic Typesetting\", \"Arial Baltic\", \"Arial Black\", \"Arial CE\", \"Arial CYR\", \"Arial Greek\", \"Arial TUR\", \"Arial\", \"Arimo\", \"Batang\", \"BatangChe\", \"Bauhaus 93\", \"Bell MT\", \"Berlin Sans FB\", \"Bitstream Vera Serif\", \"Bodoni MT\", \"Bookman Old Style\", \"Braggadocio\", \"Broadway\", \"Browallia New\", \"BrowalliaUPC\", \"Calibri Light\", \"Calibri\", \"Californian FB\", \"Cambria Math\", \"Cambria\", \"Candara\", \"Castellar\", \"Casual\", \"Centaur\", \"Century\", \"Century Gothic\", \"Chalkduster\", \"Colonna MT\", \"Comic Sans MS\", \"Consolas\", \"Constantia\", \"Copperplate Gothic Light\", \"Corbel\", \"Cordia New\", \"CordiaUPC\", \"Courier New Baltic\", \"Courier New CE\", \"Courier New CYR\", \"Courier New Greek\", \"Courier New TUR\", \"Courier New\", \"DejaVu Sans\", \"DFKai-SB\", \"DaunPenh\", \"David\", \"DejaVu LGC Sans Mono\", \"Desdemona\", \"DilleniaUPC\", \"DokChampa\", \"Dotum\", \"DotumChe\", \"Dubai\", \"Ebrima\", \"Engravers MT\", \"Eras Bold ITC\", \"Estrangelo Edessa\", \"EucrosiaUPC\", \"Euphemia\", \"Eurostile\", \"FangSong\", \"Forte\", \"FrankRuehl\", \"Franklin Gothic Heavy\", \"Franklin Gothic Medium\", \"FreesiaUPC\", \"French Script MT\", \"Gabriola\", \"Gautami\", \"Georgia\", \"Gigi\", \"Gisha\", \"Goudy Old Style\", \"Gulim\", \"GulimChe\", \"GungSeo\", \"Gungsuh\", \"GungsuhChe\", \"Haettenschweiler\", \"Harrington\", \"Hei S\", \"HeiT\", \"Heisei Kaku Gothic\", \"Hiragino Sans GB\", \"Impact\", \"Informal Roman\", \"IrisUPC\", \"Iskoola Pota\", \"JasmineUPC\", \"KacstOne\", \"KaiTi\", \"Kalinga\", \"Kartika\", \"Khmer UI\", \"Kino MT\", \"KodchiangUPC\", \"Kokila\", \"Kozuka Gothic Pr6N\", \"Lao UI\", \"Latha\", \"Leelawadee\", \"Levenim MT\", \"LilyUPC\", \"Lohit Gujarati\", \"Loma\", \"Lucida Bright\", \"Lucida Console\", \"Lucida Fax\", \"Lucida Sans Unicode\", \"MS Gothic\", \"MS Mincho\", \"MS PGothic\", \"MS PMincho\", \"MS Reference Sans Serif\", \"MS UI Gothic\", \"MV Boli\", \"Magneto\", \"Malgun Gothic\", \"Mangal\", \"Marlett\", \"Matura MT Script Capitals\", \"Meiryo UI\", \"Meiryo\", \"Menlo\", \"Microsoft Himalaya\", \"Microsoft JhengHei\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Sans Serif\", \"Microsoft Tai Le\", \"Microsoft Uighur\", \"Microsoft YaHei\", \"Microsoft Yi Baiti\", \"MingLiU\", \"MingLiU-ExtB\", \"MingLiU_HKSCS\", \"MingLiU_HKSCS-ExtB\", \"Miriam Fixed\", \"Miriam\", \"Mongolian Baiti\", \"MoolBoran\", \"More Perfect DOS VGA\", \"MS Outlook\", \"NSimSun\", \"Narkisim\", \"News Gothic MT\", \"Niagara Solid\", \"Nyala\", \"OCR A\", \"OpenSymbol\", \"PMingLiU\", \"PMingLiU-ExtB\", \"Palace Script MT\", \"Palatino Linotype\", \"Papyrus\", \"Perpetua\", \"Plantagenet Cherokee\", \"Playbill\", \"Prelude Bold\", \"Prelude Condensed Bold\", \"Prelude Condensed Medium\", \"Prelude Medium\", \"PreludeCompressedWGL Black\", \"PreludeCompressedWGL Bold\", \"PreludeCompressedWGL Light\", \"PreludeCompressedWGL Medium\", \"PreludeCondensedWGL Black\", \"PreludeCondensedWGL Bold\", \"PreludeCondensedWGL Light\", \"PreludeCondensedWGL Medium\", \"PreludeWGL Black\", \"PreludeWGL Bold\", \"PreludeWGL Light\", \"PreludeWGL Medium\", \"Raavi\", \"Rachana\", \"Rockwell\", \"Rod\", \"Sakkal Majalla\", \"Sawasdee\", \"Script MT Bold\", \"Segoe Print\", \"Segoe Script\", \"Segoe UI Emoji\", \"Segoe UI Historic\", \"Segoe UI Light\", \"Segoe UI Semibold\", \"Segoe UI Symbol\", \"Segoe UI\", \"Shonar Bangla\", \"Showcard Gothic\", \"Shruti\", \"SimHei\", \"SimSun\", \"SimSun-ExtB\", \"Simplified Arabic Fixed\", \"Simplified Arabic\", \"Snap ITC\", \"Sylfaen\", \"Symbol\", \"Tahoma\", \"TeamViewer13\", \"Times New Roman Baltic\", \"Times New Roman CE\", \"Times New Roman CYR\", \"Times New Roman Greek\", \"Times New Roman TUR\", \"Times New Roman\", \"TlwgMono\", \"Traditional Arabic\", \"Trebuchet MS\", \"Tunga\", \"Tw Cen MT Condensed Extra Bold\", \"Ubuntu\", \"Umpush\", \"Univers\", \"Utopia\", \"Utsaah\", \"Vani\", \"Verdana\", \"Vijaya\", \"Vladimir Script\", \"Vrinda\", \"Webdings\", \"Wide Latin\", \"Wingdings\", \"Yu Gothic\"];\r\n\t\tcount = fonts.length;\r\n\t\ttemplate = \"<b style=\\\"display:inline !important; width:auto !important; font:normal 10px/1 'X',sans-serif !important\\\">ww</b>\" + \"<b style=\\\"display:inline !important; width:auto !important; font:normal 10px/1 'X',monospace !important\\\">ww</b>\";\r\n\t\tfragment = document.createDocumentFragment();\r\n\t\tdivs = [];\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\tfont = fonts[i];\r\n\t\t\tdiv = document.createElement(\"div\");\r\n\t\t\tfont = font.replace(/['\"<>]/g, \"\");\r\n\t\t\tdiv.innerHTML = template.replace(/X/g, font);\r\n\t\t\tdiv.style.cssText = style;\r\n\t\t\tfragment.appendChild(div);\r\n\t\t\tdivs.push(div);\r\n\t\t}\r\n\t\tbody = document.body;\r\n\t\tbody.insertBefore(fragment, body.firstChild);\r\n\t\tresult = [];\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\te = divs[i].getElementsByTagName(\"b\");\r\n\t\t\tif (e[0].offsetWidth === e[1].offsetWidth) {\r\n\t\t\t\tresult.push(fonts[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// do not combine these two loops, remove child will cause reflow\r\n\t\t// and induce severe performance hit\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\tbody.removeChild(divs[i]);\r\n\t\t}\r\n\t\treturn result.join(\"|\");\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_formfields() {\r\n\t\"use strict\";\r\n\tvar i, j, numOfForms, numOfInputs, strFormsInPage, strFormsInputsData, strInputsInForm, strTmp, strOut;\r\n\r\n\ti = 0;\r\n\tj = 0;\r\n\tnumOfForms = 0;\r\n\tnumOfInputs = 0;\r\n\tstrFormsInPage = \"\";\r\n\tstrFormsInputsData = [];\r\n\tstrInputsInForm = \"\";\r\n\tstrTmp = \"\";\r\n\tstrOut = \"\";\r\n\r\n\tstrFormsInPage = document.getElementsByTagName(\"form\");\r\n\tnumOfForms = strFormsInPage.length;\r\n\tstrFormsInputsData.push(\"url=\" + window.location.href);\r\n\tfor (i = 0; i < numOfForms; i = i + 1) {\r\n\t\tstrFormsInputsData.push(\"FORM=\" + strFormsInPage[i].name);\r\n\t\tstrInputsInForm = strFormsInPage[i].getElementsByTagName(\"input\");\r\n\t\tnumOfInputs = strInputsInForm.length;\r\n\t\tfor (j = 0; j < numOfInputs; j = j + 1) {\r\n\t\t\tif (strInputsInForm[j].type !== \"hidden\") {\r\n\t\t\t\tstrFormsInputsData.push(\"Input=\" + strInputsInForm[j].name);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tstrTmp = strFormsInputsData.join(\"|\");\r\n\tstrOut = strTmp;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_java() {\r\n\t\"use strict\";\r\n\tvar strOnError, strJavaEnabled, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstrJavaEnabled = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tif (navigator.javaEnabled()) {\r\n\t\t\tstrJavaEnabled = \"true\";\r\n\t\t} else {\r\n\t\t\tstrJavaEnabled = \"false\";\r\n\t\t}\r\n\t\tstrOut = strJavaEnabled;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_language() {\r\n\t\"use strict\";\r\n\tvar strSep, strPair, strOnError, strLang, strTypeLng, strTypeBrLng, strTypeSysLng, strTypeUsrLng, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrPair = \"=\";\r\n\tstrOnError = \"Error\";\r\n\tstrLang = null;\r\n\tstrTypeLng = null;\r\n\tstrTypeBrLng = null;\r\n\tstrTypeSysLng = null;\r\n\tstrTypeUsrLng = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrTypeLng = typeof(navigator.language);\r\n\t\tstrTypeBrLng = typeof(navigator.browserLanguage);\r\n\t\tstrTypeSysLng = typeof(navigator.systemLanguage);\r\n\t\tstrTypeUsrLng = typeof(navigator.userLanguage);\r\n\r\n\t\tif (strTypeLng !== \"undefined\") {\r\n\t\t\tstrLang = \"lang\" + strPair + navigator.language + strSep;\r\n\t\t} else if (strTypeBrLng !== \"undefined\") {\r\n\t\t\tstrLang = \"lang\" + strPair + navigator.browserLanguage + strSep;\r\n\t\t} else {\r\n\t\t\tstrLang = \"lang\" + strPair + strSep;\r\n\t\t}\r\n\t\tif (strTypeSysLng !== \"undefined\") {\r\n\t\t\tstrLang += \"syslang\" + strPair + navigator.systemLanguage + strSep;\r\n\t\t} else {\r\n\t\t\tstrLang += \"syslang\" + strPair + strSep;\r\n\t\t}\r\n\t\tif (strTypeUsrLng !== \"undefined\") {\r\n\t\t\tstrLang += \"userlang\" + strPair + navigator.userLanguage;\r\n\t\t} else {\r\n\t\t\tstrLang += \"userlang\" + strPair;\r\n\t\t}\r\n\t\tstrOut = strLang;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_silverlight() {\r\n\t\"use strict\";\r\n\tvar strOnError, objControl, objPlugin, strSilverlightVersion, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tobjControl = null;\r\n\tobjPlugin = null;\r\n\tstrSilverlightVersion = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\ttry {\r\n\t\t\tobjControl = new ActiveXObject(\"AgControl.AgControl\");\r\n\t\t\tif (objControl.IsVersionSupported(\"5.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"5.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"4.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"4.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"3.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"3.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"2.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"2.x\";\r\n\t\t\t} else {\r\n\t\t\t\tstrSilverlightVersion = \"1.x\";\r\n\t\t\t}\r\n\t\t\tobjControl = null;\r\n\t\t} catch (e) {\r\n\t\t\tobjPlugin = navigator.plugins[\"Silverlight Plug-In\"];\r\n\t\t\tif (objPlugin) {\r\n\t\t\t\tif (objPlugin.description === \"1.0.30226.2\") {\r\n\t\t\t\t\tstrSilverlightVersion = \"2.x\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrSilverlightVersion = parseInt(objPlugin.description[0], 10);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tstrSilverlightVersion = \"N/A\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tstrOut = strSilverlightVersion;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_os() {\r\n\t\"use strict\";\r\n\tvar strSep, strOnError, strUserAgent, strPlatform, strOS, strOSBits, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrOnError = \"Error\";\r\n\tstrUserAgent = null;\r\n\tstrPlatform = null;\r\n\tstrOS = null;\r\n\tstrOSBits = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\t/* navigator.userAgent is supported by all major browsers */\r\n\t\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t\t/* navigator.platform is supported by all major browsers */\r\n\t\tstrPlatform = navigator.platform.toLowerCase();\r\n\t\tif (strUserAgent.indexOf(\"windows nt 6.3\") !== -1) {\r\n\t\t\tstrOS = \"Windows 8.1\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.2\") !== -1) {\r\n\t\t\tstrOS = \"Windows 8\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.1\") !== -1) {\r\n\t\t\tstrOS = \"Windows 7\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 10.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows 10\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows Vista/Windows Server 2008\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.2\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP x64/Windows Server 2003\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.1\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.01\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000, Service Pack 1 (SP1)\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows xp\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows 2000\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000\";\r\n\t\t} else if (strUserAgent.indexOf(\"iemobile\") !== -1) {\r\n\t\t\tstrOS = \"Windows Mobile\";\r\n\t\t} else if (strUserAgent.indexOf(\"wm5 pie\") !== -1) {\r\n\t\t\tstrOS = \"Windows Mobile\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows\") !== -1) {\r\n\t\t\tstrOS = \"Windows (Unknown Version)\";\r\n\t\t} else if (strUserAgent.indexOf(\"openbsd\") !== -1) {\r\n\t\t\tstrOS = \"Open BSD\";\r\n\t\t} else if (strUserAgent.indexOf(\"sunos\") !== -1) {\r\n\t\t\tstrOS = \"Sun OS\";\r\n\t\t} else if (strUserAgent.indexOf(\"ubuntu\") !== -1) {\r\n\t\t\tstrOS = \"Ubuntu\";\r\n\t\t} else if (strUserAgent.indexOf(\"ipad\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iPad)\";\r\n\t\t} else if (strUserAgent.indexOf(\"ipod\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iTouch)\";\r\n\t\t} else if (strUserAgent.indexOf(\"iphone\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iPhone)\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x beta\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Beta (Kodiak)\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.0\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Cheetah\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.1\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Puma\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.2\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Jaguar\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.3\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Panther\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.4\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Tiger\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.5\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Leopard\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.6\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Snow Leopard\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.7\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Lion\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX (Version Unknown)\";\r\n\t\t} else if (strUserAgent.indexOf(\"macintosh\") !== -1) {\r\n\t\t\tstrOS = \"Mac OS Classic\";\r\n\t\t} else if (strUserAgent.indexOf(\"googletv\") !== -1) {\r\n\t\t\tstrOS = \"Android (GoogleTV)\";\r\n\t\t} else if (strUserAgent.indexOf(\"android\") !== -1) {\r\n\t\t\tstrOS = \"Android\";\r\n\t\t} else if (strUserAgent.indexOf(\"x11\") !== -1) {\r\n\t\t\tstrOS = \"UNIX\";\r\n\t\t} else if (strUserAgent.indexOf(\"nix\") !== -1) {\r\n\t\t\tstrOS = \"UNIX\";\r\n\t\t} else if (strUserAgent.indexOf(\"linux\") !== -1) {\r\n\t\t\tstrOS = \"Linux\";\r\n\t\t} else if (strUserAgent.indexOf(\"qnx\") !== -1) {\r\n\t\t\tstrOS = \"QNX\";\r\n\t\t} else if (strUserAgent.indexOf(\"os/2\") !== -1) {\r\n\t\t\tstrOS = \"IBM OS/2\";\r\n\t\t} else if (strUserAgent.indexOf(\"beos\") !== -1) {\r\n\t\t\tstrOS = \"BeOS\";\r\n\t\t} else if (strUserAgent.indexOf(\"playbook\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry (Playbook)\";\r\n\t\t} else if (strUserAgent.indexOf(\"wnd.rim\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry (IE/FF Emulator)\";\r\n\t\t} else if (strUserAgent.indexOf(\"blackberry\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry\";\r\n\t\t} else if (strUserAgent.indexOf(\"palm\") !== -1) {\r\n\t\t\tstrOS = \"Palm OS\";\r\n\t\t} else if (strUserAgent.indexOf(\"webos\") !== -1) {\r\n\t\t\tstrOS = \"WebOS\";\r\n\t\t} else if (strUserAgent.indexOf(\"hpwos\") !== -1) {\r\n\t\t\tstrOS = \"WebOS (HP)\";\r\n\t\t} else if (strUserAgent.indexOf(\"kindle\") !== -1) {\r\n\t\t\tstrOS = \"Kindle\";\r\n\t\t} else if (strUserAgent.indexOf(\"wii\") !== -1) {\r\n\t\t\tstrOS = \"Nintendo (Wii)\";\r\n\t\t} else if (strUserAgent.indexOf(\"nintendo ds\") !== -1) {\r\n\t\t\tstrOS = \"Nintendo (DS)\";\r\n\t\t} else if (strUserAgent.indexOf(\"playstation 3\") !== -1) {\r\n\t\t\tstrOS = \"Sony (Playstation Console)\";\r\n\t\t} else if (strUserAgent.indexOf(\"playstation portable\") !== -1) {\r\n\t\t\tstrOS = \"Sony (Playstation Portable)\";\r\n\t\t} else if (strUserAgent.indexOf(\"webtv\") !== -1) {\r\n\t\t\tstrOS = \"MSN TV (WebTV)\";\r\n\t\t} else if (strUserAgent.indexOf(\"inferno\") !== -1) {\r\n\t\t\tstrOS = \"Inferno\";\r\n\t\t} else {\r\n\t\t\tstrOS = \"Unknown\";\r\n\t\t}\r\n\t\tif (strPlatform.indexOf(\"x64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"wow64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"win64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"win32\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x32\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x86\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits*\";\r\n\t\t} else if (strPlatform.indexOf(\"ppc\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"alpha\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"68k\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"iphone\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"android\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else {\r\n\t\t\tstrOSBits = \"Unknown\";\r\n\t\t}\r\n\t\tstrOut = strOS + strSep + strOSBits;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_useragent() {\r\n\t\"use strict\";\r\n\tvar strSep, strTmp, strUserAgent, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrTmp = null;\r\n\tstrUserAgent = null;\r\n\tstrOut = null;\r\n\r\n\t/* navigator.userAgent is supported by all major browsers */\r\n\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t/* navigator.platform is supported by all major browsers */\r\n\tstrTmp = strUserAgent + strSep + navigator.platform;\r\n\t/* navigator.cpuClass only supported in IE */\r\n\tif (navigator.cpuClass) {\r\n\t\tstrTmp += strSep + navigator.cpuClass;\r\n\t}\r\n\t/* navigator.browserLanguage only supported in IE, Safari and Chrome */\r\n\tif (navigator.browserLanguage) {\r\n\t\tstrTmp += strSep + navigator.browserLanguage;\r\n\t} else {\r\n\t\tstrTmp += strSep + navigator.language;\r\n\t}\r\n\tstrOut = strTmp;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_timezone() {\r\n\t\"use strict\";\r\n\tvar strOnError, dtDate, numOffset, numGMTHours, numOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tdtDate = null;\r\n\tnumOffset = null;\r\n\tnumGMTHours = null;\r\n\tnumOut = null;\r\n\r\n\ttry {\r\n\t\tdtDate = new Date();\r\n\t\tnumOffset = dtDate.getTimezoneOffset();\r\n\t\tnumGMTHours = (numOffset / 60) * (-1);\r\n\t\tnumOut = numGMTHours;\r\n\t\treturn numOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_touch() {\r\n\t\"use strict\";\r\n\tvar bolTouchEnabled, bolOut;\r\n\r\n\tbolTouchEnabled = false;\r\n\tbolOut = null;\r\n\r\n\ttry {\r\n\t\tif (document.createEvent(\"TouchEvent\")) {\r\n\t\t\tbolTouchEnabled = true;\r\n\t\t}\r\n\t\tbolOut = bolTouchEnabled;\r\n\t\treturn bolOut;\r\n\t} catch (ignore) {\r\n\t\tbolOut = bolTouchEnabled\r\n\t\treturn bolOut;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_truebrowser() {\r\n\t\"use strict\";\r\n\tvar strBrowser, strUserAgent, strOut;\r\n\r\n\tstrBrowser = \"Unknown\";\r\n\tstrUserAgent = null;\r\n\tstrOut = null;\r\n\r\n\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\r\n\t/* Checks for different browsers, cannot use Try/Catch block */\r\n\tif (document.all && document.getElementById && navigator.savePreferences && (strUserAgent.indexOf(\"Netfront\") < 0) && navigator.appName !== \"Blazer\") {\r\n\t\tstrBrowser = \"Escape 5\";\r\n\t} else if (navigator.vendor === \"KDE\") {\r\n\t\tstrBrowser = \"Konqueror\";\r\n\t} else if (document.childNodes && !document.all && !navigator.taintEnabled && !navigator.accentColorName) {\r\n\t\tstrBrowser = \"Safari\";\r\n\t} else if (document.childNodes && !document.all && !navigator.taintEnabled && navigator.accentColorName) {\r\n\t\tstrBrowser = \"OmniWeb 4.5+\";\r\n\t} else if (navigator.__ice_version) {\r\n\t\tstrBrowser = \"ICEBrowser\";\r\n\t} else if (window.ScriptEngine && ScriptEngine().indexOf(\"InScript\") + 1 && document.createElement) {\r\n\t\tstrBrowser = \"iCab 3+\";\r\n\t} else if (window.ScriptEngine && ScriptEngine().indexOf(\"InScript\") + 1) {\r\n\t\tstrBrowser = \"iCab 2-\";\r\n\t} else if (strUserAgent.indexOf(\"hotjava\") + 1 && (navigator.accentColorName) === \"undefined\") {\r\n\t\tstrBrowser = \"HotJava\";\r\n\t} else if (document.layers && !document.classes) {\r\n\t\tstrBrowser = \"Omniweb 4.2-\";\r\n\t} else if (document.layers && !navigator.mimeTypes[\"*\"]) {\r\n\t\tstrBrowser = \"Escape 4\";\r\n\t} else if (document.layers) {\r\n\t\tstrBrowser = \"Netscape 4\";\r\n\t} else if (window.opera && document.getElementsByClassName) {\r\n\t\tstrBrowser = \"Opera 9.5+\";\r\n\t} else if (window.opera && window.getComputedStyle) {\r\n\t\tstrBrowser = \"Opera 8\";\r\n\t} else if (window.opera && document.childNodes) {\r\n\t\tstrBrowser = \"Opera 7\";\r\n\t} else if (window.opera) {\r\n\t\tstrBrowser = \"Opera \" + window.opera.version();\r\n\t} else if (navigator.appName.indexOf(\"WebTV\") + 1) {\r\n\t\tstrBrowser = \"WebTV\";\r\n\t} else if (strUserAgent.indexOf(\"netgem\") + 1) {\r\n\t\tstrBrowser = \"Netgem NetBox\";\r\n\t} else if (strUserAgent.indexOf(\"opentv\") + 1) {\r\n\t\tstrBrowser = \"OpenTV\";\r\n\t} else if (strUserAgent.indexOf(\"ipanel\") + 1) {\r\n\t\tstrBrowser = \"iPanel MicroBrowser\";\r\n\t} else if (document.getElementById && !document.childNodes) {\r\n\t\tstrBrowser = \"Clue browser\";\r\n\t} else if (navigator.product && navigator.product.indexOf(\"Hv\") === 0) {\r\n\t\tstrBrowser = \"Tkhtml Hv3+\";\r\n\t} else if (typeof InstallTrigger !== \"undefined\") {\r\n\t\tstrBrowser = \"Firefox\";\r\n\t} else if (window.atob) {\r\n\t\tstrBrowser = \"Internet Explorer 10+\";\r\n\t} else if (XDomainRequest && window.performance) {\r\n\t\tstrBrowser = \"Internet Explorer 9\";\r\n\t} else if (XDomainRequest) {\r\n\t\tstrBrowser = \"Internet Explorer 8\";\r\n\t} else if (document.documentElement && document.documentElement.style.maxHeight !== \"undefined\") {\r\n\t\tstrBrowser = \"Internet Explorer 7\"; //xxxxx\r\n\t} else if (document.compatMode && document.all) {\r\n\t\tstrBrowser = \"Internet Explorer 6\"; //xxxxx\r\n\t} else if (window.createPopup) {\r\n\t\tstrBrowser = \"Internet Explorer 5.5\";\r\n\t} else if (window.attachEvent) {\r\n\t\tstrBrowser = \"Internet Explorer 5\";\r\n\t} else if (document.all && navigator.appName !== \"Microsoft Pocket Internet Explorer\") {\r\n\t\tstrBrowser = \"Internet Explorer 4\";\r\n\t} else if ((strUserAgent.indexOf(\"msie\") + 1) && window.ActiveXObject) {\r\n\t\tstrBrowser = \"Pocket Internet Explorer\";\r\n\t} else if (document.getElementById && ((strUserAgent.indexOf(\"netfront\") + 1) || navigator.appName === \"Blazer\" || navigator.product === \"Gecko\" || (navigator.appName.indexOf(\"PSP\") + 1) || (navigator.appName.indexOf(\"PLAYSTATION 3\") + 1))) {\r\n\t\tstrBrowser = \"NetFront 3+\";\r\n\t} else if (navigator.product === \"Gecko\" && !navigator.savePreferences) {\r\n\t\tstrBrowser = \"Gecko engine (Mozilla, Netscape 6+ etc.)\";\r\n\t} else if (window.chrome) {\r\n\t\tstrBrowser = \"Chrome\";\r\n\t}\r\n\tstrOut = strBrowser;\r\n\treturn strOut;\r\n}\r\n\r\nvar glbOnError = \"N/A\"\r\nvar glbSep = \"|\";\r\n\r\nfunction activeXDetect(componentClassID) {\r\n\t\"use strict\";\r\n\tvar strComponentVersion, strOut;\r\n\r\n\tstrComponentVersion = \"\";\r\n\tstrOut = \"\";\r\n\r\n\ttry {\r\n\t\tstrComponentVersion = document.body.getComponentVersion(\"{\" + componentClassID + \"}\", \"ComponentID\");\r\n\t\tif (strComponentVersion !== null) {\r\n\t\t\tstrOut = strComponentVersion;\r\n\t\t} else {\r\n\t\t\tstrOut = false;\r\n\t\t}\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}\r\n\r\nfunction stripIllegalChars(strValue) {\r\n\t\"use strict\";\r\n\tvar iCounter, strOriginal, strOut;\r\n\r\n\tiCounter = 0;\r\n\tstrOriginal = \"\";\r\n\tstrOut = \"\";\r\n\r\n\ttry {\r\n\t\tstrOriginal = strValue.toLowerCase();\r\n\t\tfor (iCounter = 0; iCounter < strOriginal.length; iCounter = iCounter + 1) {\r\n\t\t\tif (strOriginal.charAt(iCounter) !== \"\\n\" && strOriginal.charAt(iCounter) !== \"/\" && strOriginal.charAt(iCounter) !== \"\\\\\") {\r\n\t\t\t\tstrOut = strOut + strOriginal.charAt(iCounter);\r\n\t\t\t} else if (strOriginal.charAt(iCounter) === \"\\n\") {\r\n\t\t\t\tstrOut = strOut + \"n\";\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}\r\n\r\nfunction hashtable_containsKey(key) {\r\n\t\"use strict\";\r\n\tvar bolExists, iCounter;\r\n\r\n\tbolExists = false;\r\n\tiCounter = 0;\r\n\r\n\tfor (iCounter = 0; iCounter < this.hashtable.length; iCounter = iCounter + 1) {\r\n\t\tif (iCounter === key && this.hashtable[iCounter] !== null) {\r\n\t\t\tbolExists = true;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn bolExists;\r\n}\r\n\r\nfunction hashtable_get(key) {\r\n\t\"use strict\";\r\n\treturn this.hashtable[key];\r\n}\r\n\r\nfunction hashtable_keys() {\r\n\t\"use strict\";\r\n\tvar keys, iCounter;\r\n\r\n\tkeys = [];\r\n\tiCounter = 0;\r\n\r\n\tfor (iCounter in this.hashtable) {\r\n\t\tif (this.hashtable[iCounter] !== null) {\r\n\t\t\tkeys.push(iCounter);\r\n\t\t}\r\n\t}\r\n\treturn keys;\r\n}\r\n\r\nfunction hashtable_put(key, value) {\r\n\t\"use strict\";\r\n\tif (key === null || value === null) {\r\n\t\tthrow \"NullPointerException {\" + key + \"},{\" + value + \"}\";\r\n\t}\r\n\tthis.hashtable[key] = value;\r\n}\r\n\r\nfunction hashtable_size() {\r\n\t\"use strict\";\r\n\tvar iSize, iCounter, iOut;\r\n\r\n\tiSize = 0;\r\n\tiCounter = 0;\r\n\tiOut = 0;\r\n\r\n\tfor (iCounter in this.hashtable) {\r\n\t\tif (this.hashtable[iCounter] !== null) {\r\n\t\t\tiSize = iSize + 1;\r\n\t\t}\r\n\t}\r\n\tiOut = iSize;\r\n\treturn iOut;\r\n}\r\n\r\nfunction Hashtable() {\r\n\t\"use strict\";\r\n\tthis.containsKey = hashtable_containsKey;\r\n\tthis.get = hashtable_get;\r\n\tthis.keys = hashtable_keys;\r\n\tthis.put = hashtable_put;\r\n\tthis.size = hashtable_size;\r\n\tthis.hashtable = [];\r\n}\r\n\r\n/* Detect Plugins */\r\nfunction fingerprint_plugins() {\r\n\t\"use strict\";\r\n\tvar htIEComponents, strKey, strName, strVersion, strTemp, bolFirst, iCount, strMimeType, strOut;\r\n\r\n\ttry {\r\n\t\t/* Create hashtable of IE components */\r\n\t\thtIEComponents = new Hashtable();\r\n\t\thtIEComponents.put(\"7790769C-0471-11D2-AF11-00C04FA35D02\", \"AddressBook\"); // Address Book\r\n\t\thtIEComponents.put(\"47F67D00-9E55-11D1-BAEF-00C04FC2D130\", \"AolArtFormat\"); // AOL ART Image Format Support\r\n\t\thtIEComponents.put(\"76C19B38-F0C8-11CF-87CC-0020AFEECF20\", \"ArabicDS\"); // Arabic Text Display Support\r\n\t\thtIEComponents.put(\"76C19B34-F0C8-11CF-87CC-0020AFEECF20\", \"ChineseSDS\"); // Chinese (Simplified) Text Display Support\r\n\t\thtIEComponents.put(\"76C19B33-F0C8-11CF-87CC-0020AFEECF20\", \"ChineseTDS\"); // Chinese (traditional) Text Display Support\r\n\t\thtIEComponents.put(\"238F6F83-B8B4-11CF-8771-00A024541EE3\", \"CitrixICA\"); // Citrix ICA Client\r\n\t\thtIEComponents.put(\"283807B5-2C60-11D0-A31D-00AA00B92C03\", \"DirectAnim\"); // DirectAnimation\r\n\t\thtIEComponents.put(\"44BBA848-CC51-11CF-AAFA-00AA00B6015C\", \"DirectShow\"); // DirectShow\r\n\t\thtIEComponents.put(\"9381D8F2-0288-11D0-9501-00AA00B911A5\", \"DynHTML\"); // Dynamic HTML Data Binding\r\n\t\thtIEComponents.put(\"4F216970-C90C-11D1-B5C7-0000F8051515\", \"DynHTML4Java\"); // Dynamic HTML Data Binding for Java\r\n\t\thtIEComponents.put(\"D27CDB6E-AE6D-11CF-96B8-444553540000\", \"Flash\"); // Macromedia Flash\r\n\t\thtIEComponents.put(\"76C19B36-F0C8-11CF-87CC-0020AFEECF20\", \"HebrewDS\"); // Hebrew Text Display Support\r\n\t\thtIEComponents.put(\"630B1DA0-B465-11D1-9948-00C04F98BBC9\", \"IEBrwEnh\"); // Internet Explorer Browsing Enhancements\r\n\t\thtIEComponents.put(\"08B0E5C0-4FCB-11CF-AAA5-00401C608555\", \"IEClass4Java\"); // Internet Explorer Classes for Java\r\n\t\thtIEComponents.put(\"45EA75A0-A269-11D1-B5BF-0000F8051515\", \"IEHelp\"); // Internet Explorer Help\r\n\t\thtIEComponents.put(\"DE5AED00-A4BF-11D1-9948-00C04F98BBC9\", \"IEHelpEng\"); // Internet Explorer Help Engine\r\n\t\thtIEComponents.put(\"89820200-ECBD-11CF-8B85-00AA005B4383\", \"IE5WebBrw\"); // Internet Explorer 5/6 Web Browser\r\n\t\thtIEComponents.put(\"5A8D6EE0-3E18-11D0-821E-444553540000\", \"InetConnectionWiz\"); // Internet Connection Wizard\r\n\t\thtIEComponents.put(\"76C19B30-F0C8-11CF-87CC-0020AFEECF20\", \"JapaneseDS\"); // Japanese Text Display Support\r\n\t\thtIEComponents.put(\"76C19B31-F0C8-11CF-87CC-0020AFEECF20\", \"KoreanDS\"); // Korean Text Display Support\r\n\t\thtIEComponents.put(\"76C19B50-F0C8-11CF-87CC-0020AFEECF20\", \"LanguageAS\"); // Language Auto-Selection\r\n\t\thtIEComponents.put(\"08B0E5C0-4FCB-11CF-AAA5-00401C608500\", \"MsftVM\"); // Microsoft virtual machine\r\n\t\thtIEComponents.put(\"5945C046-LE7D-LLDL-BC44-00C04FD912BE\", \"MSNMessengerSrv\"); // MSN Messenger Service\r\n\t\thtIEComponents.put(\"44BBA842-CC51-11CF-AAFA-00AA00B6015B\", \"NetMeetingNT\"); // NetMeeting NT\r\n\t\thtIEComponents.put(\"3AF36230-A269-11D1-B5BF-0000F8051515\", \"OfflineBrwPack\"); // Offline Browsing Pack\r\n\t\thtIEComponents.put(\"44BBA840-CC51-11CF-AAFA-00AA00B6015C\", \"OutlookExpress\"); // Outlook Express\r\n\t\thtIEComponents.put(\"76C19B32-F0C8-11CF-87CC-0020AFEECF20\", \"PanEuropeanDS\"); // Pan-European Text Display Support\r\n\t\thtIEComponents.put(\"4063BE15-3B08-470D-A0D5-B37161CFFD69\", \"QuickTime\"); // Apple Quick Time\r\n\t\thtIEComponents.put(\"DE4AF3B0-F4D4-11D3-B41A-0050DA2E6C21\", \"QuickTimeCheck\"); // Apple Quick Time Check\r\n\t\thtIEComponents.put(\"3049C3E9-B461-4BC5-8870-4C09146192CA\", \"RealPlayer\"); // RealPlayer Download and Record Plugin for IE\r\n\t\thtIEComponents.put(\"2A202491-F00D-11CF-87CC-0020AFEECF20\", \"ShockwaveDir\"); // Macromedia Shockwave Director\r\n\t\thtIEComponents.put(\"3E01D8E0-A72B-4C9F-99BD-8A6E7B97A48D\", \"Skype\"); // Skype\r\n\t\thtIEComponents.put(\"CC2A9BA0-3BDD-11D0-821E-444553540000\", \"TaskScheduler\"); // Task Scheduler\r\n\t\thtIEComponents.put(\"76C19B35-F0C8-11CF-87CC-0020AFEECF20\", \"ThaiDS\"); // Thai Text Display Support\r\n\t\thtIEComponents.put(\"3BF42070-B3B1-11D1-B5C5-0000F8051515\", \"Uniscribe\"); // Uniscribe\r\n\t\thtIEComponents.put(\"4F645220-306D-11D2-995D-00C04F98BBC9\", \"VBScripting\"); // Visual Basic Scripting Support v5.6\r\n\t\thtIEComponents.put(\"76C19B37-F0C8-11CF-87CC-0020AFEECF20\", \"VietnameseDS\"); // Vietnamese Text Display Support\r\n\t\thtIEComponents.put(\"10072CEC-8CC1-11D1-986E-00A0C955B42F\", \"VML\"); // Vector Graphics Rendering (VML)\r\n\t\thtIEComponents.put(\"90E2BA2E-DD1B-4CDE-9134-7A8B86D33CA7\", \"WebEx\"); // WebEx Productivity Tools\r\n\t\thtIEComponents.put(\"73FA19D0-2D75-11D2-995D-00C04F98BBC9\", \"WebFolders\"); // Web Folders\r\n\t\thtIEComponents.put(\"89820200-ECBD-11CF-8B85-00AA005B4340\", \"WinDesktopUpdateNT\"); // Windows Desktop Update NT\r\n\t\thtIEComponents.put(\"9030D464-4C02-4ABF-8ECC-5164760863C6\", \"WinLive\"); // Windows Live ID Sign-in Helper\r\n\t\thtIEComponents.put(\"6BF52A52-394A-11D3-B153-00C04F79FAA6\", \"WinMediaPlayer\"); // Windows Media Player (Versions 7, 8 or 9)\r\n\t\thtIEComponents.put(\"22D6F312-B0F6-11D0-94AB-0080C74C7E95\", \"WinMediaPlayerTrad\"); // Windows Media Player (Traditional Versions)\r\n\r\n\t\tstrTemp = \"\";\r\n\t\tbolFirst = true;\r\n\r\n\t\t/* strOpera gives full path of the file, extract the filenames, ignoring description and length */\r\n\t\tif (navigator.plugins.length > 0) {\r\n\t\t\tfor (iCount = 0; iCount < navigator.plugins.length; iCount = iCount + 1) {\r\n\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\tstrTemp += navigator.plugins[iCount].name;\r\n\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrTemp += glbSep + navigator.plugins[iCount].name;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (navigator.mimeTypes.length > 0) {\r\n\t\t\tstrMimeType = navigator.mimeTypes;\r\n\t\t\tfor (iCount = 0; iCount < strMimeType.length; iCount = iCount + 1) {\r\n\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\tstrTemp += strMimeType[iCount].description;\r\n\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrTemp += glbSep + strMimeType[iCount].description;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdocument.body.addBehavior(\"#default#clientCaps\");\r\n\t\t\tstrKey = htIEComponents.keys();\r\n\t\t\tfor (iCount = 0; iCount < htIEComponents.size(); iCount = iCount + 1) {\r\n\t\t\t\tstrVersion = activeXDetect(strKey[iCount]);\r\n\t\t\t\tstrName = htIEComponents.get(strKey[iCount]);\r\n\t\t\t\tif (strVersion) {\r\n\t\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\t\tstrTemp = strName + glbPair + strVersion;\r\n\t\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstrTemp += glbSep + strName + glbPair + strVersion;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tstrTemp = strTemp.replace(/,/g, \".\");\r\n\t\t}\r\n\t\tstrTemp = stripIllegalChars(strTemp);\r\n\t\tif (strTemp === \"\") {\r\n\t\t\tstrTemp = \"None\";\r\n\t\t}\r\n\t\tstrOut = strTemp;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}"],"sourceRoot":""} \ No newline at end of file
diff --git a/webAO/fingerprint.js b/webAO/fingerprint.js
new file mode 100644
index 0000000..8fa2063
--- /dev/null
+++ b/webAO/fingerprint.js
@@ -0,0 +1,1192 @@
+/*
+***************************************************
+** http://davealger.info
+***************************************************
+
+This is a javascript only way to fingerprint a user with better than 90% accuracy in as few bytes as possible and no cookie storage!
+
+Special thanks to Valentin Vasilyev for the original fingerprintjs slightly modified and to Open Source Device Fingerprinting by Dark Wave Tech for the various identity functions
+
+***************************************************
+*/
+export default class Fingerprint {
+ constructor(options) {
+ var nativeForEach, nativeMap;
+ nativeForEach = Array.prototype.forEach;
+ nativeMap = Array.prototype.map;
+ this.each = function(obj, iterator, context) {
+ if (obj === null) {
+ return;
+ }
+ if (nativeForEach && obj.forEach === nativeForEach) {
+ obj.forEach(iterator, context);
+ } else if (obj.length === +obj.length) {
+ for (var i = 0, l = obj.length; i < l; i++) {
+ if (iterator.call(context, obj[i], i, obj) === {})
+ return;
+ }
+ } else {
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ if (iterator.call(context, obj[key], key, obj) === {})
+ return;
+ }
+ }
+ }
+ };
+ this.map = function(obj, iterator, context) {
+ var results = [];
+ if (obj == null)
+ return results;
+ if (nativeMap && obj.map === nativeMap)
+ return obj.map(iterator, context);
+ this.each(obj, function(value, index, list) {
+ results[results.length] = iterator.call(context, value, index, list);
+ });
+ return results;
+ };
+ if (typeof options == "object") {
+ this.hasher = options.hasher;
+ this.screen_resolution = options.screen_resolution;
+ this.screen_orientation = options.screen_orientation;
+ this.canvas = options.canvas;
+ this.ie_activex = options.ie_activex;
+ } else if (typeof options == "function") {
+ this.hasher = options;
+ }
+ }
+}
+Fingerprint.prototype = {
+ get: function() {
+ var keys = [];
+ keys.push(navigator.userAgent);
+ keys.push(navigator.language);
+ keys.push(screen.colorDepth);
+ if (this.screen_resolution) {
+ var resolution = this.getScreenResolution();
+ if (typeof resolution !== "undefined") {
+ keys.push(this.getScreenResolution().join("x"));
+ }
+ }
+ keys.push(new Date().getTimezoneOffset());
+ keys.push(this.hasSessionStorage());
+ keys.push(this.hasLocalStorage());
+ keys.push(!!window.indexedDB);
+ if (document.body) {
+ keys.push(typeof(document.body.addBehavior));
+ } else {
+ keys.push(typeof undefined);
+ }
+ keys.push(typeof(window.openDatabase));
+ keys.push(navigator.cpuClass);
+ keys.push(navigator.platform);
+ keys.push(navigator.doNotTrack);
+ keys.push(this.getPluginsString());
+ if (this.canvas && this.isCanvasSupported()) {
+ keys.push(this.getCanvasFingerprint());
+ }
+ if (this.hasher) {
+ return this.hasher(keys.join("###"), 31);
+ } else {
+ return this.murmurhash3_32_gc(keys.join("###"), 31);
+ }
+ },
+ murmurhash3_32_gc: function(key, seed) {
+ var remainder, bytes, h1, h1b, c1, c2, k1, i;
+ remainder = key.length & 3;
+ bytes = key.length - remainder;
+ h1 = seed;
+ c1 = 0xcc9e2d51;
+ c2 = 0x1b873593;
+ i = 0;
+ while (i < bytes) {
+ k1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24);
+ ++i;
+ k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;
+ k1 = (k1 << 15) | (k1 >>> 17);
+ k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;
+ h1 ^= k1;
+ h1 = (h1 << 13) | (h1 >>> 19);
+ h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;
+ h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));
+ }
+ k1 = 0;
+ switch (remainder) {
+ case 3:
+ k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
+ case 2:
+ k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
+ case 1:
+ k1 ^= (key.charCodeAt(i) & 0xff);
+ k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
+ k1 = (k1 << 15) | (k1 >>> 17);
+ k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
+ h1 ^= k1;
+ }
+ h1 ^= key.length;
+ h1 ^= h1 >>> 16;
+ h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
+ h1 ^= h1 >>> 13;
+ h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;
+ h1 ^= h1 >>> 16;
+ return h1 >>> 0;
+ },
+ hasLocalStorage: function() {
+ try {
+ return !!window.localStorage;
+ } catch (e) {
+ return true;
+ }
+ },
+ hasSessionStorage: function() {
+ try {
+ return !!window.sessionStorage;
+ } catch (e) {
+ return true;
+ }
+ },
+ isCanvasSupported: function() {
+ var elem = document.createElement("canvas");
+ return !!(elem.getContext && elem.getContext("2d"));
+ },
+ isIE: function() {
+ if (navigator.appName === "Microsoft Internet Explorer") {
+ return true;
+ } else if (navigator.appName === "Netscape" && /Trident/.test(navigator.userAgent)) {
+ return true;
+ }
+ return false;
+ },
+ getPluginsString: function() {
+ if (this.isIE() && this.ie_activex) {
+ return this.getIEPluginsString();
+ } else {
+ return this.getRegularPluginsString();
+ }
+ },
+ getRegularPluginsString: function() {
+ return this.map(navigator.plugins, function(p) {
+ var mimeTypes = this.map(p, function(mt) {
+ return [mt.type, mt.suffixes].join("~");
+ }).join(",");
+ return [p.name, p.description, mimeTypes].join("::");
+ }, this).join(";");
+ },
+ getIEPluginsString: function() {
+ if (window.ActiveXObject) {
+ var names = ["ShockwaveFlash.ShockwaveFlash", "AcroPDF.PDF", "PDF.PdfCtrl", "QuickTime.QuickTime", "rmocx.RealPlayer G2 Control", "rmocx.RealPlayer G2 Control.1", "RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)", "RealVideo.RealVideo(tm) ActiveX Control (32-bit)", "RealPlayer", "SWCtl.SWCtl", "WMPlayer.OCX", "AgControl.AgControl", "Skype.Detection"];
+ return this.map(names, function(name) {
+ try {
+ new ActiveXObject(name);
+ return name;
+ } catch (e) {
+ return null;
+ }
+ }).join(";");
+ } else {
+ return "";
+ }
+ },
+ getScreenResolution: function() {
+ var resolution;
+ if (this.screen_orientation) {
+ resolution = (screen.height > screen.width) ? [screen.height, screen.width] : [screen.width, screen.height];
+ } else {
+ resolution = [screen.height, screen.width];
+ }
+ return resolution;
+ },
+ getCanvasFingerprint: function() {
+ var canvas = document.createElement("canvas");
+ var ctx = canvas.getContext("2d");
+ var txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}|[]\:\"<>?;,.";
+ ctx.textBaseline = "top";
+ ctx.font = "14px 'Arial'";
+ ctx.textBaseline = "alphabetic";
+ ctx.fillStyle = "#f60";
+ ctx.fillRect(125, 1, 62, 20);
+ ctx.fillStyle = "#069";
+ ctx.fillText(txt, 2, 15);
+ ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
+ ctx.fillText(txt, 4, 17);
+ return canvas.toDataURL();
+ }
+};
+
+/**************************************************/
+
+/**
+http://www.darkwavetech.com/fingerprint/fingerprint_code.html
+**/
+function fingerprint_flash() {
+ "use strict";
+ var strOnError, objPlayerVersion, strVersion, strOut;
+
+ strOnError = "N/A";
+ objPlayerVersion = null;
+ strVersion = null;
+ strOut = null;
+
+ try {
+ objPlayerVersion = swfobject.getFlashPlayerVersion();
+ strVersion = objPlayerVersion.major + "." + objPlayerVersion.minor + "." + objPlayerVersion.release;
+ if (strVersion === "0.0.0") {
+ strVersion = "N/A";
+ }
+ strOut = strVersion;
+ return strOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_browser() {
+ "use strict";
+ var strOnError, strUserAgent, numVersion, strBrowser, strOut;
+
+ strOnError = "Error";
+ strUserAgent = null;
+ numVersion = null;
+ strBrowser = null;
+ strOut = null;
+
+ try {
+ strUserAgent = navigator.userAgent.toLowerCase();
+ if (/msie (\d+\.\d+);/.test(strUserAgent)) { //test for MSIE x.x;
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ if (strUserAgent.indexOf("trident/6") > -1) {
+ numVersion = 10;
+ }
+ if (strUserAgent.indexOf("trident/5") > -1) {
+ numVersion = 9;
+ }
+ if (strUserAgent.indexOf("trident/4") > -1) {
+ numVersion = 8;
+ }
+ strBrowser = "Internet Explorer " + numVersion;
+ } else if (strUserAgent.indexOf("trident/7") > -1) { //IE 11+ gets rid of the legacy 'MSIE' in the user-agent string;
+ numVersion = 11;
+ strBrowser = "Internet Explorer " + numVersion;
+ } else if (/firefox[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Firefox " + numVersion;
+ } else if (/opera[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Opera/x.x or Opera x.x (ignoring remaining decimal places);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Opera " + numVersion;
+ } else if (/chrome[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Chrome/x.x or Chrome x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Chrome " + numVersion;
+ } else if (/version[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Version/x.x or Version x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Safari " + numVersion;
+ } else if (/rv[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for rv/x.x or rv x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Mozilla " + numVersion;
+ } else if (/mozilla[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Mozilla/x.x or Mozilla x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Mozilla " + numVersion;
+ } else if (/binget[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for BinGet/x.x or BinGet x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (BinGet) " + numVersion;
+ } else if (/curl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Curl/x.x or Curl x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (cURL) " + numVersion;
+ } else if (/java[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Java/x.x or Java x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (Java) " + numVersion;
+ } else if (/libwww-perl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for libwww-perl/x.x or libwww-perl x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (libwww-perl) " + numVersion;
+ } else if (/microsoft url control -[\s](\d+\.\d+)/.test(strUserAgent)) { //test for Microsoft URL Control - x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (Microsoft URL Control) " + numVersion;
+ } else if (/peach[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Peach/x.x or Peach x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (Peach) " + numVersion;
+ } else if (/php[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for PHP/x.x or PHP x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (PHP) " + numVersion;
+ } else if (/pxyscand[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for pxyscand/x.x or pxyscand x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (pxyscand) " + numVersion;
+ } else if (/pycurl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for pycurl/x.x or pycurl x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (PycURL) " + numVersion;
+ } else if (/python-urllib[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for python-urllib/x.x or python-urllib x.x (ignoring remaining digits);
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Library (Python URLlib) " + numVersion;
+ } else if (/appengine-google/.test(strUserAgent)) { //test for AppEngine-Google;
+ numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
+ strBrowser = "Cloud (Google AppEngine) " + numVersion;
+ } else {
+ strBrowser = "Unknown";
+ }
+ strOut = strBrowser;
+ return strOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_canvas() {
+ "use strict";
+ var strOnError, canvas, strCText, strText, strOut;
+
+ strOnError = "Error";
+ canvas = null;
+ strCText = null;
+ strText = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}|;:',<.>/?";
+ strOut = null;
+
+ try {
+ canvas = document.createElement("canvas");
+ strCText = canvas.getContext("2d");
+ strCText.textBaseline = "top";
+ strCText.font = "14px 'Arial'";
+ strCText.textBaseline = "alphabetic";
+ strCText.fillStyle = "#f60";
+ strCText.fillRect(125, 1, 62, 20);
+ strCText.fillStyle = "#069";
+ strCText.fillText(strText, 2, 15);
+ strCText.fillStyle = "rgba(102, 204, 0, 0.7)";
+ strCText.fillText(strText, 4, 17);
+ strOut = canvas.toDataURL();
+ return strOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_connection() {
+ "use strict";
+ var strOnError, strConnection, strOut;
+
+ strOnError = "N/A";
+ strConnection = null;
+ strOut = null;
+
+ try {
+ // only on android
+ strConnection = navigator.connection.type;
+ strOut = strConnection;
+ } catch (err) {
+ // return N/A if navigator.connection object does not apply to this device
+ return strOnError;
+ }
+ return strOut;
+}
+
+function fingerprint_cookie() {
+ "use strict";
+ var strOnError, bolCookieEnabled, bolOut;
+
+ strOnError = "Error";
+ bolCookieEnabled = null;
+ bolOut = null;
+
+ try {
+ bolCookieEnabled = (navigator.cookieEnabled) ? true : false;
+
+ //if not IE4+ nor NS6+
+ if (typeof navigator.cookieEnabled === "undefined" && !bolCookieEnabled) {
+ document.cookie = "testcookie";
+ bolCookieEnabled = (document.cookie.indexOf("testcookie") !== -1) ? true : false;
+ }
+ bolOut = bolCookieEnabled;
+ return bolOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_display() {
+ "use strict";
+ var strSep, strPair, strOnError, strScreen, strDisplay, strOut;
+
+ strSep = "|";
+ strPair = "=";
+ strOnError = "Error";
+ strScreen = null;
+ strDisplay = null;
+ strOut = null;
+
+ try {
+ strScreen = window.screen;
+ if (strScreen) {
+ strDisplay = strScreen.colorDepth + strSep + strScreen.width + strSep + strScreen.height + strSep + strScreen.availWidth + strSep + strScreen.availHeight;
+ }
+ strOut = strDisplay;
+ return strOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_fontsmoothing() {
+ "use strict";
+ var strOnError, strFontSmoothing, canvasNode, ctx, i, j, imageData, alpha, strOut;
+
+ strOnError = "Unknown";
+ strFontSmoothing = null;
+ canvasNode = null;
+ ctx = null;
+ imageData = null;
+ alpha = null;
+ strOut = null;
+
+ if (typeof(screen.fontSmoothingEnabled) !== "undefined") {
+ strFontSmoothing = screen.fontSmoothingEnabled;
+ } else {
+ try {
+ fontsmoothing = "false";
+ canvasNode = document.createElement("canvas");
+ canvasNode.width = "35";
+ canvasNode.height = "35";
+ canvasNode.style.display = "none";
+ document.body.appendChild(canvasNode);
+ ctx = canvasNode.getContext("2d");
+ ctx.textBaseline = "top";
+ ctx.font = "32px Arial";
+ ctx.fillStyle = "black";
+ ctx.strokeStyle = "black";
+ ctx.fillText("O", 0, 0);
+ for (j = 8; j <= 32; j = j + 1) {
+ for (i = 1; i <= 32; i = i + 1) {
+ imageData = ctx.getImageData(i, j, 1, 1).data;
+ alpha = imageData[3];
+ if (alpha !== 255 && alpha !== 0) {
+ strFontSmoothing = "true"; // font-smoothing must be on.
+ }
+ }
+ }
+ strOut = strFontSmoothing;
+ } catch (err) {
+ return strOnError;
+ }
+ }
+ strOut = strFontSmoothing;
+ return strOut;
+}
+
+function fingerprint_fonts() {
+ "use strict";
+ var strOnError, style, fonts, count, template, fragment, divs, i, font, div, body, result, e;
+
+ strOnError = "Error";
+ style = null;
+ fonts = null;
+ font = null;
+ count = 0;
+ template = null;
+ divs = null;
+ e = null;
+ div = null;
+ body = null;
+ i = 0;
+
+ try {
+ style = "position: absolute; visibility: hidden; display: block !important";
+ fonts = ["8bitoperator", "Abadi MT Condensed Light","Ace Attorney", "Adobe Fangsong Std", "Adobe Hebrew", "Adobe Ming Std", "Agency FB", "Aharoni", "Andalus", "Angsana New", "AngsanaUPC", "Aparajita", "Arab", "Arabic Transparent", "Arabic Typesetting", "Arial Baltic", "Arial Black", "Arial CE", "Arial CYR", "Arial Greek", "Arial TUR", "Arial", "Arimo", "Batang", "BatangChe", "Bauhaus 93", "Bell MT", "Berlin Sans FB", "Bitstream Vera Serif", "Bodoni MT", "Bookman Old Style", "Braggadocio", "Broadway", "Browallia New", "BrowalliaUPC", "Calibri Light", "Calibri", "Californian FB", "Cambria Math", "Cambria", "Candara", "Castellar", "Casual", "Centaur", "Century", "Century Gothic", "Chalkduster", "Colonna MT", "Comic Sans MS", "Consolas", "Constantia", "Copperplate Gothic Light", "Corbel", "Cordia New", "CordiaUPC", "Courier New Baltic", "Courier New CE", "Courier New CYR", "Courier New Greek", "Courier New TUR", "Courier New", "DejaVu Sans", "DFKai-SB","DINEngschrift", "DaunPenh", "David", "DejaVu LGC Sans Mono", "Desdemona", "DilleniaUPC", "DokChampa", "Dotum", "DotumChe", "Dubai", "Ebrima", "Engravers MT", "Eras Bold ITC", "Estrangelo Edessa", "EucrosiaUPC", "Euphemia", "Eurostile", "FangSong", "Forte", "FrankRuehl", "Franklin Gothic Heavy", "Franklin Gothic Medium", "FreesiaUPC", "French Script MT", "Gabriola", "Gautami", "Georgia", "Gigi", "Gisha", "Goudy Old Style", "Gulim", "GulimChe", "GungSeo", "Gungsuh", "GungsuhChe", "Haettenschweiler", "Harrington", "Hei S", "HeiT", "Heisei Kaku Gothic", "Hiragino Sans GB", "Impact", "Informal Roman", "IrisUPC", "Iskoola Pota", "JasmineUPC", "KacstOne", "KaiTi", "Kalinga", "Kartika", "Khmer UI", "Kino MT", "KodchiangUPC", "Kokila", "Kozuka Gothic Pr6N", "Lao UI", "Latha", "Leelawadee", "Levenim MT", "LilyUPC", "Lohit Gujarati", "Loma", "Lucida Bright", "Lucida Console", "Lucida Fax", "Lucida Sans Unicode", "MS Gothic", "MS Mincho", "MS PGothic", "MS PMincho", "MS Reference Sans Serif", "MS UI Gothic", "MV Boli", "Magneto", "Malgun Gothic", "Mangal", "Marlett", "Matura MT Script Capitals", "Meiryo UI", "Meiryo", "Menlo", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft Uighur", "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU", "MingLiU-ExtB", "MingLiU_HKSCS", "MingLiU_HKSCS-ExtB", "Miriam Fixed", "Miriam", "Mongolian Baiti", "MoolBoran", "More Perfect DOS VGA", "MS Outlook", "NSimSun", "Narkisim", "News Gothic MT", "Niagara Solid", "Nyala", "OCR A","Ocean Sans Std", "OpenSymbol", "PMingLiU", "PMingLiU-ExtB", "Palace Script MT", "Palatino Linotype", "Papyrus", "Perpetua", "Plantagenet Cherokee", "Playbill", "Prelude Bold", "Prelude Condensed Bold", "Prelude Condensed Medium", "Prelude Medium", "PreludeCompressedWGL Black", "PreludeCompressedWGL Bold", "PreludeCompressedWGL Light", "PreludeCompressedWGL Medium", "PreludeCondensedWGL Black", "PreludeCondensedWGL Bold", "PreludeCondensedWGL Light", "PreludeCondensedWGL Medium", "PreludeWGL Black", "PreludeWGL Bold", "PreludeWGL Light", "PreludeWGL Medium", "Raavi", "Rachana", "Rockwell", "Rod", "Sakkal Majalla", "Sawasdee", "Script MT Bold", "Segoe Print", "Segoe Script", "Segoe UI Emoji", "Segoe UI Historic", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Symbol", "Segoe UI", "Shonar Bangla", "Showcard Gothic", "Shruti", "SimHei", "SimSun", "SimSun-ExtB", "Simplified Arabic Fixed", "Simplified Arabic", "Snap ITC", "Sylfaen", "Symbol", "Tahoma", "TeamViewer13", "Times New Roman Baltic", "Times New Roman CE", "Times New Roman CYR", "Times New Roman Greek", "Times New Roman TUR", "Times New Roman", "TlwgMono", "Traditional Arabic", "Trebuchet MS", "Tunga", "Tw Cen MT Condensed Extra Bold", "Ubuntu", "Umpush", "Univers", "Utopia", "Utsaah", "Vani", "Verdana", "Vijaya", "Vladimir Script", "Vrinda", "Webdings", "Wide Latin", "Wingdings", "Yu Gothic", "Zrnic Rg"];
+ count = fonts.length;
+ template = "<b style=\"display:inline !important; width:auto !important; font:normal 10px/1 'X',sans-serif !important\">ww</b>" + "<b style=\"display:inline !important; width:auto !important; font:normal 10px/1 'X',monospace !important\">ww</b>";
+ fragment = document.createDocumentFragment();
+ divs = [];
+ for (i = 0; i < count; i = i + 1) {
+ font = fonts[i];
+ div = document.createElement("div");
+ font = font.replace(/['"<>]/g, "");
+ div.innerHTML = template.replace(/X/g, font);
+ div.style.cssText = style;
+ fragment.appendChild(div);
+ divs.push(div);
+ }
+ body = document.body;
+ body.insertBefore(fragment, body.firstChild);
+ result = [];
+ for (i = 0; i < count; i = i + 1) {
+ e = divs[i].getElementsByTagName("b");
+ if (e[0].offsetWidth === e[1].offsetWidth) {
+ result.push(fonts[i]);
+ }
+ }
+ // do not combine these two loops, remove child will cause reflow
+ // and induce severe performance hit
+ for (i = 0; i < count; i = i + 1) {
+ body.removeChild(divs[i]);
+ }
+ return result.join("|");
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_formfields() {
+ "use strict";
+ var i, j, numOfForms, numOfInputs, strFormsInPage, strFormsInputsData, strInputsInForm, strTmp, strOut;
+
+ i = 0;
+ j = 0;
+ numOfForms = 0;
+ numOfInputs = 0;
+ strFormsInPage = "";
+ strFormsInputsData = [];
+ strInputsInForm = "";
+ strTmp = "";
+ strOut = "";
+
+ strFormsInPage = document.getElementsByTagName("form");
+ numOfForms = strFormsInPage.length;
+ strFormsInputsData.push("url=" + window.location.href);
+ for (i = 0; i < numOfForms; i = i + 1) {
+ strFormsInputsData.push("FORM=" + strFormsInPage[i].name);
+ strInputsInForm = strFormsInPage[i].getElementsByTagName("input");
+ numOfInputs = strInputsInForm.length;
+ for (j = 0; j < numOfInputs; j = j + 1) {
+ if (strInputsInForm[j].type !== "hidden") {
+ strFormsInputsData.push("Input=" + strInputsInForm[j].name);
+ }
+ }
+ }
+ strTmp = strFormsInputsData.join("|");
+ strOut = strTmp;
+ return strOut;
+}
+
+function fingerprint_java() {
+ "use strict";
+ var strOnError, strJavaEnabled, strOut;
+
+ strOnError = "Error";
+ strJavaEnabled = null;
+ strOut = null;
+
+ try {
+ if (navigator.javaEnabled()) {
+ strJavaEnabled = "true";
+ } else {
+ strJavaEnabled = "false";
+ }
+ strOut = strJavaEnabled;
+ return strOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_language() {
+ "use strict";
+ var strSep, strPair, strOnError, strLang, strTypeLng, strTypeBrLng, strTypeSysLng, strTypeUsrLng, strOut;
+
+ strSep = "|";
+ strPair = "=";
+ strOnError = "Error";
+ strLang = null;
+ strTypeLng = null;
+ strTypeBrLng = null;
+ strTypeSysLng = null;
+ strTypeUsrLng = null;
+ strOut = null;
+
+ try {
+ strTypeLng = typeof(navigator.language);
+ strTypeBrLng = typeof(navigator.browserLanguage);
+ strTypeSysLng = typeof(navigator.systemLanguage);
+ strTypeUsrLng = typeof(navigator.userLanguage);
+
+ if (strTypeLng !== "undefined") {
+ strLang = "lang" + strPair + navigator.language + strSep;
+ } else if (strTypeBrLng !== "undefined") {
+ strLang = "lang" + strPair + navigator.browserLanguage + strSep;
+ } else {
+ strLang = "lang" + strPair + strSep;
+ }
+ if (strTypeSysLng !== "undefined") {
+ strLang += "syslang" + strPair + navigator.systemLanguage + strSep;
+ } else {
+ strLang += "syslang" + strPair + strSep;
+ }
+ if (strTypeUsrLng !== "undefined") {
+ strLang += "userlang" + strPair + navigator.userLanguage;
+ } else {
+ strLang += "userlang" + strPair;
+ }
+ strOut = strLang;
+ return strOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_silverlight() {
+ "use strict";
+ var strOnError, objControl, objPlugin, strSilverlightVersion, strOut;
+
+ strOnError = "Error";
+ objControl = null;
+ objPlugin = null;
+ strSilverlightVersion = null;
+ strOut = null;
+
+ try {
+ try {
+ objControl = new ActiveXObject("AgControl.AgControl");
+ if (objControl.IsVersionSupported("5.0")) {
+ strSilverlightVersion = "5.x";
+ } else if (objControl.IsVersionSupported("4.0")) {
+ strSilverlightVersion = "4.x";
+ } else if (objControl.IsVersionSupported("3.0")) {
+ strSilverlightVersion = "3.x";
+ } else if (objControl.IsVersionSupported("2.0")) {
+ strSilverlightVersion = "2.x";
+ } else {
+ strSilverlightVersion = "1.x";
+ }
+ objControl = null;
+ } catch (e) {
+ objPlugin = navigator.plugins["Silverlight Plug-In"];
+ if (objPlugin) {
+ if (objPlugin.description === "1.0.30226.2") {
+ strSilverlightVersion = "2.x";
+ } else {
+ strSilverlightVersion = parseInt(objPlugin.description[0], 10);
+ }
+ } else {
+ strSilverlightVersion = "N/A";
+ }
+ }
+ strOut = strSilverlightVersion;
+ return strOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_os() {
+ "use strict";
+ var strSep, strOnError, strUserAgent, strPlatform, strOS, strOSBits, strOut;
+
+ strSep = "|";
+ strOnError = "Error";
+ strUserAgent = null;
+ strPlatform = null;
+ strOS = null;
+ strOSBits = null;
+ strOut = null;
+
+ try {
+ /* navigator.userAgent is supported by all major browsers */
+ strUserAgent = navigator.userAgent.toLowerCase();
+ /* navigator.platform is supported by all major browsers */
+ strPlatform = navigator.platform.toLowerCase();
+ if (strUserAgent.indexOf("windows nt 6.3") !== -1) {
+ strOS = "Windows 8.1";
+ } else if (strUserAgent.indexOf("windows nt 6.2") !== -1) {
+ strOS = "Windows 8";
+ } else if (strUserAgent.indexOf("windows nt 6.1") !== -1) {
+ strOS = "Windows 7";
+ } else if (strUserAgent.indexOf("windows nt 10.0") !== -1) {
+ strOS = "Windows 10";
+ } else if (strUserAgent.indexOf("windows nt 6.0") !== -1) {
+ strOS = "Windows Vista/Windows Server 2008";
+ } else if (strUserAgent.indexOf("windows nt 5.2") !== -1) {
+ strOS = "Windows XP x64/Windows Server 2003";
+ } else if (strUserAgent.indexOf("windows nt 5.1") !== -1) {
+ strOS = "Windows XP";
+ } else if (strUserAgent.indexOf("windows nt 5.01") !== -1) {
+ strOS = "Windows 2000, Service Pack 1 (SP1)";
+ } else if (strUserAgent.indexOf("windows xp") !== -1) {
+ strOS = "Windows XP";
+ } else if (strUserAgent.indexOf("windows 2000") !== -1) {
+ strOS = "Windows 2000";
+ } else if (strUserAgent.indexOf("windows nt 5.0") !== -1) {
+ strOS = "Windows 2000";
+ } else if (strUserAgent.indexOf("iemobile") !== -1) {
+ strOS = "Windows Mobile";
+ } else if (strUserAgent.indexOf("wm5 pie") !== -1) {
+ strOS = "Windows Mobile";
+ } else if (strUserAgent.indexOf("windows") !== -1) {
+ strOS = "Windows (Unknown Version)";
+ } else if (strUserAgent.indexOf("openbsd") !== -1) {
+ strOS = "Open BSD";
+ } else if (strUserAgent.indexOf("sunos") !== -1) {
+ strOS = "Sun OS";
+ } else if (strUserAgent.indexOf("ubuntu") !== -1) {
+ strOS = "Ubuntu";
+ } else if (strUserAgent.indexOf("ipad") !== -1) {
+ strOS = "iOS (iPad)";
+ } else if (strUserAgent.indexOf("ipod") !== -1) {
+ strOS = "iOS (iTouch)";
+ } else if (strUserAgent.indexOf("iphone") !== -1) {
+ strOS = "iOS (iPhone)";
+ } else if (strUserAgent.indexOf("mac os x beta") !== -1) {
+ strOS = "Mac OSX Beta (Kodiak)";
+ } else if (strUserAgent.indexOf("mac os x 10.0") !== -1) {
+ strOS = "Mac OSX Cheetah";
+ } else if (strUserAgent.indexOf("mac os x 10.1") !== -1) {
+ strOS = "Mac OSX Puma";
+ } else if (strUserAgent.indexOf("mac os x 10.2") !== -1) {
+ strOS = "Mac OSX Jaguar";
+ } else if (strUserAgent.indexOf("mac os x 10.3") !== -1) {
+ strOS = "Mac OSX Panther";
+ } else if (strUserAgent.indexOf("mac os x 10.4") !== -1) {
+ strOS = "Mac OSX Tiger";
+ } else if (strUserAgent.indexOf("mac os x 10.5") !== -1) {
+ strOS = "Mac OSX Leopard";
+ } else if (strUserAgent.indexOf("mac os x 10.6") !== -1) {
+ strOS = "Mac OSX Snow Leopard";
+ } else if (strUserAgent.indexOf("mac os x 10.7") !== -1) {
+ strOS = "Mac OSX Lion";
+ } else if (strUserAgent.indexOf("mac os x") !== -1) {
+ strOS = "Mac OSX (Version Unknown)";
+ } else if (strUserAgent.indexOf("macintosh") !== -1) {
+ strOS = "Mac OS Classic";
+ } else if (strUserAgent.indexOf("googletv") !== -1) {
+ strOS = "Android (GoogleTV)";
+ } else if (strUserAgent.indexOf("android") !== -1) {
+ strOS = "Android";
+ } else if (strUserAgent.indexOf("x11") !== -1) {
+ strOS = "UNIX";
+ } else if (strUserAgent.indexOf("nix") !== -1) {
+ strOS = "UNIX";
+ } else if (strUserAgent.indexOf("linux") !== -1) {
+ strOS = "Linux";
+ } else if (strUserAgent.indexOf("qnx") !== -1) {
+ strOS = "QNX";
+ } else if (strUserAgent.indexOf("os/2") !== -1) {
+ strOS = "IBM OS/2";
+ } else if (strUserAgent.indexOf("beos") !== -1) {
+ strOS = "BeOS";
+ } else if (strUserAgent.indexOf("playbook") !== -1) {
+ strOS = "Blackberry (Playbook)";
+ } else if (strUserAgent.indexOf("wnd.rim") !== -1) {
+ strOS = "Blackberry (IE/FF Emulator)";
+ } else if (strUserAgent.indexOf("blackberry") !== -1) {
+ strOS = "Blackberry";
+ } else if (strUserAgent.indexOf("palm") !== -1) {
+ strOS = "Palm OS";
+ } else if (strUserAgent.indexOf("webos") !== -1) {
+ strOS = "WebOS";
+ } else if (strUserAgent.indexOf("hpwos") !== -1) {
+ strOS = "WebOS (HP)";
+ } else if (strUserAgent.indexOf("kindle") !== -1) {
+ strOS = "Kindle";
+ } else if (strUserAgent.indexOf("wii") !== -1) {
+ strOS = "Nintendo (Wii)";
+ } else if (strUserAgent.indexOf("nintendo ds") !== -1) {
+ strOS = "Nintendo (DS)";
+ } else if (strUserAgent.indexOf("playstation 3") !== -1) {
+ strOS = "Sony (Playstation Console)";
+ } else if (strUserAgent.indexOf("playstation portable") !== -1) {
+ strOS = "Sony (Playstation Portable)";
+ } else if (strUserAgent.indexOf("webtv") !== -1) {
+ strOS = "MSN TV (WebTV)";
+ } else if (strUserAgent.indexOf("inferno") !== -1) {
+ strOS = "Inferno";
+ } else {
+ strOS = "Unknown";
+ }
+ if (strPlatform.indexOf("x64") !== -1) {
+ strOSBits = "64 bits";
+ } else if (strPlatform.indexOf("wow64") !== -1) {
+ strOSBits = "64 bits";
+ } else if (strPlatform.indexOf("win64") !== -1) {
+ strOSBits = "64 bits";
+ } else if (strPlatform.indexOf("win32") !== -1) {
+ strOSBits = "32 bits";
+ } else if (strPlatform.indexOf("x64") !== -1) {
+ strOSBits = "64 bits";
+ } else if (strPlatform.indexOf("x32") !== -1) {
+ strOSBits = "32 bits";
+ } else if (strPlatform.indexOf("x86") !== -1) {
+ strOSBits = "32 bits*";
+ } else if (strPlatform.indexOf("ppc") !== -1) {
+ strOSBits = "64 bits";
+ } else if (strPlatform.indexOf("alpha") !== -1) {
+ strOSBits = "64 bits";
+ } else if (strPlatform.indexOf("68k") !== -1) {
+ strOSBits = "64 bits";
+ } else if (strPlatform.indexOf("iphone") !== -1) {
+ strOSBits = "32 bits";
+ } else if (strPlatform.indexOf("android") !== -1) {
+ strOSBits = "32 bits";
+ } else {
+ strOSBits = "Unknown";
+ }
+ strOut = strOS + strSep + strOSBits;
+ return strOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_useragent() {
+ "use strict";
+ var strSep, strTmp, strUserAgent, strOut;
+
+ strSep = "|";
+ strTmp = null;
+ strUserAgent = null;
+ strOut = null;
+
+ /* navigator.userAgent is supported by all major browsers */
+ strUserAgent = navigator.userAgent.toLowerCase();
+ /* navigator.platform is supported by all major browsers */
+ strTmp = strUserAgent + strSep + navigator.platform;
+ /* navigator.cpuClass only supported in IE */
+ if (navigator.cpuClass) {
+ strTmp += strSep + navigator.cpuClass;
+ }
+ /* navigator.browserLanguage only supported in IE, Safari and Chrome */
+ if (navigator.browserLanguage) {
+ strTmp += strSep + navigator.browserLanguage;
+ } else {
+ strTmp += strSep + navigator.language;
+ }
+ strOut = strTmp;
+ return strOut;
+}
+
+function fingerprint_timezone() {
+ "use strict";
+ var strOnError, dtDate, numOffset, numGMTHours, numOut;
+
+ strOnError = "Error";
+ dtDate = null;
+ numOffset = null;
+ numGMTHours = null;
+ numOut = null;
+
+ try {
+ dtDate = new Date();
+ numOffset = dtDate.getTimezoneOffset();
+ numGMTHours = (numOffset / 60) * (-1);
+ numOut = numGMTHours;
+ return numOut;
+ } catch (err) {
+ return strOnError;
+ }
+}
+
+function fingerprint_touch() {
+ "use strict";
+ var bolTouchEnabled, bolOut;
+
+ bolTouchEnabled = false;
+ bolOut = null;
+
+ try {
+ if (document.createEvent("TouchEvent")) {
+ bolTouchEnabled = true;
+ }
+ bolOut = bolTouchEnabled;
+ return bolOut;
+ } catch (ignore) {
+ bolOut = bolTouchEnabled
+ return bolOut;
+ }
+}
+
+function fingerprint_truebrowser() {
+ "use strict";
+ var strBrowser, strUserAgent, strOut;
+
+ strBrowser = "Unknown";
+ strUserAgent = null;
+ strOut = null;
+
+ strUserAgent = navigator.userAgent.toLowerCase();
+
+ /* Checks for different browsers, cannot use Try/Catch block */
+ if (document.all && document.getElementById && navigator.savePreferences && (strUserAgent.indexOf("Netfront") < 0) && navigator.appName !== "Blazer") {
+ strBrowser = "Escape 5";
+ } else if (navigator.vendor === "KDE") {
+ strBrowser = "Konqueror";
+ } else if (document.childNodes && !document.all && !navigator.taintEnabled && !navigator.accentColorName) {
+ strBrowser = "Safari";
+ } else if (document.childNodes && !document.all && !navigator.taintEnabled && navigator.accentColorName) {
+ strBrowser = "OmniWeb 4.5+";
+ } else if (navigator.__ice_version) {
+ strBrowser = "ICEBrowser";
+ } else if (window.ScriptEngine && ScriptEngine().indexOf("InScript") + 1 && document.createElement) {
+ strBrowser = "iCab 3+";
+ } else if (window.ScriptEngine && ScriptEngine().indexOf("InScript") + 1) {
+ strBrowser = "iCab 2-";
+ } else if (strUserAgent.indexOf("hotjava") + 1 && (navigator.accentColorName) === "undefined") {
+ strBrowser = "HotJava";
+ } else if (document.layers && !document.classes) {
+ strBrowser = "Omniweb 4.2-";
+ } else if (document.layers && !navigator.mimeTypes["*"]) {
+ strBrowser = "Escape 4";
+ } else if (document.layers) {
+ strBrowser = "Netscape 4";
+ } else if (window.opera && document.getElementsByClassName) {
+ strBrowser = "Opera 9.5+";
+ } else if (window.opera && window.getComputedStyle) {
+ strBrowser = "Opera 8";
+ } else if (window.opera && document.childNodes) {
+ strBrowser = "Opera 7";
+ } else if (window.opera) {
+ strBrowser = "Opera " + window.opera.version();
+ } else if (navigator.appName.indexOf("WebTV") + 1) {
+ strBrowser = "WebTV";
+ } else if (strUserAgent.indexOf("netgem") + 1) {
+ strBrowser = "Netgem NetBox";
+ } else if (strUserAgent.indexOf("opentv") + 1) {
+ strBrowser = "OpenTV";
+ } else if (strUserAgent.indexOf("ipanel") + 1) {
+ strBrowser = "iPanel MicroBrowser";
+ } else if (document.getElementById && !document.childNodes) {
+ strBrowser = "Clue browser";
+ } else if (navigator.product && navigator.product.indexOf("Hv") === 0) {
+ strBrowser = "Tkhtml Hv3+";
+ } else if (typeof InstallTrigger !== "undefined") {
+ strBrowser = "Firefox";
+ } else if (window.atob) {
+ strBrowser = "Internet Explorer 10+";
+ } else if (XDomainRequest && window.performance) {
+ strBrowser = "Internet Explorer 9";
+ } else if (XDomainRequest) {
+ strBrowser = "Internet Explorer 8";
+ } else if (document.documentElement && document.documentElement.style.maxHeight !== "undefined") {
+ strBrowser = "Internet Explorer 7"; //xxxxx
+ } else if (document.compatMode && document.all) {
+ strBrowser = "Internet Explorer 6"; //xxxxx
+ } else if (window.createPopup) {
+ strBrowser = "Internet Explorer 5.5";
+ } else if (window.attachEvent) {
+ strBrowser = "Internet Explorer 5";
+ } else if (document.all && navigator.appName !== "Microsoft Pocket Internet Explorer") {
+ strBrowser = "Internet Explorer 4";
+ } else if ((strUserAgent.indexOf("msie") + 1) && window.ActiveXObject) {
+ strBrowser = "Pocket Internet Explorer";
+ } else if (document.getElementById && ((strUserAgent.indexOf("netfront") + 1) || navigator.appName === "Blazer" || navigator.product === "Gecko" || (navigator.appName.indexOf("PSP") + 1) || (navigator.appName.indexOf("PLAYSTATION 3") + 1))) {
+ strBrowser = "NetFront 3+";
+ } else if (navigator.product === "Gecko" && !navigator.savePreferences) {
+ strBrowser = "Gecko engine (Mozilla, Netscape 6+ etc.)";
+ } else if (window.chrome) {
+ strBrowser = "Chrome";
+ }
+ strOut = strBrowser;
+ return strOut;
+}
+
+var glbOnError = "N/A"
+var glbSep = "|";
+
+function activeXDetect(componentClassID) {
+ "use strict";
+ var strComponentVersion, strOut;
+
+ strComponentVersion = "";
+ strOut = "";
+
+ try {
+ strComponentVersion = document.body.getComponentVersion("{" + componentClassID + "}", "ComponentID");
+ if (strComponentVersion !== null) {
+ strOut = strComponentVersion;
+ } else {
+ strOut = false;
+ }
+ return strOut;
+ } catch (err) {
+ return glbOnError;
+ }
+}
+
+function stripIllegalChars(strValue) {
+ "use strict";
+ var iCounter, strOriginal, strOut;
+
+ iCounter = 0;
+ strOriginal = "";
+ strOut = "";
+
+ try {
+ strOriginal = strValue.toLowerCase();
+ for (iCounter = 0; iCounter < strOriginal.length; iCounter = iCounter + 1) {
+ if (strOriginal.charAt(iCounter) !== "\n" && strOriginal.charAt(iCounter) !== "/" && strOriginal.charAt(iCounter) !== "\\") {
+ strOut = strOut + strOriginal.charAt(iCounter);
+ } else if (strOriginal.charAt(iCounter) === "\n") {
+ strOut = strOut + "n";
+ }
+ }
+ return strOut;
+ } catch (err) {
+ return glbOnError;
+ }
+}
+
+function hashtable_containsKey(key) {
+ "use strict";
+ var bolExists, iCounter;
+
+ bolExists = false;
+ iCounter = 0;
+
+ for (iCounter = 0; iCounter < this.hashtable.length; iCounter = iCounter + 1) {
+ if (iCounter === key && this.hashtable[iCounter] !== null) {
+ bolExists = true;
+ break;
+ }
+ }
+ return bolExists;
+}
+
+function hashtable_get(key) {
+ "use strict";
+ return this.hashtable[key];
+}
+
+function hashtable_keys() {
+ "use strict";
+ var keys, iCounter;
+
+ keys = [];
+ iCounter = 0;
+
+ for (iCounter in this.hashtable) {
+ if (this.hashtable[iCounter] !== null) {
+ keys.push(iCounter);
+ }
+ }
+ return keys;
+}
+
+function hashtable_put(key, value) {
+ "use strict";
+ if (key === null || value === null) {
+ throw "NullPointerException {" + key + "},{" + value + "}";
+ }
+ this.hashtable[key] = value;
+}
+
+function hashtable_size() {
+ "use strict";
+ var iSize, iCounter, iOut;
+
+ iSize = 0;
+ iCounter = 0;
+ iOut = 0;
+
+ for (iCounter in this.hashtable) {
+ if (this.hashtable[iCounter] !== null) {
+ iSize = iSize + 1;
+ }
+ }
+ iOut = iSize;
+ return iOut;
+}
+
+function Hashtable() {
+ "use strict";
+ this.containsKey = hashtable_containsKey;
+ this.get = hashtable_get;
+ this.keys = hashtable_keys;
+ this.put = hashtable_put;
+ this.size = hashtable_size;
+ this.hashtable = [];
+}
+
+/* Detect Plugins */
+function fingerprint_plugins() {
+ "use strict";
+ var htIEComponents, strKey, strName, strVersion, strTemp, bolFirst, iCount, strMimeType, strOut;
+
+ try {
+ /* Create hashtable of IE components */
+ htIEComponents = new Hashtable();
+ htIEComponents.put("7790769C-0471-11D2-AF11-00C04FA35D02", "AddressBook"); // Address Book
+ htIEComponents.put("47F67D00-9E55-11D1-BAEF-00C04FC2D130", "AolArtFormat"); // AOL ART Image Format Support
+ htIEComponents.put("76C19B38-F0C8-11CF-87CC-0020AFEECF20", "ArabicDS"); // Arabic Text Display Support
+ htIEComponents.put("76C19B34-F0C8-11CF-87CC-0020AFEECF20", "ChineseSDS"); // Chinese (Simplified) Text Display Support
+ htIEComponents.put("76C19B33-F0C8-11CF-87CC-0020AFEECF20", "ChineseTDS"); // Chinese (traditional) Text Display Support
+ htIEComponents.put("238F6F83-B8B4-11CF-8771-00A024541EE3", "CitrixICA"); // Citrix ICA Client
+ htIEComponents.put("283807B5-2C60-11D0-A31D-00AA00B92C03", "DirectAnim"); // DirectAnimation
+ htIEComponents.put("44BBA848-CC51-11CF-AAFA-00AA00B6015C", "DirectShow"); // DirectShow
+ htIEComponents.put("9381D8F2-0288-11D0-9501-00AA00B911A5", "DynHTML"); // Dynamic HTML Data Binding
+ htIEComponents.put("4F216970-C90C-11D1-B5C7-0000F8051515", "DynHTML4Java"); // Dynamic HTML Data Binding for Java
+ htIEComponents.put("D27CDB6E-AE6D-11CF-96B8-444553540000", "Flash"); // Macromedia Flash
+ htIEComponents.put("76C19B36-F0C8-11CF-87CC-0020AFEECF20", "HebrewDS"); // Hebrew Text Display Support
+ htIEComponents.put("630B1DA0-B465-11D1-9948-00C04F98BBC9", "IEBrwEnh"); // Internet Explorer Browsing Enhancements
+ htIEComponents.put("08B0E5C0-4FCB-11CF-AAA5-00401C608555", "IEClass4Java"); // Internet Explorer Classes for Java
+ htIEComponents.put("45EA75A0-A269-11D1-B5BF-0000F8051515", "IEHelp"); // Internet Explorer Help
+ htIEComponents.put("DE5AED00-A4BF-11D1-9948-00C04F98BBC9", "IEHelpEng"); // Internet Explorer Help Engine
+ htIEComponents.put("89820200-ECBD-11CF-8B85-00AA005B4383", "IE5WebBrw"); // Internet Explorer 5/6 Web Browser
+ htIEComponents.put("5A8D6EE0-3E18-11D0-821E-444553540000", "InetConnectionWiz"); // Internet Connection Wizard
+ htIEComponents.put("76C19B30-F0C8-11CF-87CC-0020AFEECF20", "JapaneseDS"); // Japanese Text Display Support
+ htIEComponents.put("76C19B31-F0C8-11CF-87CC-0020AFEECF20", "KoreanDS"); // Korean Text Display Support
+ htIEComponents.put("76C19B50-F0C8-11CF-87CC-0020AFEECF20", "LanguageAS"); // Language Auto-Selection
+ htIEComponents.put("08B0E5C0-4FCB-11CF-AAA5-00401C608500", "MsftVM"); // Microsoft virtual machine
+ htIEComponents.put("5945C046-LE7D-LLDL-BC44-00C04FD912BE", "MSNMessengerSrv"); // MSN Messenger Service
+ htIEComponents.put("44BBA842-CC51-11CF-AAFA-00AA00B6015B", "NetMeetingNT"); // NetMeeting NT
+ htIEComponents.put("3AF36230-A269-11D1-B5BF-0000F8051515", "OfflineBrwPack"); // Offline Browsing Pack
+ htIEComponents.put("44BBA840-CC51-11CF-AAFA-00AA00B6015C", "OutlookExpress"); // Outlook Express
+ htIEComponents.put("76C19B32-F0C8-11CF-87CC-0020AFEECF20", "PanEuropeanDS"); // Pan-European Text Display Support
+ htIEComponents.put("4063BE15-3B08-470D-A0D5-B37161CFFD69", "QuickTime"); // Apple Quick Time
+ htIEComponents.put("DE4AF3B0-F4D4-11D3-B41A-0050DA2E6C21", "QuickTimeCheck"); // Apple Quick Time Check
+ htIEComponents.put("3049C3E9-B461-4BC5-8870-4C09146192CA", "RealPlayer"); // RealPlayer Download and Record Plugin for IE
+ htIEComponents.put("2A202491-F00D-11CF-87CC-0020AFEECF20", "ShockwaveDir"); // Macromedia Shockwave Director
+ htIEComponents.put("3E01D8E0-A72B-4C9F-99BD-8A6E7B97A48D", "Skype"); // Skype
+ htIEComponents.put("CC2A9BA0-3BDD-11D0-821E-444553540000", "TaskScheduler"); // Task Scheduler
+ htIEComponents.put("76C19B35-F0C8-11CF-87CC-0020AFEECF20", "ThaiDS"); // Thai Text Display Support
+ htIEComponents.put("3BF42070-B3B1-11D1-B5C5-0000F8051515", "Uniscribe"); // Uniscribe
+ htIEComponents.put("4F645220-306D-11D2-995D-00C04F98BBC9", "VBScripting"); // Visual Basic Scripting Support v5.6
+ htIEComponents.put("76C19B37-F0C8-11CF-87CC-0020AFEECF20", "VietnameseDS"); // Vietnamese Text Display Support
+ htIEComponents.put("10072CEC-8CC1-11D1-986E-00A0C955B42F", "VML"); // Vector Graphics Rendering (VML)
+ htIEComponents.put("90E2BA2E-DD1B-4CDE-9134-7A8B86D33CA7", "WebEx"); // WebEx Productivity Tools
+ htIEComponents.put("73FA19D0-2D75-11D2-995D-00C04F98BBC9", "WebFolders"); // Web Folders
+ htIEComponents.put("89820200-ECBD-11CF-8B85-00AA005B4340", "WinDesktopUpdateNT"); // Windows Desktop Update NT
+ htIEComponents.put("9030D464-4C02-4ABF-8ECC-5164760863C6", "WinLive"); // Windows Live ID Sign-in Helper
+ htIEComponents.put("6BF52A52-394A-11D3-B153-00C04F79FAA6", "WinMediaPlayer"); // Windows Media Player (Versions 7, 8 or 9)
+ htIEComponents.put("22D6F312-B0F6-11D0-94AB-0080C74C7E95", "WinMediaPlayerTrad"); // Windows Media Player (Traditional Versions)
+
+ strTemp = "";
+ bolFirst = true;
+
+ /* strOpera gives full path of the file, extract the filenames, ignoring description and length */
+ if (navigator.plugins.length > 0) {
+ for (iCount = 0; iCount < navigator.plugins.length; iCount = iCount + 1) {
+ if (bolFirst === true) {
+ strTemp += navigator.plugins[iCount].name;
+ bolFirst = false;
+ } else {
+ strTemp += glbSep + navigator.plugins[iCount].name;
+ }
+ }
+ } else if (navigator.mimeTypes.length > 0) {
+ strMimeType = navigator.mimeTypes;
+ for (iCount = 0; iCount < strMimeType.length; iCount = iCount + 1) {
+ if (bolFirst === true) {
+ strTemp += strMimeType[iCount].description;
+ bolFirst = false;
+ } else {
+ strTemp += glbSep + strMimeType[iCount].description;
+ }
+ }
+ } else {
+ document.body.addBehavior("#default#clientCaps");
+ strKey = htIEComponents.keys();
+ for (iCount = 0; iCount < htIEComponents.size(); iCount = iCount + 1) {
+ strVersion = activeXDetect(strKey[iCount]);
+ strName = htIEComponents.get(strKey[iCount]);
+ if (strVersion) {
+ if (bolFirst === true) {
+ strTemp = strName + glbPair + strVersion;
+ bolFirst = false;
+ } else {
+ strTemp += glbSep + strName + glbPair + strVersion;
+ }
+ }
+ }
+ strTemp = strTemp.replace(/,/g, ".");
+ }
+ strTemp = stripIllegalChars(strTemp);
+ if (strTemp === "") {
+ strTemp = "None";
+ }
+ strOut = strTemp;
+ return strOut;
+ } catch (err) {
+ return glbOnError;
+ }
+} \ No newline at end of file
diff --git a/webAO/golden/css/goldenlayout.css b/webAO/golden/css/goldenlayout.css
index ecb0d6b..72aa38d 100644
--- a/webAO/golden/css/goldenlayout.css
+++ b/webAO/golden/css/goldenlayout.css
@@ -42,7 +42,8 @@ body {
float: left;
}
.lm_content {
- overflow: hidden;
+ overflow-x: hidden;
+ overflow-y: auto;
position: relative;
}
.lm_dragging,
diff --git a/webAO/lib/gify.min.js b/webAO/lib/gify.min.js
new file mode 100644
index 0000000..8656d4a
--- /dev/null
+++ b/webAO/lib/gify.min.js
@@ -0,0 +1 @@
+var gify=function(){"use strict";function t(t){return 3*Math.pow(2,1+a(t.slice(5,8)))}function e(t){for(var e=[],i=7;i>=0;i--)e.push(t&1<<i?1:0);return e}function i(t){return t/100*1e3}function a(t){return t.reduce(function(t,e){return 2*t+e},0)}function r(t,e,i){for(var a={data:"",size:0};;){var r=t.getUint8(e+a.size,!0);if(0===r){a.size++;break}i&&(a.data+=t.getString(r,e+a.size+1)),a.size+=r+1}return a}function n(){return{identifier:"0",localPalette:!1,localPaletteSize:0,interlace:!1,comments:[],text:"",left:0,top:0,width:0,height:0,delay:0,disposal:0}}function o(a,o){var u=0,g=0,s={valid:!1,globalPalette:!1,globalPaletteSize:0,globalPaletteColorsRGB:[],loopCount:0,height:0,width:0,animated:!1,images:[],isBrowserDuration:!1,duration:0,durationIE:0,durationSafari:0,durationFirefox:0,durationChrome:0,durationOpera:0},d=new jDataView(a);if(a.byteLength<10)return s;if(18249!=d.getUint16(0)||17976!=d.getUint16(2))return s;s.width=d.getUint16(6,!0),s.height=d.getUint16(8,!0),s.valid=!0;var f=e(d.getUint8(10,!0));if(f[0]){var c=t(f);s.globalPalette=!0,s.globalPaletteSize=c/3,u+=c;for(var h=0;h<s.globalPaletteSize;h++){var v=13+3*h,U=d.getUint8(v,!0),b=d.getUint8(v+1,!0),m=d.getUint8(v+2,!0);s.globalPaletteColorsRGB.push({r:U,g:b,b:m})}}u+=13;for(var p=n();;){try{var w=d.getUint8(u,!0);switch(w){case 33:var z=d.getUint8(u+1,!0);if(249===z){var P=d.getUint8(u+2);if(4===P){var S=i(d.getUint16(u+4,!0));60>S&&!s.isBrowserDuration&&(s.isBrowserDuration=!0),p.delay=S,s.duration+=S,s.durationIE+=60>S?l:S,s.durationSafari+=20>S?l:S,s.durationChrome+=20>S?l:S,s.durationFirefox+=20>S?l:S,s.durationOpera+=20>S?l:S;var f=e(d.getUint8(u+3)),C=f.slice(3,6).join("");p.disposal=parseInt(C,2),u+=8}else u++}else{u+=2;var k=r(d,u,!0);switch(z){case 255:var y=d.getString(8,u+1);"NETSCAPE"===y&&(s.loopCount=d.getUint8(u+14,!0));break;case 206:p.identifier=k.data;break;case 254:p.comments.push(k.data);break;case 1:p.text=k.data}u+=k.size}break;case 44:p.left=d.getUint16(u+1,!0),p.top=d.getUint16(u+3,!0),p.width=d.getUint16(u+5,!0),p.height=d.getUint16(u+7,!0);var f=e(d.getUint8(u+9,!0));if(f[0]){var B=t(f);p.localPalette=!0,p.localPaletteSize=B/3,u+=B}if(f[1]&&(p.interlace=!0),s.images.push(p),g++,p=n(),p.identifier=g.toString(),s.images.length>1&&!s.animated&&(s.animated=!0,o))return s;u+=11;var k=r(d,u,!1);u+=k.size;break;case 59:return s;default:u++}}catch(x){return s.valid=!1,s}if(u>=a.byteLength)return s}return s}var l=100;return{isAnimated:function(t){var e=o(t,!0);return e.animated},getInfo:function(t){return o(t,!1)}}}(); \ No newline at end of file
diff --git a/webAO/lib/jdataview.min.js b/webAO/lib/jdataview.min.js
new file mode 100644
index 0000000..38e31b9
--- /dev/null
+++ b/webAO/lib/jdataview.min.js
@@ -0,0 +1,50 @@
+(function(global){var compatibility={ArrayBuffer:typeof ArrayBuffer!=='undefined',DataView:typeof DataView!=='undefined'&&('getFloat64'in DataView.prototype||'getFloat64'in new DataView(new ArrayBuffer(1))),NodeBuffer:typeof Buffer!=='undefined'&&'readInt16LE'in Buffer.prototype};var dataTypes={'Int8':1,'Int16':2,'Int32':4,'Uint8':1,'Uint16':2,'Uint32':4,'Float32':4,'Float64':8};var nodeNaming={'Int8':'Int8','Int16':'Int16','Int32':'Int32','Uint8':'UInt8','Uint16':'UInt16','Uint32':'UInt32','Float32':'Float','Float64':'Double'};var jDataView=function(buffer,byteOffset,byteLength,littleEndian){if(!(this instanceof jDataView)){throw new Error("jDataView constructor may not be called as a function");}
+this.buffer=buffer;if(!(compatibility.NodeBuffer&&buffer instanceof Buffer)&&!(compatibility.ArrayBuffer&&buffer instanceof ArrayBuffer)&&typeof buffer!=='string'){throw new TypeError('jDataView buffer has an incompatible type');}
+this._isArrayBuffer=compatibility.ArrayBuffer&&buffer instanceof ArrayBuffer;this._isDataView=compatibility.DataView&&this._isArrayBuffer;this._isNodeBuffer=compatibility.NodeBuffer&&buffer instanceof Buffer;this._littleEndian=littleEndian===undefined?false:littleEndian;var bufferLength=this._isArrayBuffer?buffer.byteLength:buffer.length;if(byteOffset===undefined){byteOffset=0;}
+this.byteOffset=byteOffset;if(byteLength===undefined){byteLength=bufferLength-byteOffset;}
+this.byteLength=byteLength;if(!this._isDataView){if(typeof byteOffset!=='number'){throw new TypeError('jDataView byteOffset is not a number');}
+if(typeof byteLength!=='number'){throw new TypeError('jDataView byteLength is not a number');}
+if(byteOffset<0){throw new Error('jDataView byteOffset is negative');}
+if(byteLength<0){throw new Error('jDataView byteLength is negative');}}
+if(this._isDataView){this._view=new DataView(buffer,byteOffset,byteLength);this._start=0;}
+this._start=byteOffset;if(byteOffset+byteLength>bufferLength){throw new Error("jDataView (byteOffset + byteLength) value is out of bounds");}
+this._offset=0;if(this._isDataView){for(var type in dataTypes){if(!dataTypes.hasOwnProperty(type)){continue;}
+(function(type,view){var size=dataTypes[type];view['get'+type]=function(byteOffset,littleEndian){if(littleEndian===undefined){littleEndian=view._littleEndian;}
+if(byteOffset===undefined){byteOffset=view._offset;}
+view._offset=byteOffset+size;return view._view['get'+type](byteOffset,littleEndian);}})(type,this);}}else if(this._isNodeBuffer&&compatibility.NodeBuffer){for(var type in dataTypes){if(!dataTypes.hasOwnProperty(type)){continue;}
+var name;if(type==='Int8'||type==='Uint8'){name='read'+nodeNaming[type];}else if(littleEndian){name='read'+nodeNaming[type]+'LE';}else{name='read'+nodeNaming[type]+'BE';}
+(function(type,view,name){var size=dataTypes[type];view['get'+type]=function(byteOffset,littleEndian){if(littleEndian===undefined){littleEndian=view._littleEndian;}
+if(byteOffset===undefined){byteOffset=view._offset;}
+view._offset=byteOffset+size;return view.buffer[name](view._start+byteOffset);}})(type,this,name);}}else{for(var type in dataTypes){if(!dataTypes.hasOwnProperty(type)){continue;}
+(function(type,view){var size=dataTypes[type];view['get'+type]=function(byteOffset,littleEndian){if(littleEndian===undefined){littleEndian=view._littleEndian;}
+if(byteOffset===undefined){byteOffset=view._offset;}
+view._offset=byteOffset+size;if(view._isArrayBuffer&&(view._start+byteOffset)%size===0&&(size===1||littleEndian)){return new global[type+'Array'](view.buffer,view._start+byteOffset,1)[0];}else{if(typeof byteOffset!=='number'){throw new TypeError('jDataView byteOffset is not a number');}
+if(byteOffset+size>view.byteLength){throw new Error('jDataView (byteOffset + size) value is out of bounds');}
+return view['_get'+type](view._start+byteOffset,littleEndian);}}})(type,this);}}};if(compatibility.NodeBuffer){jDataView.createBuffer=function(){var buffer=new Buffer(arguments.length);for(var i=0;i<arguments.length;++i){buffer[i]=arguments[i];}
+return buffer;}}else if(compatibility.ArrayBuffer){jDataView.createBuffer=function(){var buffer=new ArrayBuffer(arguments.length);var view=new Int8Array(buffer);for(var i=0;i<arguments.length;++i){view[i]=arguments[i];}
+return buffer;}}else{jDataView.createBuffer=function(){return String.fromCharCode.apply(null,arguments);}}
+jDataView.prototype={compatibility:compatibility,getString:function(length,byteOffset){var value;if(byteOffset===undefined){byteOffset=this._offset;}
+if(typeof byteOffset!=='number'){throw new TypeError('jDataView byteOffset is not a number');}
+if(length<0||byteOffset+length>this.byteLength){throw new Error('jDataView length or (byteOffset+length) value is out of bounds');}
+if(this._isNodeBuffer){value=this.buffer.toString('ascii',this._start+byteOffset,this._start+byteOffset+length);}
+else{value='';for(var i=0;i<length;++i){var char=this.getUint8(byteOffset+i);value+=String.fromCharCode(char>127?65533:char);}}
+this._offset=byteOffset+length;return value;},getChar:function(byteOffset){return this.getString(1,byteOffset);},tell:function(){return this._offset;},seek:function(byteOffset){if(typeof byteOffset!=='number'){throw new TypeError('jDataView byteOffset is not a number');}
+if(byteOffset<0||byteOffset>this.byteLength){throw new Error('jDataView byteOffset value is out of bounds');}
+return this._offset=byteOffset;},_endianness:function(byteOffset,pos,max,littleEndian){return byteOffset+(littleEndian?max-pos-1:pos);},_getFloat64:function(byteOffset,littleEndian){var b0=this._getUint8(this._endianness(byteOffset,0,8,littleEndian)),b1=this._getUint8(this._endianness(byteOffset,1,8,littleEndian)),b2=this._getUint8(this._endianness(byteOffset,2,8,littleEndian)),b3=this._getUint8(this._endianness(byteOffset,3,8,littleEndian)),b4=this._getUint8(this._endianness(byteOffset,4,8,littleEndian)),b5=this._getUint8(this._endianness(byteOffset,5,8,littleEndian)),b6=this._getUint8(this._endianness(byteOffset,6,8,littleEndian)),b7=this._getUint8(this._endianness(byteOffset,7,8,littleEndian)),sign=1-(2*(b0>>7)),exponent=((((b0<<1)&0xff)<<3)|(b1>>4))-(Math.pow(2,10)-1),mantissa=((b1&0x0f)*Math.pow(2,48))+(b2*Math.pow(2,40))+(b3*Math.pow(2,32))+
+(b4*Math.pow(2,24))+(b5*Math.pow(2,16))+(b6*Math.pow(2,8))+b7;if(exponent===1024){if(mantissa!==0){return NaN;}else{return sign*Infinity;}}
+if(exponent===-1023){return sign*mantissa*Math.pow(2,-1022-52);}
+return sign*(1+mantissa*Math.pow(2,-52))*Math.pow(2,exponent);},_getFloat32:function(byteOffset,littleEndian){var b0=this._getUint8(this._endianness(byteOffset,0,4,littleEndian)),b1=this._getUint8(this._endianness(byteOffset,1,4,littleEndian)),b2=this._getUint8(this._endianness(byteOffset,2,4,littleEndian)),b3=this._getUint8(this._endianness(byteOffset,3,4,littleEndian)),sign=1-(2*(b0>>7)),exponent=(((b0<<1)&0xff)|(b1>>7))-127,mantissa=((b1&0x7f)<<16)|(b2<<8)|b3;if(exponent===128){if(mantissa!==0){return NaN;}else{return sign*Infinity;}}
+if(exponent===-127){return sign*mantissa*Math.pow(2,-126-23);}
+return sign*(1+mantissa*Math.pow(2,-23))*Math.pow(2,exponent);},_getInt32:function(byteOffset,littleEndian){var b=this._getUint32(byteOffset,littleEndian);return b>Math.pow(2,31)-1?b-Math.pow(2,32):b;},_getUint32:function(byteOffset,littleEndian){var b3=this._getUint8(this._endianness(byteOffset,0,4,littleEndian)),b2=this._getUint8(this._endianness(byteOffset,1,4,littleEndian)),b1=this._getUint8(this._endianness(byteOffset,2,4,littleEndian)),b0=this._getUint8(this._endianness(byteOffset,3,4,littleEndian));return(b3*Math.pow(2,24))+(b2<<16)+(b1<<8)+b0;},_getInt16:function(byteOffset,littleEndian){var b=this._getUint16(byteOffset,littleEndian);return b>Math.pow(2,15)-1?b-Math.pow(2,16):b;},_getUint16:function(byteOffset,littleEndian){var b1=this._getUint8(this._endianness(byteOffset,0,2,littleEndian)),b0=this._getUint8(this._endianness(byteOffset,1,2,littleEndian));return(b1<<8)+b0;},_getInt8:function(byteOffset){var b=this._getUint8(byteOffset);return b>Math.pow(2,7)-1?b-Math.pow(2,8):b;},_getUint8:function(byteOffset){if(this._isArrayBuffer){return new Uint8Array(this.buffer,byteOffset,1)[0];}
+else if(this._isNodeBuffer){return this.buffer[byteOffset];}else{return this.buffer.charCodeAt(byteOffset)&0xff;}}};if(typeof jQuery!=='undefined'&&jQuery.fn.jquery>="1.6.2"){var convertResponseBodyToText=function(byteArray){var scrambledStr;try{scrambledStr=IEBinaryToArray_ByteStr(byteArray);}catch(e){var IEBinaryToArray_ByteStr_Script="Function IEBinaryToArray_ByteStr(Binary)\r\n"+" IEBinaryToArray_ByteStr = CStr(Binary)\r\n"+"End Function\r\n"+"Function IEBinaryToArray_ByteStr_Last(Binary)\r\n"+" Dim lastIndex\r\n"+" lastIndex = LenB(Binary)\r\n"+" if lastIndex mod 2 Then\r\n"+" IEBinaryToArray_ByteStr_Last = AscB( MidB( Binary, lastIndex, 1 ) )\r\n"+" Else\r\n"+" IEBinaryToArray_ByteStr_Last = -1\r\n"+" End If\r\n"+"End Function\r\n";window.execScript(IEBinaryToArray_ByteStr_Script,'vbscript');scrambledStr=IEBinaryToArray_ByteStr(byteArray);}
+var lastChr=IEBinaryToArray_ByteStr_Last(byteArray),result="",i=0,l=scrambledStr.length%8,thischar;while(i<l){thischar=scrambledStr.charCodeAt(i++);result+=String.fromCharCode(thischar&0xff,thischar>>8);}
+l=scrambledStr.length
+while(i<l){result+=String.fromCharCode((thischar=scrambledStr.charCodeAt(i++),thischar&0xff),thischar>>8,(thischar=scrambledStr.charCodeAt(i++),thischar&0xff),thischar>>8,(thischar=scrambledStr.charCodeAt(i++),thischar&0xff),thischar>>8,(thischar=scrambledStr.charCodeAt(i++),thischar&0xff),thischar>>8,(thischar=scrambledStr.charCodeAt(i++),thischar&0xff),thischar>>8,(thischar=scrambledStr.charCodeAt(i++),thischar&0xff),thischar>>8,(thischar=scrambledStr.charCodeAt(i++),thischar&0xff),thischar>>8,(thischar=scrambledStr.charCodeAt(i++),thischar&0xff),thischar>>8);}
+if(lastChr>-1){result+=String.fromCharCode(lastChr);}
+return result;};jQuery.ajaxSetup({converters:{'* dataview':function(data){return new jDataView(data);}},accepts:{dataview:"text/plain; charset=x-user-defined"},responseHandler:{dataview:function(responses,options,xhr){if('mozResponseArrayBuffer'in xhr){responses.text=xhr.mozResponseArrayBuffer;}
+else if('responseType'in xhr&&xhr.responseType==='arraybuffer'&&xhr.response){responses.text=xhr.response;}
+else if('responseBody'in xhr){responses.text=convertResponseBodyToText(xhr.responseBody);}
+else{responses.text=xhr.responseText;}}}});jQuery.ajaxPrefilter('dataview',function(options,originalOptions,jqXHR){if(jQuery.support.ajaxResponseType){if(!options.hasOwnProperty('xhrFields')){options.xhrFields={};}
+options.xhrFields.responseType='arraybuffer';}
+options.mimeType='text/plain; charset=x-user-defined';});}
+global.jDataView=(global.module||{}).exports=jDataView;if(typeof module!=='undefined'){module.exports=jDataView;}})(this); \ No newline at end of file
diff --git a/webAO/lib/jquery.ui.touch-punch.min.js b/webAO/lib/jquery.ui.touch-punch.min.js
new file mode 100644
index 0000000..31272ce
--- /dev/null
+++ b/webAO/lib/jquery.ui.touch-punch.min.js
@@ -0,0 +1,11 @@
+/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ */
+!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); \ No newline at end of file
diff --git a/webAO/master.html b/webAO/master.html
index 58473b4..b65c554 100644
--- a/webAO/master.html
+++ b/webAO/master.html
@@ -3,7 +3,7 @@
<title>Attorney Online ONLINE</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css"/>
<link rel="icon" href="images/favicon.ico"/>
- <script src="master.js"></script>
+ <script src="master.b.js"></script>
</head>
<body>
<div id="logo">
@@ -29,7 +29,7 @@
</div>
<div id="content">
<center>
- <p>Please note that the webclient is still in beta</p><br>
+ <p>This page uses cookies. By clicking on a server you agree that a cookie is saved on your computer.</p><br>
<p style="color:#ff0000;">The downloadable client is recommended</p><br>
<p>The green servers are more likely to work, red ones will not</p>
</center>
@@ -39,4 +39,4 @@
</ul>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/webAO/master.js b/webAO/master.js
index 4c29a7c..0b2bcf9 100644
--- a/webAO/master.js
+++ b/webAO/master.js
@@ -1,67 +1,45 @@
-MASTERSERVER_IP = "master.aceattorneyonline.com:27014"
-//MASTERSERVER_IP = "192.168.1.28:27014"
+const MASTERSERVER_IP = "master.aceattorneyonline.com:27014";
-masterserver = new WebSocket("ws://" + MASTERSERVER_IP);
+const masterserver = new WebSocket("ws://" + MASTERSERVER_IP);
masterserver.onopen = (evt) => onOpen(evt);
-masterserver.onclose = (evt) => onClose(evt);
masterserver.onmessage = (evt) => onMessage(evt);
-masterserver.onerror = (evt) => onError(evt);
-var idnow;
-var descs = [];
-descs[99]="This is your computer on port 27016";
-var onlinec = [];
-var serverpics = [];
-function UrlExists(url)
-{
- var http = new XMLHttpRequest();
- http.open('HEAD', url, false);
- http.send();
- return http.status != 404;
-}
+const descs = [];
+descs[99] = "This is your computer on port 27016";
+const onlinec = [];
function setServ(ID) {
console.log(descs[ID]);
- if (descs[ID] != undefined) {
+ if (descs[ID] !== undefined) {
document.getElementById("serverdescC").innerHTML = "<b>Online: "+onlinec[ID]+"</b><br>" +descs[ID];
}
else {
document.getElementById("serverdescC").innerHTML = "";
}
-// idnow = ID;
-// document.getElementById("serverthumbC").src = serverpics[ID];
-// if (UrlExists(serverpics[ID])) {
-// document.getElementById("serverthumbC").src = serverpics[ID];
-// }
-// else {
-// document.getElementById("serverthumbC").src = "/images/static.gif";
-// }
}
-function onOpen(e) {
- console.log("Open");
+function onOpen(_e) {
masterserver.send("ID#webAO#webAO#%");
masterserver.send("ALL#%");
masterserver.send("VC#%");
-};
+}
function checkOnline(serverID,coIP) {
- function onCOOpen(e) {
- console.log("Open");
- document.getElementById('server'+serverID).className = "available";
+ function onCOOpen(_e) {
+ document.getElementById(`server${serverID}`).className = "available";
oserv.send("HI#webAO#%");
oserv.send("ID#webAO#webAO#%");
- };
+ }
+
function onCOMessage(e) {
- comsg = e.data;
- console.log(comsg)
- coheader = comsg.split('#', 2)[0];
- coarguments = comsg.split('#').slice(1)
- if (coheader == 'PN') {
- onlinec[serverID]=coarguments[0]+"/"+coarguments[1];
+ const comsg = e.data;
+ const coheader = comsg.split("#", 2)[0];
+ const coarguments = comsg.split("#").slice(1);
+ if (coheader === "PN") {
+ onlinec[serverID] = `${coarguments[0]}/${coarguments[1]}`;
oserv.close();
}
- };
+ }
var oserv = new WebSocket("ws://" + coIP);
@@ -76,38 +54,31 @@ function checkOnline(serverID,coIP) {
}
function onMessage(e) {
- msg = e.data;
- console.log(msg)
- header = msg.split('#', 2)[0];
- if (header == 'ALL') {
- let servers = msg.split('#').slice(1)
+ const msg = e.data;
+ console.log(msg);
+ const header = msg.split("#", 2)[0];
+
+ if (header === "ALL") {
+ const servers = msg.split("#").slice(1);
for (let i = 0; i < servers.length; i++) {
- let serverEntry = servers[i];
- let arguments = serverEntry.split('&');
- document.getElementById('masterlist').innerHTML +=
- `<li id="server${i}" class="unavailable" onmouseover="setServ(${i})"><p>${arguments[0]}</p>`
- + `<a class="button" href="client.html?mode=watch&ip=${arguments[2]}:${arguments[3]}">Watch</a>`
- + `<a class="button" href="client.html?mode=join&ip=${arguments[2]}:${arguments[3]}">Join</a></li><br/>`;
- descs[i] = arguments[1];
- setTimeout(checkOnline(i, arguments[2] + ':' + arguments[3]), 3);
+ const serverEntry = servers[i];
+ const args = serverEntry.split("&");
+ const asset = args[4] ? `&asset=${args[4]}` : "";
+
+ document.getElementById("masterlist").innerHTML +=
+ `<li id="server${i}" class="unavailable" onmouseover="setServ(${i})"><p>${args[0]}</p>`
+ + `<a class="button" href="client.html?mode=watch&ip=${args[2]}:${args[3]}${asset}">Watch</a>`
+ + `<a class="button" href="client.html?mode=join&ip=${args[2]}:${args[3]}${asset}">Join</a></li><br/>`;
+ descs[i] = args[1];
+ setTimeout(checkOnline(i, args[2] + ":" + args[3]), 3000);
}
+ } else if (header === "servercheok") {
+ const args = msg.split("#").slice(1);
+ console.log(args);
+ document.getElementById("clientinfo").innerHTML = `Client version: ${args[0]}`;
+ } else if (header === "SV") {
+ const args = msg.split("#").slice(1);
+ console.log(args);
+ document.getElementById("serverinfo").innerHTML = `Master server version: ${args[0]}`;
}
- else if (header == 'servercheok') {
- let arguments = msg.split('#').slice(1)
- console.log(arguments);
- document.getElementById('clientinfo').innerHTML = "Client version: " + arguments[0];
- }
- else if (header == 'SV') {
- let arguments = msg.split('#').slice(1)
- console.log(arguments);
- document.getElementById('serverinfo').innerHTML = "Master server version: "+arguments[0];
- }
-};
-
-function onError(e) {
- //Stub
-};
-
-function onClose(e) {
- //Stub
-};
+}
diff --git a/webAO/misc/character_change.png b/webAO/misc/character_change.png
new file mode 100644
index 0000000..ef210c8
--- /dev/null
+++ b/webAO/misc/character_change.png
Binary files differ
diff --git a/webAO/misc/character_random.png b/webAO/misc/character_random.png
new file mode 100644
index 0000000..e90267e
--- /dev/null
+++ b/webAO/misc/character_random.png
Binary files differ
diff --git a/webAO/misc/crossexamination.gif b/webAO/misc/crossexamination.gif
new file mode 100644
index 0000000..a7754b6
--- /dev/null
+++ b/webAO/misc/crossexamination.gif
Binary files differ
diff --git a/webAO/misc/empty.png b/webAO/misc/empty.png
new file mode 100644
index 0000000..faf2162
--- /dev/null
+++ b/webAO/misc/empty.png
Binary files differ
diff --git a/webAO/misc/evidence_add.png b/webAO/misc/evidence_add.png
new file mode 100644
index 0000000..755c904
--- /dev/null
+++ b/webAO/misc/evidence_add.png
Binary files differ
diff --git a/webAO/misc/evidence_cancel.png b/webAO/misc/evidence_cancel.png
new file mode 100644
index 0000000..401b49c
--- /dev/null
+++ b/webAO/misc/evidence_cancel.png
Binary files differ
diff --git a/webAO/misc/evidence_edit.png b/webAO/misc/evidence_edit.png
new file mode 100644
index 0000000..c6ce8eb
--- /dev/null
+++ b/webAO/misc/evidence_edit.png
Binary files differ
diff --git a/webAO/misc/evidence_remove.png b/webAO/misc/evidence_remove.png
new file mode 100644
index 0000000..0ba3913
--- /dev/null
+++ b/webAO/misc/evidence_remove.png
Binary files differ
diff --git a/webAO/misc/evidence_selector.png b/webAO/misc/evidence_selector.png
new file mode 100644
index 0000000..266493d
--- /dev/null
+++ b/webAO/misc/evidence_selector.png
Binary files differ
diff --git a/webAO/misc/flash.png b/webAO/misc/flash.png
new file mode 100644
index 0000000..acbcdb8
--- /dev/null
+++ b/webAO/misc/flash.png
Binary files differ
diff --git a/webAO/misc/flip.png b/webAO/misc/flip.png
new file mode 100644
index 0000000..bfe2929
--- /dev/null
+++ b/webAO/misc/flip.png
Binary files differ
diff --git a/webAO/misc/holdit.gif b/webAO/misc/holdit.gif
new file mode 100644
index 0000000..5f71ac6
--- /dev/null
+++ b/webAO/misc/holdit.gif
Binary files differ
diff --git a/webAO/misc/location_change.png b/webAO/misc/location_change.png
new file mode 100644
index 0000000..04309eb
--- /dev/null
+++ b/webAO/misc/location_change.png
Binary files differ
diff --git a/webAO/misc/objection.gif b/webAO/misc/objection.gif
new file mode 100644
index 0000000..6aae2e5
--- /dev/null
+++ b/webAO/misc/objection.gif
Binary files differ
diff --git a/webAO/misc/placeholder.gif b/webAO/misc/placeholder.gif
index e35aaf4..dc96fae 100644
--- a/webAO/misc/placeholder.gif
+++ b/webAO/misc/placeholder.gif
Binary files differ
diff --git a/webAO/misc/shake.png b/webAO/misc/shake.png
new file mode 100644
index 0000000..1a51968
--- /dev/null
+++ b/webAO/misc/shake.png
Binary files differ
diff --git a/webAO/misc/takethat.gif b/webAO/misc/takethat.gif
new file mode 100644
index 0000000..dd03310
--- /dev/null
+++ b/webAO/misc/takethat.gif
Binary files differ
diff --git a/webAO/misc/witnesstestimony.gif b/webAO/misc/witnesstestimony.gif
new file mode 100644
index 0000000..03b4900
--- /dev/null
+++ b/webAO/misc/witnesstestimony.gif
Binary files differ
diff --git a/webAO/sounds/general/sfx-testimony.wav b/webAO/sounds/general/sfx-testimony.wav
new file mode 100644
index 0000000..ddbe9ea
--- /dev/null
+++ b/webAO/sounds/general/sfx-testimony.wav
Binary files differ
diff --git a/webAO/sounds/general/sfx-testimony2.wav b/webAO/sounds/general/sfx-testimony2.wav
new file mode 100644
index 0000000..a49506e
--- /dev/null
+++ b/webAO/sounds/general/sfx-testimony2.wav
Binary files differ
diff --git a/webAO/ui.b.js b/webAO/ui.b.js
index 1c976b0..2881736 100644
--- a/webAO/ui.b.js
+++ b/webAO/ui.b.js
@@ -1,2 +1,2 @@
-!function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){(function(e){var n,i,o,s;function r(e){var t="function"==typeof Map?new Map:void 0;return(r=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return a(e,arguments,u(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),m(i,e)})(e)}function a(e,t,n){return(a=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct:function(e,t,n){var i=[null];i.push.apply(i,t);var o=new(Function.bind.apply(e,i));return n&&m(o,n.prototype),o}).apply(null,arguments)}function l(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function c(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),e}function h(e,t){return!t||"object"!==g(t)&&"function"!=typeof t?d(e):t}function u(e){return(u=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function f(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&m(e,t)}function m(e,t){return(m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function g(e){return(g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}"undefined"==typeof self||self,s=function(){var e=Math.min,t=Math.floor,n=Math.max;return function(e){function t(i){if(n[i])return n[i].exports;var o=n[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=35)}([function(e,t,n){"use strict";t.e=function(e){return $.zepto?e.touches?e.targetTouches[0]:e:e.originalEvent&&e.originalEvent.touches?e.originalEvent.touches[0]:e},t.j=function(e){var t,n;if("function"==typeof o.a)return o()(e);for(n in t=[],e)t.push(n);return t},t.d=function(e){if(window.location.hash)return function(e){var t=location.hash.match(new RegExp(e+"=([^&]*)"));return t?t[1]:null}(e);if(!window.location.search)return null;var t,n,i=window.location.search.substr(1).split("&"),o={};for(n=0;n<i.length;n++)o[(t=i[n].split("="))[0]]=t[1];return o[e]||null},t.b=function(e,t){for(var n in t)e[n]=t[n];return e},t.a=function(e){return(window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)})(function(){e()})},t.g=function(e,t){if(!(t instanceof Array))throw new Error("Haystack is not an Array");if(t.indexOf)return t.indexOf(e);for(var n=0;n<t.length;n++)if(t[n]===e)return n;return-1},n.d(t,"h",function(){return r}),t.c=function(e,t,n){if(void 0!==Function.prototype.bind)return Function.prototype.bind.apply(e,[t].concat(n||[]));var i=function i(){var o=(n||[]).concat(Array.prototype.slice.call(arguments,0));return this instanceof i?void e.apply(this,o):e.apply(t,o)};return i.prototype=e.prototype,i},t.i=function(){return"function"==typeof Date.now?Date.now():(new Date).getTime()},t.f=function(){return(1e15*Math.random()).toString(36).replace(".","")},t.k=function(e){return $.trim(e.replace(/(<([^>]+)>)/gi,""))};var i=n(40),o=n.n(i),s=n(60),r=(n.n(s),"object"!=("undefined"==typeof Int8Array?"undefined":g(Int8Array))?function(e){return"function"==typeof e||!1}:function(e){return"[object Function]"===toString.call(e)})},function(e,t,n){"use strict";var i=n(0),o="__all";t.a=o,t.b=function(){return function e(){p(this,e),this._mSubscriptions={},this._mSubscriptions[o]=[],this.on=function(e,t,n){if(!Object(i.h)(t))throw new Error("Tried to listen to event "+e+" with non-function callback "+t);this._mSubscriptions[e]||(this._mSubscriptions[e]=[]),this._mSubscriptions[e].push({fn:t,ctx:n})},this.emit=function(e){var t,n,i;i=Array.prototype.slice.call(arguments,1);var s=this._mSubscriptions[e];if(s)for(s=s.slice(),t=0;t<s.length;t++)n=s[t].ctx||{},s[t].fn.apply(n,i);i.unshift(e);var r=this._mSubscriptions[o].slice();for(t=0;t<r.length;t++)n=r[t].ctx||{},r[t].fn.apply(n,i)},this.unbind=function(e,t,n){if(!this._mSubscriptions[e])throw new Error("No subscribtions to unsubscribe for event "+e);var i,o=!1;for(i=0;i<this._mSubscriptions[e].length;i++)t&&this._mSubscriptions[e][i].fn!==t||n&&n!==this._mSubscriptions[e][i].ctx||(this._mSubscriptions[e].splice(i,1),o=!0);if(0==o)throw new Error("Nothing to unbind for "+e)},this.off=this.unbind,this.trigger=this.emit}}()},function(e){var t=e.exports={version:"2.5.6"};"number"==typeof __e&&(__e=t)},function(e,t,n){"use strict";var i=n(1),o=n(26),s=n(12),r=n(27),a=n(66),l=n(0),m=function(e){function t(e,n,o){var s;return p(this,t),(s=h(this,u(t).call(this))).config=s._extendItemNode(n),s.type=n.type,s.contentItems=[],s.parent=o,s.isInitialised=!1,s.isMaximised=!1,s.isRoot=!1,s.isRow=!1,s.isColumn=!1,s.isStack=!1,s.isComponent=!1,s.layoutManager=e,s._pendingEventPropagations={},s._throttledEvents=["stateChanged"],s.on(i.a,s._propagateEvent,d(s)),n.content&&s._createContentItems(n),s}return f(t,i.b),c(t,[{key:"setSize",value:function(){throw new Error("Abstract Method")}},{key:"callDownwards",value:function(e,t,n,i){var o;for(!0!==n&&!0!==i&&this[e].apply(this,t||[]),o=0;o<this.contentItems.length;o++)this.contentItems[o].callDownwards(e,t,n);!0===n&&!0!==i&&this[e].apply(this,t||[])}},{key:"removeChild",value:function(e,t){var n=Object(l.g)(e,this.contentItems);if(-1===n)throw new Error("Can't remove child item. Unknown content item");!0!==t&&this.contentItems[n]._$destroy(),this.contentItems.splice(n,1),this.config.content.splice(n,1),0<this.contentItems.length?this.callDownwards("setSize"):!(this instanceof s.a)&&!0===this.config.isClosable&&this.parent.removeChild(this)}},{key:"undisplayChild",value:function(e){if(-1===Object(l.g)(e,this.contentItems))throw new Error("Can't remove child item. Unknown content item");this instanceof s.a||!0!==this.config.isClosable||this.parent.undisplayChild(this)}},{key:"addChild",value:function(e,t){void 0===t&&(t=this.contentItems.length),this.contentItems.splice(t,0,e),void 0===this.config.content&&(this.config.content=[]),this.config.content.splice(t,0,e.config),e.parent=this,!0===e.parent.isInitialised&&!1===e.isInitialised&&e._$init()}},{key:"replaceChild",value:function(e,t,n){t=this.layoutManager._$normalizeContentItem(t);var i=Object(l.g)(e,this.contentItems),o=e.element[0].parentNode;if(-1===i)throw new Error("Can't replace child. oldChild is not child of this");o.replaceChild(t.element[0],e.element[0]),!0===n&&(e.parent=null,e._$destroy()),this.contentItems[i]=t,t.parent=this,this.isStack&&(this.header.tabs[i].contentItem=t),!0===t.parent.isInitialised&&!1===t.isInitialised&&t._$init(),this.callDownwards("setSize")}},{key:"remove",value:function(){this.parent.removeChild(this)}},{key:"popout",value:function(){var e=this.layoutManager.createPopout(this);return this.emitBubblingEvent("stateChanged"),e}},{key:"toggleMaximise",value:function(e){e&&e.preventDefault(),!0===this.isMaximised?this.layoutManager._$minimiseItem(this):this.layoutManager._$maximiseItem(this),this.isMaximised=!this.isMaximised,this.emitBubblingEvent("stateChanged")}},{key:"select",value:function(){this.layoutManager.selectedItem!==this&&(this.layoutManager.selectItem(this,!0),this.element.addClass("lm_selected"))}},{key:"deselect",value:function(){this.layoutManager.selectedItem===this&&(this.layoutManager.selectedItem=null,this.element.removeClass("lm_selected"))}},{key:"setTitle",value:function(e){this.config.title=e,this.emit("titleChanged",e),this.emit("stateChanged")}},{key:"hasId",value:function(e){return!!this.config.id&&("string"==typeof this.config.id?this.config.id===e:this.config.id instanceof Array?-1!==Object(l.g)(e,this.config.id):void 0)}},{key:"addId",value:function(e){this.hasId(e)||(this.config.id?"string"==typeof this.config.id?this.config.id=[this.config.id,e]:this.config.id instanceof Array&&this.config.id.push(e):this.config.id=e)}},{key:"removeId",value:function(e){if(!this.hasId(e))throw new Error("Id not found");if("string"==typeof this.config.id)delete this.config.id;else if(this.config.id instanceof Array){var t=Object(l.g)(e,this.config.id);this.config.id.splice(t,1)}}},{key:"getItemsByFilter",value:function(e){var t=[];return function n(i){for(var o=0;o<i.contentItems.length;o++)!0===e(i.contentItems[o])&&t.push(i.contentItems[o]),n(i.contentItems[o])}(this),t}},{key:"getItemsById",value:function(e){return this.getItemsByFilter(function(t){return t.config.id instanceof Array?-1!==Object(l.g)(e,t.config.id):t.config.id===e})}},{key:"getItemsByType",value:function(e){return this._$getItemsByProperty("type",e)}},{key:"getComponentsByName",value:function(e){var t,n=this._$getItemsByProperty("componentName",e),i=[];for(t=0;t<n.length;t++)i.push(n[t].instance);return i}},{key:"_$getItemsByProperty",value:function(e,t){return this.getItemsByFilter(function(n){return n[e]===t})}},{key:"_$setParent",value:function(e){this.parent=e}},{key:"_$highlightDropZone",value:function(e,t,n){this.layoutManager.dropTargetIndicator.highlightArea(n)}},{key:"_$onDrop",value:function(e){this.addChild(e)}},{key:"_$hide",value:function(){this._callOnActiveComponents("hide"),this.element.hide(),this.layoutManager.updateSize()}},{key:"_$show",value:function(){this._callOnActiveComponents("show"),this.element.show(),this.layoutManager.updateSize()}},{key:"_callOnActiveComponents",value:function(e){var t,n,i=this.getItemsByType("stack");for(n=0;n<i.length;n++)(t=i[n].getActiveContentItem())&&t.isComponent&&t.container[e]()}},{key:"_$destroy",value:function(){this.emitBubblingEvent("beforeItemDestroyed"),this.callDownwards("_$destroy",[],!0,!0),this.element.remove(),this.emitBubblingEvent("itemDestroyed")}},{key:"_$getArea",value:function(e){var t=(e=e||this.element).offset(),n=e.width(),i=e.height();return{x1:t.left,y1:t.top,x2:t.left+n,y2:t.top+i,surface:n*i,contentItem:this}}},{key:"_$init",value:function(){var e;for(this.setSize(),e=0;e<this.contentItems.length;e++)this.childElementContainer.append(this.contentItems[e].element);this.isInitialised=!0,this.emitBubblingEvent("itemCreated"),this.emitBubblingEvent(this.type+"Created")}},{key:"emitBubblingEvent",value:function(e){var t=new o.a(e,this);this.emit(e,t)}},{key:"_createContentItems",value:function(e){var t,n;if(!(e.content instanceof Array))throw new r.a("content must be an Array",e);for(n=0;n<e.content.length;n++)t=this.layoutManager.createContentItem(e.content[n],this),this.contentItems.push(t)}},{key:"_extendItemNode",value:function(e){for(var t in a.a)void 0===e[t]&&(e[t]=a.a[t]);return e}},{key:"_propagateEvent",value:function(e,t){t instanceof o.a&&!1===t.isPropagationStopped&&!0===this.isInitialised&&(!1===this.isRoot&&this.parent?this.parent.emit.apply(this.parent,Array.prototype.slice.call(arguments,0)):this._scheduleEventPropagationToLayoutManager(e,t))}},{key:"_scheduleEventPropagationToLayoutManager",value:function(e,t){-1===Object(l.g)(e,this._throttledEvents)?this.layoutManager.emit(e,t.origin):!0!==this._pendingEventPropagations[e]&&(this._pendingEventPropagations[e]=!0,Object(l.a)(Object(l.c)(this._propagateEventToLayoutManager,this,[e,t])))}},{key:"_propagateEventToLayoutManager",value:function(e,t){this._pendingEventPropagations[e]=!1,this.layoutManager.emit(e,t)}}]),t}();t.a=m},function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)},function(e,t,n){e.exports=!n(10)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,i,o){"use strict";var s=Math.round,r=o(3),a=o(13),l=o(67),d=o(0),m=function(e){function i(e,t,n,o){var s;return p(this,i),(s=h(this,u(i).call(this,t,n,o))).isRow=!e,s.isColumn=e,s.element=$('<div class="lm_item lm_'+(e?"column":"row")+'"></div>'),s.childElementContainer=s.element,s._splitterSize=t.config.dimensions.borderWidth,s._splitterGrabSize=t.config.dimensions.borderGrabWidth,s._isColumn=e,s._dimension=e?"height":"width",s._splitter=[],s._splitterPosition=null,s._splitterMinPosition=null,s._splitterMaxPosition=null,s}return f(i,r.a),c(i,[{key:"addChild",value:function(e,t,i){var o,s,a,l;if(e=this.layoutManager._$normalizeContentItem(e,this),void 0===t&&(t=this.contentItems.length),0<this.contentItems.length?(l=this._createSplitter(n(0,t-1)).element,0<t?(this.contentItems[t-1].element.after(l),l.after(e.element),this._isDocked(t-1)&&(this._splitter[t-1].element.hide(),this._splitter[t].element.show())):(this.contentItems[0].element.before(l),l.before(e.element))):this.childElementContainer.append(e.element),r.a.prototype.addChild.call(this,e,t),o=1/this.contentItems.length*100,!0!==i){for(a=0;a<this.contentItems.length;a++)this.contentItems[a]===e?e.config[this._dimension]=o:(s=this.contentItems[a].config[this._dimension]*=(100-o)/100,this.contentItems[a].config[this._dimension]=s);this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged"),this._validateDocking()}else this.emitBubblingEvent("stateChanged")}},{key:"undisplayChild",value:function(e){var t,i=e.config[this._dimension],o=Object(d.g)(e,this.contentItems),s=n(o-1,0);if(-1===o)throw new Error("Can't undisplay child. ContentItem is not child of this Row or Column");this._splitter[s]&&this._splitter[s].element.hide(),s<this._splitter.length&&this._isDocked(s)&&this._splitter[s].element.hide();var a=this._isDocked();for(t=0;t<this.contentItems.length;t++)this.contentItems[t]===e?this.contentItems[t].config[this._dimension]=0:this._isDocked(t)||(this.contentItems[t].config[this._dimension]+=i/(this.contentItems.length-1-a));1===this.contentItems.length&&r.a.prototype.undisplayChild.call(this,e),this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")}},{key:"removeChild",value:function(e,t){var i,o,s=e.config[this._dimension],a=Object(d.g)(e,this.contentItems),l=n(a-1,0);if(-1===a)throw new Error("Can't remove child. ContentItem is not child of this Row or Column");this._splitter[l]&&(this._splitter[l]._$destroy(),this._splitter.splice(l,1)),l<this._splitter.length&&this._isDocked(l)&&this._splitter[l].element.hide();var c=this._isDocked();for(i=0;i<this.contentItems.length;i++)this.contentItems[i]!==e&&(this._isDocked(i)||(this.contentItems[i].config[this._dimension]+=s/(this.contentItems.length-1-c)));r.a.prototype.removeChild.call(this,e,t),1===this.contentItems.length&&!0===this.config.isClosable?(o=this.contentItems[0],this.contentItems=[],this.parent.replaceChild(this,o,!0),this._validateDocking(this.parent)):(this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged"),this._validateDocking())}},{key:"replaceChild",value:function(e,t){var n=e.config[this._dimension];r.a.prototype.replaceChild.call(this,e,t),t.config[this._dimension]=n,this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")}},{key:"setSize",value:function(){0<this.contentItems.length&&(this._calculateRelativeSizes(),this._setAbsoluteSizes()),this.emitBubblingEvent("stateChanged"),this.emit("resize")}},{key:"dock",value:function(e,t,i){if(1===this.contentItems.length)throw new Error("Can't dock child when it single");var o=e.config[this._dimension],s=this.layoutManager.config.dimensions.headerHeight,r=Object(d.g)(e,this.contentItems),a=n(r-1,0);if(-1===r)throw new Error("Can't dock child. ContentItem is not child of this Row or Column");var l,c=e._docker&&e._docker.docked;if(void 0===t||t!=c){if(c){for(this._splitter[a].element.show(),l=0;l<this.contentItems.length;l++){var h=e._docker.size;this.contentItems[l]===e?e.config[this._dimension]=h:(itemSize=this.contentItems[l].config[this._dimension]*=(100-h)/100,this.contentItems[l].config[this._dimension]=itemSize)}e._docker={docked:!1}}else{if(2>this.contentItems.length-this._isDocked())throw new Error("Can't dock child when it is last in "+this.config.type);var u={column:{first:"top",last:"bottom"},row:{first:"left",last:"right"}}[this.config.type][r?"last":"first"];e.header.position()!=u&&e.header.position(u),this._splitter[a]&&this._splitter[a].element.hide();var f=this._isDocked();for(l=0;l<this.contentItems.length;l++)this.contentItems[l]===e?this.contentItems[l].config[this._dimension]=0:this._isDocked(l)||(this.contentItems[l].config[this._dimension]+=o/(this.contentItems.length-1-f));e._docker={dimension:this._dimension,size:o,realSize:e.element[this._dimension]()-s,docked:!0},i&&e.childElementContainer[this._dimension](0)}e.element.toggleClass("lm_docked",e._docker.docked),this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged"),this._validateDocking()}}},{key:"_$init",value:function(){if(!0!==this.isInitialised){var e;for(r.a.prototype._$init.call(this),e=0;e<this.contentItems.length-1;e++)this.contentItems[e].element.after(this._createSplitter(e).element);for(e=0;e<this.contentItems.length;e++)this.contentItems[e]._header&&this.contentItems[e]._header.docked&&this.dock(this.contentItems[e],!0,!0)}}},{key:"_setAbsoluteSizes",value:function(){var e,t=this._calculateAbsoluteSizes();for(e=0;e<this.contentItems.length;e++)0<t.additionalPixel-e&&t.itemSizes[e]++,this._isColumn?(this.contentItems[e].element.width(t.totalWidth),this.contentItems[e].element.height(t.itemSizes[e])):(this.contentItems[e].element.width(t.itemSizes[e]),this.contentItems[e].element.height(t.totalHeight))}},{key:"_calculateAbsoluteSizes",value:function(){var e,n,i=(this.contentItems.length-1)*this._splitterSize,o=this.layoutManager.config.dimensions.headerHeight,s=this.element.width(),r=this.element.height(),a=0,l=[];for(this._isColumn?r-=i:s-=i,e=0;e<this.contentItems.length;e++)this._isDocked(e)&&(this._isColumn?r-=o-this._splitterSize:s-=o-this._splitterSize);for(e=0;e<this.contentItems.length;e++)n=this._isColumn?t(r*(this.contentItems[e].config.height/100)):t(s*(this.contentItems[e].config.width/100)),this._isDocked(e)&&(n=o),a+=n,l.push(n);return{itemSizes:l,additionalPixel:t((this._isColumn?r:s)-a),totalWidth:s,totalHeight:r}}},{key:"_calculateRelativeSizes",value:function(){var e,t=0,n=[],i=this._isColumn?"height":"width";for(e=0;e<this.contentItems.length;e++)void 0===this.contentItems[e].config[i]?n.push(this.contentItems[e]):t+=this.contentItems[e].config[i];if(100!==s(t))if(100>s(t)&&0<n.length){for(e=0;e<n.length;e++)n[e].config[i]=(100-t)/n.length;this._respectMinItemWidth()}else{if(100<s(t))for(e=0;e<n.length;e++)n[e].config[i]=50,t+=50;for(e=0;e<this.contentItems.length;e++)this.contentItems[e].config[i]=this.contentItems[e].config[i]/t*100;this._respectMinItemWidth()}else this._respectMinItemWidth()}},{key:"_respectMinItemWidth",value:function(){var e,t,n,i=this.layoutManager.config.dimensions&&this.layoutManager.config.dimensions.minItemWidth||0,o=null,r=[],a=0,l=0,c=0,h=0,u=[];if(!(this._isColumn||!i||1>=this.contentItems.length)){o=this._calculateAbsoluteSizes();for(var d=0;d<this.contentItems.length;d++)this.contentItems[d],(h=o.itemSizes[d])<i?(l+=i-h,n={width:i}):(a+=h-i,n={width:h},r.push(n)),u.push(n);if(!(0==l||l>a)){for(e=l/a,c=l,d=0;d<r.length;d++)n=r[d],c-=t=s((n.width-i)*e),n.width-=t;for(0!==c&&(u[u.length-1].width-=c),d=0;d<this.contentItems.length;d++)this.contentItems[d].config.width=u[d].width/o.totalWidth*100}}}},{key:"_createSplitter",value:function(e){var t;return(t=new l.a(this._isColumn,this._splitterSize,this._splitterGrabSize)).on("drag",Object(d.c)(this._onSplitterDrag,this,[t]),this),t.on("dragStop",Object(d.c)(this._onSplitterDragStop,this,[t]),this),t.on("dragStart",Object(d.c)(this._onSplitterDragStart,this,[t]),this),this._splitter.splice(e,0,t),t}},{key:"_getItemsForSplitter",value:function(e){var t=Object(d.g)(e,this._splitter);return{before:this.contentItems[t],after:this.contentItems[t+1]}}},{key:"_isDocked",value:function(e){if(void 0===e){for(var t=0,n=0;n<this.contentItems.length;++n)this._isDocked(n)&&t++;return t}return e<this.contentItems.length?this.contentItems[e]._docker&&this.contentItems[e]._docker.docked:void 0}},{key:"_validateDocking",value:function(e){for(var t=1<(e=e||this).contentItems.length-e._isDocked(),n=0;n<e.contentItems.length;++n)e.contentItems[n]instanceof a.a&&(e.contentItems[n].header._setDockable(e._isDocked(n)||t),e.contentItems[n].header._$setClosable(t))}},{key:"_getMinimumDimensions",value:function(e){for(var t=0,i=0,o=0;o<e.length;++o)t=n(e[o].minWidth||0,t),i=n(e[o].minHeight||0,i);return{horizontal:t,vertical:i}}},{key:"_onSplitterDragStart",value:function(e){var t=this._getItemsForSplitter(e),n=this.layoutManager.config.dimensions[this._isColumn?"minItemHeight":"minItemWidth"],i=this._getMinimumDimensions(t.before.config.content),o=this._isColumn?i.vertical:i.horizontal,s=this._getMinimumDimensions(t.after.config.content),r=this._isColumn?s.vertical:s.horizontal;this._splitterPosition=0,this._splitterMinPosition=-1*(t.before.element[this._dimension]()-(o||n)),this._splitterMaxPosition=t.after.element[this._dimension]()-(r||n)}},{key:"_onSplitterDrag",value:function(e,t,n){var i=this._isColumn?n:t;i>this._splitterMinPosition&&i<this._splitterMaxPosition&&(this._splitterPosition=i,e.element.css(this._isColumn?"top":"left",i))}},{key:"_onSplitterDragStop",value:function(e){var t=this._getItemsForSplitter(e),n=t.before.element[this._dimension](),i=t.after.element[this._dimension](),o=(this._splitterPosition+n)/(n+i),s=t.before.config[this._dimension]+t.after.config[this._dimension];t.before.config[this._dimension]=o*s,t.after.config[this._dimension]=(1-o)*s,e.element.css({top:0,left:0}),Object(d.a)(Object(d.c)(this.callDownwards,this,["setSize"]))}}]),i}();i.a=m},function(e,t,n){"use strict";var i=n(1),o=n(0),s=function(e){function t(e,n){var i;return p(this,t),(i=h(this,u(t).call(this)))._timeout=null,i._eElement=$(e),i._oDocument=$(document),i._eBody=$(document.body),i._nButtonCode=n||0,i._nDelay=200,i._nDistance=10,i._nX=0,i._nY=0,i._nOriginalX=0,i._nOriginalY=0,i._bDragging=!1,i._fMove=Object(o.c)(i.onMouseMove,d(i)),i._fUp=Object(o.c)(i.onMouseUp,d(i)),i._fDown=Object(o.c)(i.onMouseDown,d(i)),i._eElement.on("mousedown touchstart",i._fDown),i}return f(t,i.b),c(t,[{key:"destroy",value:function(){this._eElement.unbind("mousedown touchstart",this._fDown),this._oDocument.unbind("mouseup touchend",this._fUp),this._eElement=null,this._oDocument=null,this._eBody=null}},{key:"onMouseDown",value:function(e){if(e.preventDefault(),0==e.button||"touchstart"===e.type){var t=this._getCoordinates(e);this._nOriginalX=t.x,this._nOriginalY=t.y,this._oDocument.on("mousemove touchmove",this._fMove),this._oDocument.one("mouseup touchend",this._fUp),this._timeout=setTimeout(Object(o.c)(this._startDrag,this),this._nDelay)}}},{key:"onMouseMove",value:function(e){var t=Math.abs;if(null!=this._timeout){e.preventDefault();var n=this._getCoordinates(e);this._nX=n.x-this._nOriginalX,this._nY=n.y-this._nOriginalY,!1===this._bDragging&&(t(this._nX)>this._nDistance||t(this._nY)>this._nDistance)&&(clearTimeout(this._timeout),this._startDrag()),this._bDragging&&this.emit("drag",this._nX,this._nY,e)}}},{key:"onMouseUp",value:function(e){null!=this._timeout&&(clearTimeout(this._timeout),this._eBody.removeClass("lm_dragging"),this._eElement.removeClass("lm_dragging"),this._oDocument.find("iframe").css("pointer-events",""),this._oDocument.unbind("mousemove touchmove",this._fMove),this._oDocument.unbind("mouseup touchend",this._fUp),!0===this._bDragging&&(this._bDragging=!1,this.emit("dragStop",e,this._nOriginalX+this._nX)))}},{key:"_startDrag",value:function(){this._bDragging=!0,this._eBody.addClass("lm_dragging"),this._eElement.addClass("lm_dragging"),this._oDocument.find("iframe").css("pointer-events","none"),this.emit("dragStart",this._nOriginalX,this._nOriginalY)}},{key:"_getCoordinates",value:function(e){return{x:(e=Object(o.e)(e)).pageX,y:e.pageY}}}]),t}();t.a=s},function(e,t,n){var i=n(9);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},function(e){e.exports=function(e){return"object"==g(e)?null!==e:"function"==typeof e}},function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){"use strict";var i=n(0);t.a=function(){function e(){if(p(this,e),this._keys=["settings","hasHeaders","constrainDragToContainer","selectionEnabled","dimensions","borderWidth","minItemHeight","minItemWidth","headerHeight","dragProxyWidth","dragProxyHeight","labels","close","maximise","minimise","popout","content","componentName","componentState","id","width","type","height","isClosable","title","popoutWholeStack","openPopouts","parentId","activeItemIndex","reorderEnabled","borderGrabWidth"],36<this._keys.length)throw new Error("Too many keys in config minifier map");this._values=[!0,!1,"row","column","stack","component","close","maximise","minimise","open in new window"]}return c(e,[{key:"minifyConfig",value:function(e){var t={};return this._nextLevel(e,t,"_min"),t}},{key:"unminifyConfig",value:function(e){var t={};return this._nextLevel(e,t,"_max"),t}},{key:"_nextLevel",value:function(e,t,n){var i,o;for(i in e)e instanceof Array&&(i=parseInt(i,10)),e.hasOwnProperty(i)&&(o=this[n](i,this._keys),"object"==g(e[i])?(t[o]=e[i]instanceof Array?[]:{},this._nextLevel(e[i],t[o],n)):t[o]=this[n](e[i],this._values))}},{key:"_min",value:function(e,t){if("string"==typeof e&&1===e.length)return"___"+e;var n=Object(i.g)(e,t);return-1===n?e:n.toString(36)}},{key:"_max",value:function(e,t){return"string"==typeof e&&1===e.length?t[parseInt(e,36)]:"string"==typeof e&&"___"===e.substr(0,3)?e[3]:e}}]),e}()},function(e,t,n){"use strict";var i=n(3),o=n(6),s=function(e){function t(e,n,i){var o;return p(this,t),(o=h(this,u(t).call(this,e,n,null))).isRoot=!0,o.type="root",o.element=$('<div class="lm_goldenlayout lm_item lm_root"></div>'),o.childElementContainer=o.element,o._containerElement=i,o._containerElement.append(o.element),o}return f(t,i.a),c(t,[{key:"addChild",value:function(e){if(0<this.contentItems.length)throw new Error("Root node can only have a single child");e=this.layoutManager._$normalizeContentItem(e,this),this.childElementContainer.append(e.element),i.a.prototype.addChild.call(this,e),this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")}},{key:"setSize",value:function(e,t){e=void 0===e?this._containerElement.width():e,t=void 0===t?this._containerElement.height():t,this.element.width(e),this.element.height(t),this.contentItems[0]&&(this.contentItems[0].element.width(e),this.contentItems[0].element.height(t))}},{key:"_$highlightDropZone",value:function(){this.layoutManager.tabDropPlaceholder.remove(),i.a.prototype._$highlightDropZone.apply(this,arguments)}},{key:"_$onDrop",value:function(e,t){var n;if(e.isComponent&&((n=this.layoutManager.createContentItem({type:"stack",header:e.config.header||{}},this))._$init(),n.addChild(e),e=n),this.contentItems.length){("row"===e.config.type||"column"===e.config.type)&&((n=this.layoutManager.createContentItem({type:"stack"},this)).addChild(e),e=n);var i="x"==t.side[0]?"row":"column",s="x"==t.side[0]?"width":"height",r="2"==t.side[1],a=this.contentItems[0];if(a instanceof o.a&&a.type==i){var l=a.contentItems[r?0:a.contentItems.length-1];a.addChild(e,r?0:void 0,!0),l.config[s]*=.5,e.config[s]=l.config[s],a.callDownwards("setSize")}else{var c=this.layoutManager.createContentItem({type:i},this);this.replaceChild(a,c),c.addChild(e,r?0:void 0,!0),c.addChild(a,r?void 0:0,!0),a.config[s]=50,e.config[s]=50,c.callDownwards("setSize")}}else this.addChild(e)}}]),t}();t.a=s},function(t,i,o){"use strict";var s=o(3),r=o(6),a=o(28),l=o(0),m=function(t){function i(e,t,n){var o;p(this,i),(o=h(this,u(i).call(this,e,t,n))).element=$('<div class="lm_item lm_stack"></div>'),o._activeContentItem=null;var s=e.config;return o._header={show:!0===s.settings.hasHeaders&&!1!==t.hasHeaders,popout:s.settings.showPopoutIcon&&s.labels.popout,maximise:s.settings.showMaximiseIcon&&s.labels.maximise,close:s.settings.showCloseIcon&&s.labels.close,minimise:s.labels.minimise},s.header&&Object(l.b)(o._header,s.header),t.header&&Object(l.b)(o._header,t.header),t.content&&t.content[0]&&t.content[0].header&&Object(l.b)(o._header,t.content[0].header),o._dropZones={},o._dropSegment=null,o._contentAreaDimensions=null,o._dropIndex=null,o.isStack=!0,o.childElementContainer=$('<div class="lm_items"></div>'),o.header=new a.a(e,d(o)),o.element.on("mouseleave mouseenter",Object(l.c)(function(e){this._docker&&this._docker.docked&&this.childElementContainer[this._docker.dimension]("mouseenter"==e.type?this._docker.realSize:0)},d(o))),o.element.append(o.header.element),o.element.append(o.childElementContainer),o._setupHeaderPosition(),o._$validateClosability(),o}return f(i,s.a),c(i,[{key:"dock",value:function(e){this._header.dock&&this.parent instanceof r.a&&this.parent.dock(this,e)}},{key:"setSize",value:function(){if("none"!==this.element.css("display")){var e=this._docker&&this._docker.docked,t={width:this.element.width(),height:this.element.height()};this._header.show&&(t[this._sided?"width":"height"]-=this.layoutManager.config.dimensions.headerHeight),e&&(t[this._docker.dimension]=this._docker.realSize),e&&"height"!=this._docker.dimension||this.childElementContainer.width(t.width),e&&"width"!=this._docker.dimension||this.childElementContainer.height(t.height);for(var n=0;n<this.contentItems.length;n++)this.contentItems[n].element.width(t.width),this.contentItems[n].element.height(t.height);this.emit("resize"),this.emitBubblingEvent("stateChanged")}}},{key:"_$init",value:function(){var e,t;if(!0!==this.isInitialised){for(s.a.prototype._$init.call(this),e=0;e<this.contentItems.length;e++)this.header.createTab(this.contentItems[e]),this.contentItems[e]._$hide();if(0<this.contentItems.length){if(!(t=this.contentItems[this.config.activeItemIndex||0]))throw new Error("Configured activeItemIndex out of bounds");this.setActiveContentItem(t)}}}},{key:"setActiveContentItem",value:function(e){if(-1===Object(l.g)(e,this.contentItems))throw new Error("contentItem is not a child of this stack");null!==this._activeContentItem&&this._activeContentItem._$hide(),this._activeContentItem=e,this.header.setActiveContentItem(e),e._$show(),this.emit("activeContentItemChanged",e),this.layoutManager.emit("activeContentItemChanged",e),this.emitBubblingEvent("stateChanged")}},{key:"getActiveContentItem",value:function(){return this.header.activeContentItem}},{key:"addChild",value:function(e,t){t>this.contentItems.length&&(t-=1),e=this.layoutManager._$normalizeContentItem(e,this),s.a.prototype.addChild.call(this,e,t),this.childElementContainer.append(e.element),this.header.createTab(e,t),this.setActiveContentItem(e),this.callDownwards("setSize"),this._$validateClosability(),this.parent instanceof r.a&&this.parent._validateDocking(),this.emitBubblingEvent("stateChanged")}},{key:"removeChild",value:function(e,t){var i=Object(l.g)(e,this.contentItems);s.a.prototype.removeChild.call(this,e,t),this.header.removeTab(e),this.header.activeContentItem===e&&(0<this.contentItems.length?this.setActiveContentItem(this.contentItems[n(i-1,0)]):this._activeContentItem=null),this._$validateClosability(),this.parent instanceof r.a&&this.parent._validateDocking(),this.emitBubblingEvent("stateChanged")}},{key:"undisplayChild",value:function(e){if(1<this.contentItems.length){var t=Object(l.g)(e,this.contentItems);e._$hide&&e._$hide(),this.setActiveContentItem(this.contentItems[0===t?t+1:t-1])}else this.header.hideTab(e),e._$hide&&e._$hide(),s.a.prototype.undisplayChild.call(this,e),this.parent instanceof r.a&&this.parent._validateDocking();this.emitBubblingEvent("stateChanged")}},{key:"_$validateClosability",value:function(){var e,t,n;for(e=this.header._isClosable(),n=0,t=this.contentItems.length;n<t&&e;n++)e=this.contentItems[n].config.isClosable;this.header._$setClosable(e)}},{key:"_$destroy",value:function(){s.a.prototype._$destroy.call(this),this.header._$destroy(),this.element.off("mouseenter mouseleave")}},{key:"_$onDrop",value:function(e){if("header"===this._dropSegment)return this._resetHeaderDropZone(),void this.addChild(e,this._dropIndex);if("body"!==this._dropSegment){var t,n,i,o="top"===this._dropSegment||"bottom"===this._dropSegment,s="left"===this._dropSegment||"right"===this._dropSegment,r="top"===this._dropSegment||"left"===this._dropSegment,a=o&&this.parent.isColumn||s&&this.parent.isRow,c=o?"column":"row",h=o?"height":"width";e.isComponent&&((n=this.layoutManager.createContentItem({type:"stack",header:e.config.header||{}},this))._$init(),n.addChild(e),e=n),("row"===e.config.type||"column"===e.config.type)&&((n=this.layoutManager.createContentItem({type:"stack"},this)).addChild(e),e=n),a?(t=Object(l.g)(this,this.parent.contentItems),this.parent.addChild(e,r?t:t+1,!0),this.config[h]*=.5,e.config[h]=this.config[h],this.parent.callDownwards("setSize")):(c=o?"column":"row",i=this.layoutManager.createContentItem({type:c},this),this.parent.replaceChild(this,i),i.addChild(e,r?0:void 0,!0),i.addChild(this,r?void 0:0,!0),this.config[h]=50,e.config[h]=50,i.callDownwards("setSize")),this.parent._validateDocking()}else this.addChild(e)}},{key:"_$highlightDropZone",value:function(e,t){var n,i;for(n in this._contentAreaDimensions)if((i=this._contentAreaDimensions[n].hoverArea).x1<e&&i.x2>e&&i.y1<t&&i.y2>t)return void("header"===n?(this._dropSegment="header",this._highlightHeaderDropZone(this._sided?t:e)):(this._resetHeaderDropZone(),this._highlightBodyDropZone(n)))}},{key:"_$getArea",value:function(){if("none"===this.element.css("display"))return null;var e=s.a.prototype._$getArea,t=e.call(this,this.header.element),n=e.call(this,this.childElementContainer),i=n.x2-n.x1,o=n.y2-n.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2},highlightArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2}}},this._activeContentItem&&!1===this._activeContentItem.isComponent?t:0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2}},e.call(this,this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:n.x1,y1:n.y1,x2:n.x1+.25*i,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x1+.5*i,y2:n.y2}},this._contentAreaDimensions.top={hoverArea:{x1:n.x1+.25*i,y1:n.y1,x2:n.x1+.75*i,y2:n.y1+.5*o},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y1+.5*o}},this._contentAreaDimensions.right={hoverArea:{x1:n.x1+.75*i,y1:n.y1,x2:n.x2,y2:n.y2},highlightArea:{x1:n.x1+.5*i,y1:n.y1,x2:n.x2,y2:n.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:n.x1+.25*i,y1:n.y1+.5*o,x2:n.x1+.75*i,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1+.5*o,x2:n.x2,y2:n.y2}},e.call(this,this.element))}},{key:"_highlightHeaderDropZone",value:function(t){var n,i,o,s,r,a,l,c,h=this.header.tabs.length,u=!1;if(0===h)return l=this.header.element.offset(),void this.layoutManager.dropTargetIndicator.highlightArea({x1:l.left,x2:l.left+100,y1:l.top+this.header.element.height()-20,y2:l.top+this.header.element.height()});for(n=0;n<h;n++)if(r=(i=this.header.tabs[n].element).offset(),this._sided?(s=r.top,o=r.left,c=i.height()):(s=r.left,o=r.top,c=i.width()),t>s&&t<s+c){u=!0;break}if(!(0==u&&t<s)){if(t<s+c/2?(this._dropIndex=n,i.before(this.layoutManager.tabDropPlaceholder)):(this._dropIndex=e(n+1,h),i.after(this.layoutManager.tabDropPlaceholder)),this._sided){var d=this.layoutManager.tabDropPlaceholder.offset().top;return void this.layoutManager.dropTargetIndicator.highlightArea({x1:o,x2:o+i.innerHeight(),y1:d,y2:d+this.layoutManager.tabDropPlaceholder.width()})}a=this.layoutManager.tabDropPlaceholder.offset().left,this.layoutManager.dropTargetIndicator.highlightArea({x1:a,x2:a+this.layoutManager.tabDropPlaceholder.width(),y1:o,y2:o+i.innerHeight()})}}},{key:"_resetHeaderDropZone",value:function(){this.layoutManager.tabDropPlaceholder.remove()}},{key:"toggleMaximise",value:function(e){this.isMaximised||this.dock(!1),s.a.prototype.toggleMaximise.call(this,e)}},{key:"_setupHeaderPosition",value:function(){var e=0<=["right","left","bottom"].indexOf(this._header.show)&&this._header.show;if(this.header.element.toggle(!!this._header.show),this._side=e,this._sided=0<=["right","left"].indexOf(this._side),this.element.removeClass("lm_left lm_right lm_bottom"),this._side&&this.element.addClass("lm_"+this._side),this.element.find(".lm_header").length&&this.childElementContainer){var t=0<=["right","bottom"].indexOf(this._side)?"before":"after";this.header.element[t](this.childElementContainer),this.callDownwards("setSize")}}},{key:"_highlightBodyDropZone",value:function(e){var t=this._contentAreaDimensions[e].highlightArea;this.layoutManager.dropTargetIndicator.highlightArea(t),this._dropSegment=e}}]),i}();i.a=m},function(e){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var i=n(44),o=n(20);e.exports=Object.keys||function(e){return i(e,o)}},function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},function(e,t,n){var i=n(45),o=n(14);e.exports=function(e){return i(o(e))}},function(e){var n=Math.ceil;e.exports=function(e){return isNaN(e=+e)?0:(0<e?t:n)(e)}},function(e,t,n){var i=n(50)("keys"),o=n(52);e.exports=function(e){return i[e]||(i[e]=o(e))}},function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){var i=n(4),o=n(2),s=n(54),r=n(56),a=n(16),l="prototype",c=function e(t,n,c){var h,u,d,f=t&e.F,m=t&e.G,p=t&e.S,g=t&e.P,y=t&e.B,v=t&e.W,_=m?o:o[n]||(o[n]={}),b=_[l],w=m?i:p?i[n]:(i[n]||{})[l];for(h in m&&(c=n),c)(u=!f&&w&&void 0!==w[h])&&a(_,h)||(d=u?w[h]:c[h],_[h]=m&&"function"!=typeof w[h]?c[h]:y&&u?s(d,i):v&&w[h]==d?function(e){var t=function(t,n,i){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,i)}return e.apply(this,arguments)};return t[l]=e[l],t}(d):g&&"function"==typeof d?s(Function.call,d):d,g&&((_.virtual||(_.virtual={}))[h]=d,t&e.R&&b&&!b[h]&&r(b,h,d)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,t,n){var i=n(8),o=n(57),s=n(58),r=Object.defineProperty;t.f=n(5)?Object.defineProperty:function(e,t,n){if(i(e),t=s(t,!0),i(n),o)try{return r(e,t,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var i=n(9),o=n(4).document,s=i(o)&&i(o.createElement);e.exports=function(e){return s?o.createElement(e):{}}},function(e,t){"use strict";t.a=function(){function e(t,n){p(this,e),this._reactComponent=null,this._originalComponentWillUpdate=null,this._container=t,this._initialState=n,this._reactClass=this._getReactClass(),this._container.on("open",this._render,this),this._container.on("destroy",this._destroy,this)}return c(e,[{key:"_render",value:function(){this._reactComponent=ReactDOM.render(this._getReactComponent(),this._container.getElement()[0]),this._originalComponentWillUpdate=this._reactComponent.componentWillUpdate||function(){},this._reactComponent.componentWillUpdate=this._onUpdate.bind(this),this._container.getState()&&this._reactComponent.setState(this._container.getState())}},{key:"_destroy",value:function(){ReactDOM.unmountComponentAtNode(this._container.getElement()[0]),this._container.off("open",this._render,this),this._container.off("destroy",this._destroy,this)}},{key:"_onUpdate",value:function(e,t){this._container.setState(t),this._originalComponentWillUpdate.call(this._reactComponent,e,t)}},{key:"_getReactClass",value:function(){var e,t=this._container._config.component;if(!t)throw new Error("No react component name. type: react-component needs a field `component`");if(!(e=this._container.layoutManager.getComponent(t)))throw new Error('React component "'+t+'" not found. Please register all components with GoldenLayout using `registerComponent(name, component)`');return e}},{key:"_getReactComponent",value:function(){var e={glEventHub:this._container.layoutManager.eventHub,glContainer:this._container},t=$.extend(e,this._container._config.props);return React.createElement(this._reactClass,t)}}]),e}()},function(e,t,n){"use strict";var i=n(1),o=n(0),s=function(e){function t(e){var n;return p(this,t),(n=h(this,u(t).call(this)))._layoutManager=e,n._dontPropagateToParent=null,n._childEventSource=null,n.on(i.a,Object(o.c)(n._onEventFromThis,d(n))),n._boundOnEventFromChild=Object(o.c)(n._onEventFromChild,d(n)),$(window).on("gl_child_event",n._boundOnEventFromChild),n}return f(t,i.b),c(t,[{key:"_onEventFromThis",value:function(){var e=Array.prototype.slice.call(arguments);this._layoutManager.isSubWindow&&e[0]!==this._dontPropagateToParent&&this._propagateToParent(e),this._propagateToChildren(e),this._dontPropagateToParent=null,this._childEventSource=null}},{key:"_$onEventFromParent",value:function(e){this._dontPropagateToParent=e[0],this.emit.apply(this,e)}},{key:"_onEventFromChild",value:function(e){this._childEventSource=e.originalEvent.__gl,this.emit.apply(this,e.originalEvent.__glArgs)}},{key:"_propagateToParent",value:function(e){var t,n="gl_child_event";document.createEvent?(t=window.opener.document.createEvent("HTMLEvents")).initEvent(n,!0,!0):(t=window.opener.document.createEventObject()).eventType=n,t.eventName=n,t.__glArgs=e,t.__gl=this._layoutManager,document.createEvent?window.opener.dispatchEvent(t):window.opener.fireEvent("on"+t.eventType,t)}},{key:"_propagateToChildren",value:function(e){var t,n;for(n=0;n<this._layoutManager.openPopouts.length;n++)(t=this._layoutManager.openPopouts[n].getGlInstance())&&t!==this._childEventSource&&t.eventHub._$onEventFromParent(e)}},{key:"destroy",value:function(){$(window).off("gl_child_event",this._boundOnEventFromChild)}}]),t}();t.a=s},function(e,t){"use strict";t.a=function(){function e(t,n){p(this,e),this.name=t,this.origin=n,this.isPropagationStopped=!1}return c(e,[{key:"stopPropagation",value:function(){this.isPropagationStopped=!0}}]),e}()},function(e,t){"use strict";var n=function(e){function t(e,n){var i;return p(this,t),(i=h(this,u(t).call(this))).name="Configuration Error",i.message=e,i.node=n,i}return f(t,r(Error)),t}();t.a=n},function(e,t,n){"use strict";var i=n(1),o=n(29),s=n(31),r=n(0),a=function(e){function t(e,n){var i;return p(this,t),(i=h(this,u(t).call(this))).layoutManager=e,i.element=$('<div class="lm_header"><ul class="lm_tabs"></ul><ul class="lm_controls"></ul><ul class="lm_tabdropdown_list"></ul></div>'),!0===i.layoutManager.config.settings.selectionEnabled&&(i.element.addClass("lm_selectable"),i.element.on("click touchstart",Object(r.c)(i._onHeaderClick,d(i)))),i.tabsContainer=i.element.find(".lm_tabs"),i.tabDropdownContainer=i.element.find(".lm_tabdropdown_list"),i.tabDropdownContainer.hide(),i.controlsContainer=i.element.find(".lm_controls"),i.parent=n,i.parent.on("resize",i._updateTabSizes,d(i)),i.tabs=[],i.tabsMarkedForRemoval=[],i.activeContentItem=null,i.closeButton=null,i.dockButton=null,i.tabDropdownButton=null,i.hideAdditionalTabsDropdown=Object(r.c)(i._hideAdditionalTabsDropdown,d(i)),$(document).mouseup(i.hideAdditionalTabsDropdown),i._lastVisibleTabIndex=-1,i._tabControlOffset=i.layoutManager.config.settings.tabControlOffset,i._createControls(),i}return f(t,i.b),c(t,[{key:"createTab",value:function(e,t){var n,i;for(i=0;i<this.tabs.length;i++)if(this.tabs[i].contentItem===e)return;return n=new o.a(this,e),0===this.tabs.length?(this.tabs.push(n),void this.tabsContainer.append(n.element)):(void 0===t&&(t=this.tabs.length),0<t?this.tabs[t-1].element.after(n.element):this.tabs[0].element.before(n.element),this.tabs.splice(t,0,n),void this._updateTabSizes())}},{key:"removeTab",value:function(e){for(var t=0;t<this.tabs.length;t++)if(this.tabs[t].contentItem===e)return this.tabs[t]._$destroy(),void this.tabs.splice(t,1);for(t=0;t<this.tabsMarkedForRemoval.length;t++)if(this.tabsMarkedForRemoval[t].contentItem===e)return this.tabsMarkedForRemoval[t]._$destroy(),void this.tabsMarkedForRemoval.splice(t,1);throw new Error("contentItem is not controlled by this header")}},{key:"hideTab",value:function(e){for(var t=0;t<this.tabs.length;t++)if(this.tabs[t].contentItem===e)return this.tabs[t].element.hide(),this.tabsMarkedForRemoval.push(this.tabs[t]),void this.tabs.splice(t,1);throw new Error("contentItem is not controlled by this header")}},{key:"setActiveContentItem",value:function(e){var t,n,i,o;for(t=0;t<this.tabs.length;t++)i=this.tabs[t].contentItem===e,this.tabs[t].setActive(i),!0===i&&(this.activeContentItem=e,this.parent.config.activeItemIndex=t);if(this.layoutManager.config.settings.reorderOnTabMenuClick&&-1!==this._lastVisibleTabIndex&&this.parent.config.activeItemIndex>this._lastVisibleTabIndex){for(o=this.tabs[this.parent.config.activeItemIndex],n=this.parent.config.activeItemIndex;0<n;n--)this.tabs[n]=this.tabs[n-1];this.tabs[0]=o,this.parent.config.activeItemIndex=0}this._updateTabSizes(),this.parent.emitBubblingEvent("stateChanged")}},{key:"position",value:function(e){var t=this.parent._header.show;if(this.parent._docker&&this.parent._docker.docked)throw new Error("Can't change header position in docked stack");return t&&!this.parent._side&&(t="top"),void 0!==e&&this.parent._header.show!=e&&(this.parent._header.show=e,this.parent._setupHeaderPosition()),t}},{key:"_$setClosable",value:function(e){return this._canDestroy=e||1<this.tabs.length,this.closeButton&&this._isClosable()&&(this.closeButton.element[e?"show":"hide"](),!0)}},{key:"_setDockable",value:function(e){return this.dockButton&&this.parent._header&&this.parent._header.dock&&(this.dockButton.element.toggle(!!e),!0)}},{key:"_$destroy",value:function(){this.emit("destroy",this);for(var e=0;e<this.tabs.length;e++)this.tabs[e]._$destroy();$(document).off("mouseup",this.hideAdditionalTabsDropdown),this.element.remove()}},{key:"_getHeaderSetting",value:function(e){if(e in this.parent._header)return this.parent._header[e]}},{key:"_createControls",value:function(){var e,t,n,i,o,a,l,c,h;if(h=Object(r.c)(this._showAdditionalTabsDropdown,this),c=this.layoutManager.config.labels.tabDropdown,this.tabDropdownButton=new s.a(this,c,"lm_tabdropdown",h),this.tabDropdownButton.element.hide(),this.parent._header&&this.parent._header.dock){var u=Object(r.c)(this.parent.dock,this.parent);n=this._getHeaderSetting("dock"),this.dockButton=new s.a(this,n,"lm_dock",u)}this._getHeaderSetting("popout")&&(t=Object(r.c)(this._onPopoutClick,this),n=this._getHeaderSetting("popout"),new s.a(this,n,"lm_popout",t)),this._getHeaderSetting("maximise")&&(a=Object(r.c)(this.parent.toggleMaximise,this.parent),i=this._getHeaderSetting("maximise"),o=this._getHeaderSetting("minimise"),l=new s.a(this,i,"lm_maximise",a),this.parent.on("maximised",function(){l.element.attr("title",o)}),this.parent.on("minimised",function(){l.element.attr("title",i)})),this._isClosable()&&(e=Object(r.c)(this.parent.remove,this.parent),n=this._getHeaderSetting("close"),this.closeButton=new s.a(this,n,"lm_close",e))}},{key:"_showAdditionalTabsDropdown",value:function(){this.tabDropdownContainer.show()}},{key:"_hideAdditionalTabsDropdown",value:function(){this.tabDropdownContainer.hide()}},{key:"_isClosable",value:function(){return this.parent.config.isClosable&&this.layoutManager.config.settings.showCloseIcon}},{key:"_onPopoutClick",value:function(){!0===this.layoutManager.config.settings.popoutWholeStack?this.parent.popout():this.activeContentItem.popout()}},{key:"_onHeaderClick",value:function(e){e.target===this.element[0]&&this.parent.select()}},{key:"_updateTabSizes",value:function(e){if(0!==this.tabs.length){this.tabDropdownButton.element.toggle(!0===e);var t=function(e){return e?"width":"height"};this.element.css(t(!this.parent._sided),""),this.element[t(this.parent._sided)](this.layoutManager.config.dimensions.headerHeight);var n,i,o,s,r=this.element.outerWidth()-this.controlsContainer.outerWidth()-this._tabControlOffset,a=0,l=0,c=0,h=this.layoutManager.config.settings.tabOverlapAllowance,u=!1,d=this.activeContentItem?this.tabs.indexOf(this.activeContentItem.tab):0,f=this.tabs[d];for(this.parent._sided&&(r=this.element.outerHeight()-this.controlsContainer.outerHeight()-this._tabControlOffset),this._lastVisibleTabIndex=-1,i=0;i<this.tabs.length;i++)if(n=this.tabs[i].element,this.tabsContainer.append(n),a+=n.outerWidth()+parseInt(n.css("margin-right"),10),(l=d<=i?a:a+f.element.outerWidth()+parseInt(f.element.css("margin-right"),10))>r){if(u)i===d&&(n.css({"z-index":"auto","margin-left":""}),this.tabsContainer.append(n));else if((c=0<d&&d<=i?(l-r)/(i-1):(l-r)/i)<h){for(o=0;o<=i;o++)s=o!==d&&0!==o?"-"+c+"px":"",this.tabs[o].element.css({"z-index":i-o,"margin-left":s});this._lastVisibleTabIndex=i,this.tabsContainer.append(n)}else u=!0;if(u&&i!==d){if(!e)return void this._updateTabSizes(!0);n.css({"z-index":"auto","margin-left":""}),this.tabDropdownContainer.append(n)}}else this._lastVisibleTabIndex=i,n.css({"z-index":"auto","margin-left":""}),this.tabsContainer.append(n)}}}]),t}();t.a=a},function(e,t,n){"use strict";var i=n(7),o=n(30),s=n(0);t.a=function(){function e(t,n){p(this,e),this.header=t,this.contentItem=n,this.element=$('<li class="lm_tab"><i class="lm_left"></i><span class="lm_title"></span><div class="lm_close_tab"></div><i class="lm_right"></i></li>'),this.titleElement=this.element.find(".lm_title"),this.closeElement=this.element.find(".lm_close_tab"),this.closeElement[n.config.isClosable?"show":"hide"](),this.isActive=!1,this.setTitle(n.config.title),this.contentItem.on("titleChanged",this.setTitle,this),this._layoutManager=this.contentItem.layoutManager,!0===this._layoutManager.config.settings.reorderEnabled&&!0===n.config.reorderEnabled&&(this._dragListener=new i.a(this.element),this._dragListener.on("dragStart",this._onDragStart,this),this.contentItem.on("destroy",this._dragListener.destroy,this._dragListener)),this._onTabClickFn=Object(s.c)(this._onTabClick,this),this._onCloseClickFn=Object(s.c)(this._onCloseClick,this),this.element.on("mousedown touchstart",this._onTabClickFn),this.contentItem.config.isClosable?(this.closeElement.on("click touchstart",this._onCloseClickFn),this.closeElement.on("mousedown",this._onCloseMousedown)):this.closeElement.remove(),this.contentItem.tab=this,this.contentItem.emit("tab",this),this.contentItem.layoutManager.emit("tabCreated",this),this.contentItem.isComponent&&(this.contentItem.container.tab=this,this.contentItem.container.emit("tab",this))}return c(e,[{key:"setTitle",value:function(e){this.element.attr("title",Object(s.k)(e)),this.titleElement.html(e)}},{key:"setActive",value:function(e){e===this.isActive||(this.isActive=e,e?this.element.addClass("lm_active"):this.element.removeClass("lm_active"))}},{key:"_$destroy",value:function(){this.element.off("mousedown touchstart",this._onTabClickFn),this.closeElement.off("click touchstart",this._onCloseClickFn),this._dragListener&&(this.contentItem.off("destroy",this._dragListener.destroy,this._dragListener),this._dragListener.off("dragStart",this._onDragStart),this._dragListener=null),this.element.remove()}},{key:"_onDragStart",value:function(e,t){return this.header._canDestroy?(!0===this.contentItem.parent.isMaximised&&this.contentItem.parent.toggleMaximise(),void new o.a(e,t,this._dragListener,this._layoutManager,this.contentItem,this.header.parent)):null}},{key:"_onTabClick",value:function(e){if(0===e.button||"touchstart"===e.type){var t=this.header.parent.getActiveContentItem();this.contentItem!==t&&this.header.parent.setActiveContentItem(this.contentItem)}else 1===e.button&&this.contentItem.config.isClosable&&this._onCloseClick(e)}},{key:"_onCloseClick",value:function(e){e.stopPropagation(),this.header._canDestroy&&this.header.parent.removeChild(this.contentItem)}},{key:"_onCloseMousedown",value:function(e){e.stopPropagation()}}]),e}()},function(e,t,n){"use strict";var i=n(1),o=n(0),s=function(e){function t(e,n,i,s,r,a){var l;p(this,t),(l=h(this,u(t).call(this)))._dragListener=i,l._layoutManager=s,l._contentItem=r,l._originalParent=a,l._area=null,l._lastValidArea=null,l._dragListener.on("drag",l._onDrag,d(l)),l._dragListener.on("dragStop",l._onDrop,d(l)),l.element=$('<div class="lm_dragProxy"><div class="lm_header"><ul class="lm_tabs"><li class="lm_tab lm_active"><i class="lm_left"></i><span class="lm_title"></span><i class="lm_right"></i></li></ul></div><div class="lm_content"></div></div>'),a&&a._side&&(l._sided=a._sided,l.element.addClass("lm_"+a._side),0<=["right","bottom"].indexOf(a._side)&&l.element.find(".lm_content").after(l.element.find(".lm_header"))),l.element.css({left:e,top:n}),l.element.find(".lm_tab").attr("title",Object(o.k)(l._contentItem.config.title)),l.element.find(".lm_title").html(l._contentItem.config.title),l.childElementContainer=l.element.find(".lm_content"),l.childElementContainer.append(r.element),l._undisplayTree(),l._layoutManager._$calculateItemAreas(),l._setDimensions(),$(document.body).append(l.element);var c=l._layoutManager.container.offset();return l._minX=c.left,l._minY=c.top,l._maxX=l._layoutManager.container.width()+l._minX,l._maxY=l._layoutManager.container.height()+l._minY,l._width=l.element.width(),l._height=l.element.height(),l._setDropPosition(e,n),l}return f(t,i.b),c(t,[{key:"_onDrag",value:function(e,t,n){var i=(n=Object(o.e)(n)).pageX,s=n.pageY;(i>this._minX&&i<this._maxX&&s>this._minY&&s<this._maxY||!0!==this._layoutManager.config.settings.constrainDragToContainer)&&this._setDropPosition(i,s)}},{key:"_setDropPosition",value:function(e,t){this.element.css({left:e,top:t}),this._area=this._layoutManager._$getArea(e,t),null!==this._area&&(this._lastValidArea=this._area,this._area.contentItem._$highlightDropZone(e,t,this._area))}},{key:"_onDrop",value:function(){this._updateTree(),this._layoutManager.dropTargetIndicator.hide(),null===this._area?null===this._lastValidArea?this._originalParent?this._originalParent.addChild(this._contentItem):this._contentItem._$destroy():this._lastValidArea.contentItem._$onDrop(this._contentItem,this._lastValidArea):this._area.contentItem._$onDrop(this._contentItem,this._area),this.element.remove(),this._layoutManager.emit("itemDropped",this._contentItem)}},{key:"_undisplayTree",value:function(){this._contentItem.parent&&this._contentItem.parent.undisplayChild(this._contentItem)}},{key:"_updateTree",value:function(){this._contentItem.parent&&this._contentItem.parent.removeChild(this._contentItem,!0),this._contentItem._$setParent(this)}},{key:"_setDimensions",value:function(){var e=this._layoutManager.config.dimensions,t=e.dragProxyWidth,n=e.dragProxyHeight;this.element.width(t),this.element.height(n),t-=this._sided?e.headerHeight:0,n-=this._sided?0:e.headerHeight,this.childElementContainer.width(t),this.childElementContainer.height(n),this._contentItem.element.width(t),this._contentItem.element.height(n),this._contentItem.callDownwards("_$show"),this._contentItem.callDownwards("setSize")}}]),t}();t.a=s},function(e,t){"use strict";t.a=function(){function e(t,n,i,o){p(this,e),this._header=t,this.element=$('<li class="'+i+'" title="'+n+'"></li>'),this._header.on("destroy",this._$destroy,this),this._action=o,this.element.on("click touchstart",this._action),this._header.controlsContainer.append(this.element)}return c(e,[{key:"_$destroy",value:function(){this.element.off(),this.element.remove()}}]),e}()},function(e,t,n){"use strict";var i=n(3),o=n(33),s=function(e){function t(e,n,i){var s;p(this,t),s=h(this,u(t).call(this,e,n,i));var r=e.getComponent(s.config.componentName),a=$.extend(!0,{},s.config.componentState||{});return a.componentName=s.config.componentName,s.componentName=s.config.componentName,""===s.config.title&&(s.config.title=s.config.componentName),s.isComponent=!0,s.container=new o.a(s.config,d(s),e),s.instance=new r(s.container,a),s.element=s.container._element,s}return f(t,i.a),c(t,[{key:"close",value:function(){this.parent.removeChild(this)}},{key:"setSize",value:function(){"none"!==this.element.css("display")&&this.container._$setSize(this.element.width(),this.element.height())}},{key:"_$init",value:function(){i.a.prototype._$init.call(this),this.container.emit("open")}},{key:"_$hide",value:function(){this.container.hide(),i.a.prototype._$hide.call(this)}},{key:"_$show",value:function(){this.container.show(),i.a.prototype._$show.call(this)}},{key:"_$shown",value:function(){this.container.shown(),i.a.prototype._$shown.call(this)}},{key:"_$destroy",value:function(){this.container.emit("destroy",this),i.a.prototype._$destroy.call(this)}},{key:"_$getArea",value:function(){return null}}]),t}();t.a=s},function(e,t,n){"use strict";var i=n(1),o=function(e){function t(e,n,i){var o;return p(this,t),(o=h(this,u(t).call(this))).width=null,o.height=null,o.title=e.componentName,o.parent=n,o.layoutManager=i,o.isHidden=!1,o._config=e,o._element=$('<div class="lm_item_container"><div class="lm_content"></div></div>'),o._contentElement=o._element.find(".lm_content"),o}return f(t,i.b),c(t,[{key:"getElement",value:function(){return this._contentElement}},{key:"hide",value:function(){this.emit("hide"),this.isHidden=!0,this._element.hide()}},{key:"show",value:function(){this.emit("show"),this.isHidden=!1,this._element.show(),(0!=this.height||0!=this.width)&&this.emit("shown")}},{key:"setSize",value:function(e,t){for(var n,i,o,s,r=this.parent,a=this;!r.isColumn&&!r.isRow;)if(a=r,(r=r.parent).isRoot)return!1;for(n=("height"===(i=r.isColumn?"height":"width")?t:e)/(this[i]*(1/(a.config[i]/100)))*100,o=(a.config[i]-n)/(r.contentItems.length-1),s=0;s<r.contentItems.length;s++)r.contentItems[s]===a?r.contentItems[s].config[i]=n:r.contentItems[s].config[i]+=o;return r.callDownwards("setSize"),!0}},{key:"close",value:function(){this._config.isClosable&&(this.emit("close"),this.parent.close())}},{key:"getState",value:function(){return this._config.componentState}},{key:"extendState",value:function(e){this.setState($.extend(!0,this.getState(),e))}},{key:"setState",value:function(e){this._config.componentState=e,this.parent.emitBubblingEvent("stateChanged")}},{key:"setTitle",value:function(e){this.parent.setTitle(e)}},{key:"_$setSize",value:function(e,t){(e!==this.width||t!==this.height)&&(this.width=e,this.height=t,$.zepto?this._contentElement.width(e):this._contentElement.outerWidth(e),$.zepto?this._contentElement.height(t):this._contentElement.outerHeight(t),this.emit("resize"))}}]),t}();t.a=o},function(e,n,i){"use strict";var o=i(68),s=i.n(o),r=i(1),a=i(11),l=i(0),d=function(e){function n(e,t,i,o,s){var r;return p(this,n),(r=h(this,u(n).call(this))).isInitialised=!1,r._config=e,r._dimensions=t,r._parentId=i,r._indexInParent=o,r._layoutManager=s,r._popoutWindow=null,r._id=null,r._createWindow(),r}return f(n,r.b),c(n,[{key:"toConfig",value:function(){if(!1===this.isInitialised)throw new Error("Can't create config, layout not yet initialised");return{dimensions:{width:this.getGlInstance().width,height:this.getGlInstance().height,left:this._popoutWindow.screenX||this._popoutWindow.screenLeft,top:this._popoutWindow.screenY||this._popoutWindow.screenTop},content:this.getGlInstance().toConfig().content,parentId:this._parentId,indexInParent:this._indexInParent}}},{key:"getGlInstance",value:function(){return this._popoutWindow.__glInstance}},{key:"getWindow",value:function(){return this._popoutWindow}},{key:"close",value:function(){if(this.getGlInstance())this.getGlInstance()._$closeWindow();else try{this.getWindow().close()}catch(e){}}},{key:"popIn",value:function(){var e,t;this._indexInParent;this._parentId&&(e=$.extend(!0,{},this.getGlInstance().toConfig()).content[0],!(t=this._layoutManager.root.getItemsById(this._parentId)[0])&&(t=0<this._layoutManager.root.contentItems.length?this._layoutManager.root.contentItems[0]:this._layoutManager.root)),t.addChild(e,this._indexInParent),this.close()}},{key:"_createWindow",value:function(){var e,n=this._createUrl(),i=t(1e6*Math.random()).toString(36),o=this._serializeWindowOptions({width:this._dimensions.width,height:this._dimensions.height,innerWidth:this._dimensions.width,innerHeight:this._dimensions.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=window.open(n,i,o),this._popoutWindow)$(this._popoutWindow).on("load",Object(l.c)(this._positionWindow,this)).on("unload beforeunload",Object(l.c)(this._onClose,this)),e=setInterval(Object(l.c)(function(){this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._onInitialised(),clearInterval(e))},this),10);else if(!0===this._layoutManager.config.settings.blockedPopoutsThrowError){var s=new Error("Popout blocked");throw s.type="popoutBlocked",s}}},{key:"_serializeWindowOptions",value:function(e){var t,n=[];for(t in e)n.push(t+"="+e[t]);return n.join(",")}},{key:"_createUrl",value:function(){var e,t={content:this._config},n="gl-window-config-"+Object(l.f)();t=(new a.a).minifyConfig(t);try{localStorage.setItem(n,s()(t))}catch(t){throw new Error("Error while writing to localStorage "+t.toString())}return 1===(e=document.location.href.split("?")).length?e[0]+"?gl-window="+n:document.location.href+"&gl-window="+n}},{key:"_positionWindow",value:function(){this._popoutWindow.moveTo(this._dimensions.left,this._dimensions.top),this._popoutWindow.focus()}},{key:"_onInitialised",value:function(){this.isInitialised=!0,this.getGlInstance().on("popIn",this.popIn,this),this.emit("initialised")}},{key:"_onClose",value:function(){setTimeout(Object(l.c)(this.emit,this,["closed"]),50)}}]),n}();n.a=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(36),o=(n.n(i),n(37)),s=(n.n(o),n(38)),r=(n.n(s),n(39));n.d(t,"default",function(){return r.a});var a=n(33);n.d(t,"ItemContainer",function(){return a.a});var l=n(34);n.d(t,"BrowserPopout",function(){return l.a});var c=n(28);n.d(t,"Header",function(){return c.a});var h=n(31);n.d(t,"HeaderButton",function(){return h.a});var u=n(29);n.d(t,"Tab",function(){return u.a});var d=n(32);n.d(t,"Component",function(){return d.a});var f=n(12);n.d(t,"Root",function(){return f.a});var m=n(6);n.d(t,"RowOrColumn",function(){return m.a});var p=n(13);n.d(t,"Stack",function(){return p.a});var g=n(26);n.d(t,"BubblingEvent",function(){return g.a});var y=n(11);n.d(t,"ConfigMinifier",function(){return y.a});var v=n(7);n.d(t,"DragListener",function(){return v.a});var _=n(1);n.d(t,"EventEmitter",function(){return _.b});var b=n(25);n.d(t,"EventHub",function(){return b.a});var w=n(24);n.d(t,"ReactComponentHandler",function(){return w.a}),{}.ES6&&(n(74),n(77))},function(){},function(){},function(){},function(e,i,o){"use strict";var s=o(1),r=o(24),a=o(11),l=o(25),m=o(12),y=o(6),v=o(13),_=o(32),b=o(3),w=o(34),x=o(70),k=o(71),I=o(72),C=o(27),S=o(73),E=o(0),j=function(e){function i(e,t){var n;if(p(this,i),!$){throw'Please either expose $ on GoldenLayout\'s scope (e.g. window) or add "jquery" to ',"your paths when using RequireJS/AMD",new Error('jQuery is missing as dependency for GoldenLayout. Please either expose $ on GoldenLayout\'s scope (e.g. window) or add "jquery" to your paths when using RequireJS/AMD')}return(n=h(this,u(i).call(this))).isInitialised=!1,n._isFullPage=!1,n._resizeTimeoutId=null,n._components={"lm-react-component":r.a},n._itemAreas=[],n._resizeFunction=Object(E.c)(n._onResize,d(n)),n._unloadFunction=Object(E.c)(n._onUnload,d(n)),n._maximisedItem=null,n._maximisePlaceholder=$('<div class="lm_maximise_place"></div>'),n._creationTimeoutPassed=!1,n._subWindowsCreated=!1,n._dragSources=[],n._updatingColumnsResponsive=!1,n._firstLoad=!0,n.width=null,n.height=null,n.root=null,n.openPopouts=[],n.selectedItem=null,n.isSubWindow=!1,n.eventHub=new l.a(d(n)),n.config=n._createConfig(e),n.container=t,n.dropTargetIndicator=null,n.transitionIndicator=null,n.tabDropPlaceholder=$('<div class="lm_drop_tab_placeholder"></div>'),!0===n.isSubWindow&&$("body").css("visibility","hidden"),n._typeToItem={column:Object(E.c)(y.a,d(n),[!0]),row:Object(E.c)(y.a,d(n),[!1]),stack:v.a,component:_.a},n}return f(i,s.b),c(i,[{key:"minifyConfig",value:function(e){return(new a.a).minifyConfig(e)}},{key:"unminifyConfig",value:function(e){return(new a.a).unminifyConfig(e)}},{key:"registerComponent",value:function(e,t){if("function"!=typeof t)throw new Error("Please register a constructor function");if(void 0!==this._components[e])throw new Error("Component "+e+" is already registered");this._components[e]=t}},{key:"toConfig",value:function(e){var t,n,i;if(!1===this.isInitialised)throw new Error("Can't create config, layout not yet initialised");if(e&&!(e instanceof b.a))throw new Error("Root must be a ContentItem");for((t={settings:Object(E.b)({},this.config.settings),dimensions:Object(E.b)({},this.config.dimensions),labels:Object(E.b)({},this.config.labels)}).content=[],(n=function(e,t){var i,o;for(i in t.config)"content"!==i&&(e[i]=t.config[i]);if(t.contentItems.length)for(e.content=[],o=0;o<t.contentItems.length;o++)e.content[o]={},n(e.content[o],t.contentItems[o])})(t,e?{contentItems:[e]}:this.root),this._$reconcilePopoutWindows(),t.openPopouts=[],i=0;i<this.openPopouts.length;i++)t.openPopouts.push(this.openPopouts[i].toConfig());return t.maximisedItemId=this._maximisedItem?"__glMaximised":null,t}},{key:"getComponent",value:function(e){if(void 0===this._components[e])throw new C.a('Unknown component "'+e+'"');return this._components[e]}},{key:"init",value:function(){return!1===this._subWindowsCreated&&(this._createSubWindows(),this._subWindowsCreated=!0),"loading"===document.readyState||null===document.body?void $(document).ready(Object(E.c)(this.init,this)):!0===this.isSubWindow&&!1===this._creationTimeoutPassed?(setTimeout(Object(E.c)(this.init,this),7),void(this._creationTimeoutPassed=!0)):(!0===this.isSubWindow&&this._adjustToWindowMode(),this._setContainer(),this.dropTargetIndicator=new k.a(this.container),this.transitionIndicator=new I.a,this.updateSize(),this._create(this.config),this._bindEvents(),this.isInitialised=!0,this._adjustColumnsResponsive(),void this.emit("initialised"))}},{key:"updateSize",value:function(e,t){2===arguments.length?(this.width=e,this.height=t):(this.width=this.container.width(),this.height=this.container.height()),!0===this.isInitialised&&(this.root.callDownwards("setSize",[this.width,this.height]),this._maximisedItem&&(this._maximisedItem.element.width(this.container.width()),this._maximisedItem.element.height(this.container.height()),this._maximisedItem.callDownwards("setSize")),this._adjustColumnsResponsive())}},{key:"destroy",value:function(){!1===this.isInitialised||(this._onUnload(),$(window).off("resize",this._resizeFunction),$(window).off("unload beforeunload",this._unloadFunction),this.root.callDownwards("_$destroy",[],!0),this.root.contentItems=[],this.tabDropPlaceholder.remove(),this.dropTargetIndicator.destroy(),this.transitionIndicator.destroy(),this.eventHub.destroy(),this._dragSources.forEach(function(e){e._dragListener.destroy(),e._element=null,e._itemConfig=null,e._dragListener=null}),this._dragSources=[])}},{key:"createContentItem",value:function(e,t){var n;if("string"!=typeof e.type)throw new C.a("Missing parameter 'type'",e);if("react-component"===e.type&&(e.type="component",e.componentName="lm-react-component"),!this._typeToItem[e.type])throw n="Unknown type '"+e.type+"'. Valid types are "+Object(E.j)(this._typeToItem).join(","),new C.a(n);return"component"!==e.type||t instanceof v.a||!t||!0===this.isSubWindow&&t instanceof m.a||(e={type:"stack",width:e.width,height:e.height,content:[e]}),new this._typeToItem[e.type](this,e,t)}},{key:"createPopout",value:function(e,t,n,i){var o,s,r,a,l,c,h=e,u=e instanceof b.a,d=this;if(n=n||null,u){for(h=this.toConfig(e).content,n=Object(E.f)(),a=e.parent,l=e;1===a.contentItems.length&&!a.isRoot;)a=a.parent,l=l.parent;a.addId(n),isNaN(i)&&(i=Object(E.g)(l,a.contentItems))}else h instanceof Array||(h=[h]);return!t&&u&&(o=window.screenX||window.screenLeft,s=window.screenY||window.screenTop,t={left:o+(r=e.element.offset()).left,top:s+r.top,width:e.element.width(),height:e.element.height()}),t||u||(t={left:window.screenX||window.screenLeft+20,top:window.screenY||window.screenTop+20,width:500,height:309}),u&&e.remove(),(c=new w.a(h,t,n,i,this)).on("initialised",function(){d.emit("windowOpened",c)}),c.on("closed",function(){d._$reconcilePopoutWindows()}),this.openPopouts.push(c),c}},{key:"createDragSource",value:function(e,t){this.config.settings.constrainDragToContainer=!1;var n=new x.a($(e),t,this);return this._dragSources.push(n),n}},{key:"selectItem",value:function(e,t){if(!0!==this.config.settings.selectionEnabled)throw new Error("Please set selectionEnabled to true to use this feature");e===this.selectedItem||(null!==this.selectedItem&&this.selectedItem.deselect(),e&&!0!==t&&e.select(),this.selectedItem=e,this.emit("selectionChanged",e))}},{key:"_$maximiseItem",value:function(e){null!==this._maximisedItem&&this._$minimiseItem(this._maximisedItem),this._maximisedItem=e,this._maximisedItem.addId("__glMaximised"),e.element.addClass("lm_maximised"),e.element.after(this._maximisePlaceholder),this.root.element.prepend(e.element),e.element.width(this.container.width()),e.element.height(this.container.height()),e.callDownwards("setSize"),this._maximisedItem.emit("maximised"),this.emit("stateChanged")}},{key:"_$minimiseItem",value:function(e){e.element.removeClass("lm_maximised"),e.removeId("__glMaximised"),this._maximisePlaceholder.after(e.element),this._maximisePlaceholder.remove(),e.parent.callDownwards("setSize"),this._maximisedItem=null,e.emit("minimised"),this.emit("stateChanged")}},{key:"_$closeWindow",value:function(){window.setTimeout(function(){window.close()},1)}},{key:"_$getArea",value:function(e,t){var n,i,o=1/0,s=null;for(n=0;n<this._itemAreas.length;n++)e>(i=this._itemAreas[n]).x1&&e<i.x2&&t>i.y1&&t<i.y2&&o>i.surface&&(o=i.surface,s=i);return s}},{key:"_$createRootItemAreas",value:function(){var e={y2:0,x2:0,y1:"y2",x1:"x2"};for(var t in e){var n=this.root._$getArea();n.side=t,n[t]=e[t]?n[e[t]]-50:50,n.surface=(n.x2-n.x1)*(n.y2-n.y1),this._itemAreas.push(n)}}},{key:"_$calculateItemAreas",value:function(){var e,t,n=this._getAllContentItems();if(this._itemAreas=[],1!==n.length){for(this._$createRootItemAreas(),e=0;e<n.length;e++)if(n[e].isStack){if(null===(t=n[e]._$getArea()))continue;if(t instanceof Array)this._itemAreas=this._itemAreas.concat(t);else{this._itemAreas.push(t);var i={};Object(E.b)(i,t),Object(E.b)(i,t.contentItem._contentAreaDimensions.header.highlightArea),i.surface=(i.x2-i.x1)*(i.y2-i.y1),this._itemAreas.push(i)}}}else this._itemAreas.push(this.root._$getArea())}},{key:"_$normalizeContentItem",value:function(e,t){if(!e)throw new Error("No content item defined");if(Object(E.h)(e)&&(e=e()),e instanceof b.a)return e;if($.isPlainObject(e)&&e.type){var n=this.createContentItem(e,t);return n.callDownwards("_$init"),n}throw new Error("Invalid contentItem")}},{key:"_$reconcilePopoutWindows",value:function(){var e,t=[];for(e=0;e<this.openPopouts.length;e++)!1===this.openPopouts[e].getWindow().closed?t.push(this.openPopouts[e]):this.emit("windowClosed",this.openPopouts[e]);this.openPopouts.length!==t.length&&(this.emit("stateChanged"),this.openPopouts=t)}},{key:"_getAllContentItems",value:function(){var e=[];return function t(n){if(e.push(n),n.contentItems instanceof Array)for(var i=0;i<n.contentItems.length;i++)t(n.contentItems[i])}(this.root),e}},{key:"_bindEvents",value:function(){this._isFullPage&&$(window).resize(this._resizeFunction),$(window).on("unload beforeunload",this._unloadFunction)}},{key:"_onResize",value:function(){clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=setTimeout(Object(E.c)(this.updateSize,this),100)}},{key:"_createConfig",value:function(e){var t=Object(E.d)("gl-window");t&&(this.isSubWindow=!0,e=localStorage.getItem(t),e=JSON.parse(e),e=(new a.a).unminifyConfig(e),localStorage.removeItem(t));return function e(t){for(var n in t)"props"!=n&&"object"==g(t[n])?e(t[n]):"type"==n&&"react-component"===t[n]&&(t.type="component",t.componentName="lm-react-component")}(e=$.extend(!0,{},S.a,e)),!1===e.settings.hasHeaders&&(e.dimensions.headerHeight=0),e}},{key:"_adjustToWindowMode",value:function(){var e=$('<div class="lm_popin" title="'+this.config.labels.popin+'"><div class="lm_icon"></div><div class="lm_bg"></div></div>');e.click(Object(E.c)(function(){this.emit("popIn")},this)),document.title=Object(E.k)(this.config.content[0].title),$("head").append($("body link, body style, template, .gl_keep")),this.container=$("body").html("").css("visibility","visible").append(e),document.body.offsetHeight,window.__glInstance=this}},{key:"_createSubWindows",value:function(){var e,t;for(e=0;e<this.config.openPopouts.length;e++)t=this.config.openPopouts[e],this.createPopout(t.content,t.dimensions,t.parentId,t.indexInParent)}},{key:"_setContainer",value:function(){var e=$(this.container||"body");if(0===e.length)throw new Error("GoldenLayout container not found");if(1<e.length)throw new Error("GoldenLayout more than one container element specified");e[0]===document.body&&(this._isFullPage=!0,$("html, body").css({height:"100%",margin:0,padding:0,overflow:"hidden"})),this.container=e}},{key:"_create",value:function(e){var t;if(!(e.content instanceof Array))throw t=void 0===e.content?"Missing setting 'content' on top level of configuration":"Configuration parameter 'content' must be an array",new C.a(t,e);if(1<e.content.length)throw t="Top level content can't contain more then one element.",new C.a(t,e);this.root=new m.a(this,{content:e.content},this.container),this.root.callDownwards("_$init"),"__glMaximised"===e.maximisedItemId&&this.root.getItemsById(e.maximisedItemId)[0].toggleMaximise()}},{key:"_onUnload",value:function(){if(!0===this.config.settings.closePopoutsOnUnload)for(var e=0;e<this.openPopouts.length;e++)this.openPopouts[e].close()}},{key:"_adjustColumnsResponsive",value:function(){if(this._useResponsiveLayout()&&!this._updatingColumnsResponsive&&this.config.dimensions&&this.config.dimensions.minItemWidth&&0!==this.root.contentItems.length&&this.root.contentItems[0].isRow){this._firstLoad=!1;var e=this.root.contentItems[0].contentItems.length;if(!(1>=e)){var i=this.config.dimensions.minItemWidth;if(!(e*i<=this.width)){this._updatingColumnsResponsive=!0;for(var o,s=n(t(this.width/i),1),r=this.root.contentItems[0],a=this._findAllStackContainers()[0],l=0;l<e-s;l++)o=r.contentItems[r.contentItems.length-1],this._addChildContentItemsToContainer(a,o);this._updatingColumnsResponsive=!1}}}else this._firstLoad=!1}},{key:"_useResponsiveLayout",value:function(){return this.config.settings&&("always"==this.config.settings.responsiveMode||"onload"==this.config.settings.responsiveMode&&this._firstLoad)}},{key:"_addChildContentItemsToContainer",value:function(e,t){"stack"===t.type?t.contentItems.forEach(function(n){e.addChild(n),t.removeChild(n,!0)}):t.contentItems.forEach(Object(E.c)(function(t){this._addChildContentItemsToContainer(e,t)},this))}},{key:"_findAllStackContainers",value:function(){var e=[];return this._findAllStackContainersRecursive(e,this.root),e}},{key:"_findAllStackContainersRecursive",value:function(e,t){t.contentItems.forEach(Object(E.c)(function(t){"stack"==t.type?e.push(t):!t.isComponent&&this._findAllStackContainersRecursive(e,t)},this))}}]),i}();i.a=j},function(e,t,n){e.exports={default:n(41),__esModule:!0}},function(e,t,n){n(42),e.exports=n(2).Object.keys},function(e,t,n){var i=n(43),o=n(15);n(53)("keys",function(){return function(e){return o(i(e))}})},function(e,t,n){var i=n(14);e.exports=function(e){return Object(i(e))}},function(e,t,n){var i=n(16),o=n(17),s=n(47)(!1),r=n(19)("IE_PROTO");e.exports=function(e,t){var n,a=o(e),l=0,c=[];for(n in a)n!=r&&i(a,n)&&c.push(n);for(;t.length>l;)i(a,n=t[l++])&&(~s(c,n)||c.push(n));return c}},function(e,t,n){var i=n(46);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},function(e,t,n){var i=n(17),o=n(48),s=n(49);e.exports=function(e){return function(t,n,r){var a,l=i(t),c=o(l.length),h=s(r,c);if(e&&n!=n){for(;c>h;)if((a=l[h++])!=a)return!0}else for(;c>h;h++)if((e||h in l)&&l[h]===n)return e||h||0;return!e&&-1}}},function(t,n,i){var o=i(18);t.exports=function(t){return 0<t?e(o(t),9007199254740991):0}},function(t,i,o){var s=o(18);t.exports=function(t,i){return 0>(t=s(t))?n(t+i,0):e(t,i)}},function(e,t,n){var i=n(2),o=n(4),s="__core-js_shared__",r=o[s]||(o[s]={});(e.exports=function(e,t){return r[e]||(r[e]=void 0===t?{}:t)})("versions",[]).push({version:i.version,mode:n(51)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e){e.exports=!0},function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++t+n).toString(36))}},function(e,t,n){var i=n(21),o=n(2),s=n(10);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],r={};r[e]=t(n),i(i.S+i.F*s(function(){n(1)}),"Object",r)}},function(e,t,n){var i=n(55);e.exports=function(e,t,n){return i(e),void 0===t?e:1===n?function(n){return e.call(t,n)}:2===n?function(n,i){return e.call(t,n,i)}:3===n?function(n,i,o){return e.call(t,n,i,o)}:function(){return e.apply(t,arguments)}}},function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){var i=n(22),o=n(59);e.exports=n(5)?function(e,t,n){return i.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){e.exports=!n(5)&&!n(10)(function(){return 7!=Object.defineProperty(n(23)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var i=n(9);e.exports=function(e,t){if(!i(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!i(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){e.exports={default:n(61),__esModule:!0}},function(e,t,n){n(62);var i=n(2).Object;e.exports=function(e,t){return i.create(e,t)}},function(e,t,n){var i=n(21);i(i.S,"Object",{create:n(63)})},function(e,t,n){var i=n(8),o=n(64),s=n(20),r=n(19)("IE_PROTO"),a=function(){},l="prototype",c=function(){var e,t=n(23)("iframe"),i=s.length;for(t.style.display="none",n(65).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),c=e.F;i--;)delete c[l][s[i]];return c()};e.exports=Object.create||function(e,t){var n;return null===e?n=c():(a[l]=i(e),n=new a,a[l]=null,n[r]=e),void 0===t?n:o(n,t)}},function(e,t,n){var i=n(22),o=n(8),s=n(15);e.exports=n(5)?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},function(e,t,n){var i=n(4).document;e.exports=i&&i.documentElement},function(e,t){"use strict";t.a={isClosable:!0,reorderEnabled:!0,title:""}},function(e,t,n){"use strict";var i=n(7);t.a=function(){function e(t,n,o){p(this,e),this._isVertical=t,this._size=n,this._grabSize=o<n?n:o,this.element=this._createElement(),this._dragListener=new i.a(this.element)}return c(e,[{key:"on",value:function(e,t,n){this._dragListener.on(e,t,n)}},{key:"_$destroy",value:function(){this.element.remove()}},{key:"_createElement",value:function(){var e=$('<div class="lm_drag_handle"></div>'),t=$('<div class="lm_splitter"></div>');t.append(e);var n=this._grabSize-this._size,i=n/2;return this._isVertical?(e.css("top",-i),e.css("height",this._size+n),t.addClass("lm_vertical"),t.height(this._size)):(e.css("left",-i),e.css("width",this._size+n),t.addClass("lm_horizontal"),t.width(this._size)),t}}]),e}()},function(e,t,n){e.exports={default:n(69),__esModule:!0}},function(e,t,n){var i=n(2),o=i.JSON||(i.JSON={stringify:JSON.stringify});e.exports=function(){return o.stringify.apply(o,arguments)}},function(e,t,n){"use strict";var i=n(7),o=n(30),s=n(0);t.a=function(){function e(t,n,i){p(this,e),this._element=t,this._itemConfig=n,this._layoutManager=i,this._dragListener=null,this._createDragListener()}return c(e,[{key:"_createDragListener",value:function(){null!==this._dragListener&&this._dragListener.destroy(),this._dragListener=new i.a(this._element),this._dragListener.on("dragStart",this._onDragStart,this),this._dragListener.on("dragStop",this._createDragListener,this)}},{key:"_onDragStart",value:function(e,t){var n=this._itemConfig;Object(s.h)(n)&&(n=n());var i=this._layoutManager._$normalizeContentItem($.extend(!0,{},n)),r=new o.a(e,t,this._dragListener,this._layoutManager,i,null);this._layoutManager.transitionIndicator.transitionElements(this._element,r.element)}}]),e}()},function(e,t){"use strict";t.a=function(){function e(){p(this,e),this.element=$('<div class="lm_dropTargetIndicator"><div class="lm_inner"></div></div>'),$(document.body).append(this.element)}return c(e,[{key:"destroy",value:function(){this.element.remove()}},{key:"highlight",value:function(e,t,n,i){this.highlightArea({x1:e,y1:t,x2:n,y2:i})}},{key:"highlightArea",value:function(e){this.element.css({left:e.x1,top:e.y1,width:e.x2-e.x1,height:e.y2-e.y1}).show()}},{key:"hide",value:function(){this.element.hide()}}]),e}()},function(e,t,n){"use strict";var i=n(0);t.a=function(){function e(){p(this,e),this._element=$('<div class="lm_transition_indicator"></div>'),$(document.body).append(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null}return c(e,[{key:"destroy",value:function(){this._element.remove()}},{key:"transitionElements",value:function(){}},{key:"_nextAnimationFrame",value:function(){var e,t=this._measure(this._toElement),n=(Object(i.i)()-this._animationStartTime)/this._totalAnimationDuration,o={};if(1<=n)this._element.hide();else{for(e in t.opacity=0,this._fromDimensions)o[e]=this._fromDimensions[e]+(t[e]-this._fromDimensions[e])*n;this._element.css(o),Object(i.a)(Object(i.c)(this._nextAnimationFrame,this))}}},{key:"_measure",value:function(e){var t=e.offset();return{left:t.left,top:t.top,width:e.outerWidth(),height:e.outerHeight()}}}]),e}()},function(e,t){"use strict";t.a={openPopouts:[],settings:{hasHeaders:!0,constrainDragToContainer:!0,reorderEnabled:!0,selectionEnabled:!1,popoutWholeStack:!1,blockedPopoutsThrowError:!0,closePopoutsOnUnload:!0,showPopoutIcon:!0,showMaximiseIcon:!0,showCloseIcon:!0,responsiveMode:"onload",tabOverlapAllowance:0,reorderOnTabMenuClick:!0,tabControlOffset:10},dimensions:{borderWidth:5,borderGrabWidth:15,minItemHeight:10,minItemWidth:10,headerHeight:20,dragProxyWidth:300,dragProxyHeight:200},labels:{close:"close",maximise:"maximise",minimise:"minimise",popout:"open in new window",popin:"pop in",tabDropdown:"additional tabs"}}},function(e,t,n){n(75)(n(76))},function(e){e.exports=function(e){function t(e){"undefined"!=typeof console&&(console.error||console.log)("[Script Loader]",e)}try{"undefined"!=typeof execScript&&"undefined"!=typeof attachEvent&&"undefined"==typeof addEventListener?execScript(e):"undefined"==typeof eval?t("EvalError: No eval function available"):eval.call(null,e)}catch(e){t(e)}}},function(e){e.exports="/* Zepto v1.2.0 - zepto event ajax form ie - zeptojs.com/license */\n(function(global, factory) {\n if (typeof define === 'function' && define.amd)\n define(function() { return factory(global) })\n else\n factory(global)\n}(this, function(window) {\n var Zepto = (function() {\n var undefined, key, $, classList, emptyArray = [], concat = emptyArray.concat, filter = emptyArray.filter, slice = emptyArray.slice,\n document = window.document,\n elementDisplay = {}, classCache = {},\n cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 },\n fragmentRE = /^\\s*<(\\w+|!)[^>]*>/,\n singleTagRE = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n rootNodeRE = /^(?:body|html)$/i,\n capitalRE = /([A-Z])/g,\n\n // special attributes that should be get/set via method calls\n methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],\n\n adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ],\n table = document.createElement('table'),\n tableRow = document.createElement('tr'),\n containers = {\n 'tr': document.createElement('tbody'),\n 'tbody': table, 'thead': table, 'tfoot': table,\n 'td': tableRow, 'th': tableRow,\n '*': document.createElement('div')\n },\n readyRE = /complete|loaded|interactive/,\n simpleSelectorRE = /^[\\w-]*$/,\n class2type = {},\n toString = class2type.toString,\n zepto = {},\n camelize, uniq,\n tempParent = document.createElement('div'),\n propMap = {\n 'tabindex': 'tabIndex',\n 'readonly': 'readOnly',\n 'for': 'htmlFor',\n 'class': 'className',\n 'maxlength': 'maxLength',\n 'cellspacing': 'cellSpacing',\n 'cellpadding': 'cellPadding',\n 'rowspan': 'rowSpan',\n 'colspan': 'colSpan',\n 'usemap': 'useMap',\n 'frameborder': 'frameBorder',\n 'contenteditable': 'contentEditable'\n },\n isArray = Array.isArray ||\n function(object){ return object instanceof Array }\n\n zepto.matches = function(element, selector) {\n if (!selector || !element || element.nodeType !== 1) return false\n var matchesSelector = element.matches || element.webkitMatchesSelector ||\n element.mozMatchesSelector || element.oMatchesSelector ||\n element.matchesSelector\n if (matchesSelector) return matchesSelector.call(element, selector)\n // fall back to performing a selector:\n var match, parent = element.parentNode, temp = !parent\n if (temp) (parent = tempParent).appendChild(element)\n match = ~zepto.qsa(parent, selector).indexOf(element)\n temp && tempParent.removeChild(element)\n return match\n }\n\n function type(obj) {\n return obj == null ? String(obj) :\n class2type[toString.call(obj)] || \"object\"\n }\n\n function isFunction(value) { return type(value) == \"function\" }\n function isWindow(obj) { return obj != null && obj == obj.window }\n function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }\n function isObject(obj) { return type(obj) == \"object\" }\n function isPlainObject(obj) {\n return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype\n }\n\n function likeArray(obj) {\n var length = !!obj && 'length' in obj && obj.length,\n type = $.type(obj)\n\n return 'function' != type && !isWindow(obj) && (\n 'array' == type || length === 0 ||\n (typeof length == 'number' && length > 0 && (length - 1) in obj)\n )\n }\n\n function compact(array) { return filter.call(array, function(item){ return item != null }) }\n function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array }\n camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) }\n function dasherize(str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase()\n }\n uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) }\n\n function classRE(name) {\n return name in classCache ?\n classCache[name] : (classCache[name] = new RegExp('(^|\\\\s)' + name + '(\\\\s|$)'))\n }\n\n function maybeAddPx(name, value) {\n return (typeof value == \"number\" && !cssNumber[dasherize(name)]) ? value + \"px\" : value\n }\n\n function defaultDisplay(nodeName) {\n var element, display\n if (!elementDisplay[nodeName]) {\n element = document.createElement(nodeName)\n document.body.appendChild(element)\n display = getComputedStyle(element, '').getPropertyValue(\"display\")\n element.parentNode.removeChild(element)\n display == \"none\" && (display = \"block\")\n elementDisplay[nodeName] = display\n }\n return elementDisplay[nodeName]\n }\n\n function children(element) {\n return 'children' in element ?\n slice.call(element.children) :\n $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node })\n }\n\n function Z(dom, selector) {\n var i, len = dom ? dom.length : 0\n for (i = 0; i < len; i++) this[i] = dom[i]\n this.length = len\n this.selector = selector || ''\n }\n\n // `$.zepto.fragment` takes a html string and an optional tag name\n // to generate DOM nodes from the given html string.\n // The generated DOM nodes are returned as an array.\n // This function can be overridden in plugins for example to make\n // it compatible with browsers that don't support the DOM fully.\n zepto.fragment = function(html, name, properties) {\n var dom, nodes, container\n\n // A special case optimization for a single tag\n if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))\n\n if (!dom) {\n if (html.replace) html = html.replace(tagExpanderRE, \"<$1></$2>\")\n if (name === undefined) name = fragmentRE.test(html) && RegExp.$1\n if (!(name in containers)) name = '*'\n\n container = containers[name]\n container.innerHTML = '' + html\n dom = $.each(slice.call(container.childNodes), function(){\n container.removeChild(this)\n })\n }\n\n if (isPlainObject(properties)) {\n nodes = $(dom)\n $.each(properties, function(key, value) {\n if (methodAttributes.indexOf(key) > -1) nodes[key](value)\n else nodes.attr(key, value)\n })\n }\n\n return dom\n }\n\n // `$.zepto.Z` swaps out the prototype of the given `dom` array\n // of nodes with `$.fn` and thus supplying all the Zepto functions\n // to the array. This method can be overridden in plugins.\n zepto.Z = function(dom, selector) {\n return new Z(dom, selector)\n }\n\n // `$.zepto.isZ` should return `true` if the given object is a Zepto\n // collection. This method can be overridden in plugins.\n zepto.isZ = function(object) {\n return object instanceof zepto.Z\n }\n\n // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and\n // takes a CSS selector and an optional context (and handles various\n // special cases).\n // This method can be overridden in plugins.\n zepto.init = function(selector, context) {\n var dom\n // If nothing given, return an empty Zepto collection\n if (!selector) return zepto.Z()\n // Optimize for string selectors\n else if (typeof selector == 'string') {\n selector = selector.trim()\n // If it's a html fragment, create nodes from it\n // Note: In both Chrome 21 and Firefox 15, DOM error 12\n // is thrown if the fragment doesn't begin with <\n if (selector[0] == '<' && fragmentRE.test(selector))\n dom = zepto.fragment(selector, RegExp.$1, context), selector = null\n // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined) return $(context).find(selector)\n // If it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector)\n }\n // If a function is given, call it when the DOM is ready\n else if (isFunction(selector)) return $(document).ready(selector)\n // If a Zepto collection is given, just return it\n else if (zepto.isZ(selector)) return selector\n else {\n // normalize array if an array of nodes is given\n if (isArray(selector)) dom = compact(selector)\n // Wrap DOM nodes.\n else if (isObject(selector))\n dom = [selector], selector = null\n // If it's a html fragment, create nodes from it\n else if (fragmentRE.test(selector))\n dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null\n // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined) return $(context).find(selector)\n // And last but no least, if it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector)\n }\n // create a new Zepto collection from the nodes found\n return zepto.Z(dom, selector)\n }\n\n // `$` will be the base `Zepto` object. When calling this\n // function just call `$.zepto.init, which makes the implementation\n // details of selecting nodes and creating Zepto collections\n // patchable in plugins.\n $ = function(selector, context){\n return zepto.init(selector, context)\n }\n\n function extend(target, source, deep) {\n for (key in source)\n if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n if (isPlainObject(source[key]) && !isPlainObject(target[key]))\n target[key] = {}\n if (isArray(source[key]) && !isArray(target[key]))\n target[key] = []\n extend(target[key], source[key], deep)\n }\n else if (source[key] !== undefined) target[key] = source[key]\n }\n\n // Copy all but undefined properties from one or more\n // objects to the `target` object.\n $.extend = function(target){\n var deep, args = slice.call(arguments, 1)\n if (typeof target == 'boolean') {\n deep = target\n target = args.shift()\n }\n args.forEach(function(arg){ extend(target, arg, deep) })\n return target\n }\n\n // `$.zepto.qsa` is Zepto's CSS selector implementation which\n // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.\n // This method can be overridden in plugins.\n zepto.qsa = function(element, selector){\n var found,\n maybeID = selector[0] == '#',\n maybeClass = !maybeID && selector[0] == '.',\n nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked\n isSimple = simpleSelectorRE.test(nameOnly)\n return (element.getElementById && isSimple && maybeID) ? // Safari DocumentFragment doesn't have getElementById\n ( (found = element.getElementById(nameOnly)) ? [found] : [] ) :\n (element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] :\n slice.call(\n isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName\n maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class\n element.getElementsByTagName(selector) : // Or a tag\n element.querySelectorAll(selector) // Or it's not simple, and we need to query all\n )\n }\n\n function filtered(nodes, selector) {\n return selector == null ? $(nodes) : $(nodes).filter(selector)\n }\n\n $.contains = document.documentElement.contains ?\n function(parent, node) {\n return parent !== node && parent.contains(node)\n } :\n function(parent, node) {\n while (node && (node = node.parentNode))\n if (node === parent) return true\n return false\n }\n\n function funcArg(context, arg, idx, payload) {\n return isFunction(arg) ? arg.call(context, idx, payload) : arg\n }\n\n function setAttribute(node, name, value) {\n value == null ? node.removeAttribute(name) : node.setAttribute(name, value)\n }\n\n // access className property while respecting SVGAnimatedString\n function className(node, value){\n var klass = node.className || '',\n svg = klass && klass.baseVal !== undefined\n\n if (value === undefined) return svg ? klass.baseVal : klass\n svg ? (klass.baseVal = value) : (node.className = value)\n }\n\n // \"true\" => true\n // \"false\" => false\n // \"null\" => null\n // \"42\" => 42\n // \"42.5\" => 42.5\n // \"08\" => \"08\"\n // JSON => parse if valid\n // String => self\n function deserializeValue(value) {\n try {\n return value ?\n value == \"true\" ||\n ( value == \"false\" ? false :\n value == \"null\" ? null :\n +value + \"\" == value ? +value :\n /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n value )\n : value\n } catch(e) {\n return value\n }\n }\n\n $.type = type\n $.isFunction = isFunction\n $.isWindow = isWindow\n $.isArray = isArray\n $.isPlainObject = isPlainObject\n\n $.isEmptyObject = function(obj) {\n var name\n for (name in obj) return false\n return true\n }\n\n $.isNumeric = function(val) {\n var num = Number(val), type = typeof val\n return val != null && type != 'boolean' &&\n (type != 'string' || val.length) &&\n !isNaN(num) && isFinite(num) || false\n }\n\n $.inArray = function(elem, array, i){\n return emptyArray.indexOf.call(array, elem, i)\n }\n\n $.camelCase = camelize\n $.trim = function(str) {\n return str == null ? \"\" : String.prototype.trim.call(str)\n }\n\n // plugin compatibility\n $.uuid = 0\n $.support = { }\n $.expr = { }\n $.noop = function() {}\n\n $.map = function(elements, callback){\n var value, values = [], i, key\n if (likeArray(elements))\n for (i = 0; i < elements.length; i++) {\n value = callback(elements[i], i)\n if (value != null) values.push(value)\n }\n else\n for (key in elements) {\n value = callback(elements[key], key)\n if (value != null) values.push(value)\n }\n return flatten(values)\n }\n\n $.each = function(elements, callback){\n var i, key\n if (likeArray(elements)) {\n for (i = 0; i < elements.length; i++)\n if (callback.call(elements[i], i, elements[i]) === false) return elements\n } else {\n for (key in elements)\n if (callback.call(elements[key], key, elements[key]) === false) return elements\n }\n\n return elements\n }\n\n $.grep = function(elements, callback){\n return filter.call(elements, callback)\n }\n\n if (window.JSON) $.parseJSON = JSON.parse\n\n // Populate the class2type map\n $.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase()\n })\n\n // Define methods that will be available on all\n // Zepto collections\n $.fn = {\n constructor: zepto.Z,\n length: 0,\n\n // Because a collection acts like an array\n // copy over these useful array functions.\n forEach: emptyArray.forEach,\n reduce: emptyArray.reduce,\n push: emptyArray.push,\n sort: emptyArray.sort,\n splice: emptyArray.splice,\n indexOf: emptyArray.indexOf,\n concat: function(){\n var i, value, args = []\n for (i = 0; i < arguments.length; i++) {\n value = arguments[i]\n args[i] = zepto.isZ(value) ? value.toArray() : value\n }\n return concat.apply(zepto.isZ(this) ? this.toArray() : this, args)\n },\n\n // `map` and `slice` in the jQuery API work differently\n // from their array counterparts\n map: function(fn){\n return $($.map(this, function(el, i){ return fn.call(el, i, el) }))\n },\n slice: function(){\n return $(slice.apply(this, arguments))\n },\n\n ready: function(callback){\n // need to check if document.body exists for IE as that browser reports\n // document ready when it hasn't yet created the body element\n if (readyRE.test(document.readyState) && document.body) callback($)\n else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false)\n return this\n },\n get: function(idx){\n return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length]\n },\n toArray: function(){ return this.get() },\n size: function(){\n return this.length\n },\n remove: function(){\n return this.each(function(){\n if (this.parentNode != null)\n this.parentNode.removeChild(this)\n })\n },\n each: function(callback){\n emptyArray.every.call(this, function(el, idx){\n return callback.call(el, idx, el) !== false\n })\n return this\n },\n filter: function(selector){\n if (isFunction(selector)) return this.not(this.not(selector))\n return $(filter.call(this, function(element){\n return zepto.matches(element, selector)\n }))\n },\n add: function(selector,context){\n return $(uniq(this.concat($(selector,context))))\n },\n is: function(selector){\n return this.length > 0 && zepto.matches(this[0], selector)\n },\n not: function(selector){\n var nodes=[]\n if (isFunction(selector) && selector.call !== undefined)\n this.each(function(idx){\n if (!selector.call(this,idx)) nodes.push(this)\n })\n else {\n var excludes = typeof selector == 'string' ? this.filter(selector) :\n (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)\n this.forEach(function(el){\n if (excludes.indexOf(el) < 0) nodes.push(el)\n })\n }\n return $(nodes)\n },\n has: function(selector){\n return this.filter(function(){\n return isObject(selector) ?\n $.contains(this, selector) :\n $(this).find(selector).size()\n })\n },\n eq: function(idx){\n return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1)\n },\n first: function(){\n var el = this[0]\n return el && !isObject(el) ? el : $(el)\n },\n last: function(){\n var el = this[this.length - 1]\n return el && !isObject(el) ? el : $(el)\n },\n find: function(selector){\n var result, $this = this\n if (!selector) result = $()\n else if (typeof selector == 'object')\n result = $(selector).filter(function(){\n var node = this\n return emptyArray.some.call($this, function(parent){\n return $.contains(parent, node)\n })\n })\n else if (this.length == 1) result = $(zepto.qsa(this[0], selector))\n else result = this.map(function(){ return zepto.qsa(this, selector) })\n return result\n },\n closest: function(selector, context){\n var nodes = [], collection = typeof selector == 'object' && $(selector)\n this.each(function(_, node){\n while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))\n node = node !== context && !isDocument(node) && node.parentNode\n if (node && nodes.indexOf(node) < 0) nodes.push(node)\n })\n return $(nodes)\n },\n parents: function(selector){\n var ancestors = [], nodes = this\n while (nodes.length > 0)\n nodes = $.map(nodes, function(node){\n if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {\n ancestors.push(node)\n return node\n }\n })\n return filtered(ancestors, selector)\n },\n parent: function(selector){\n return filtered(uniq(this.pluck('parentNode')), selector)\n },\n children: function(selector){\n return filtered(this.map(function(){ return children(this) }), selector)\n },\n contents: function() {\n return this.map(function() { return this.contentDocument || slice.call(this.childNodes) })\n },\n siblings: function(selector){\n return filtered(this.map(function(i, el){\n return filter.call(children(el.parentNode), function(child){ return child!==el })\n }), selector)\n },\n empty: function(){\n return this.each(function(){ this.innerHTML = '' })\n },\n // `pluck` is borrowed from Prototype.js\n pluck: function(property){\n return $.map(this, function(el){ return el[property] })\n },\n show: function(){\n return this.each(function(){\n this.style.display == \"none\" && (this.style.display = '')\n if (getComputedStyle(this, '').getPropertyValue(\"display\") == \"none\")\n this.style.display = defaultDisplay(this.nodeName)\n })\n },\n replaceWith: function(newContent){\n return this.before(newContent).remove()\n },\n wrap: function(structure){\n var func = isFunction(structure)\n if (this[0] && !func)\n var dom = $(structure).get(0),\n clone = dom.parentNode || this.length > 1\n\n return this.each(function(index){\n $(this).wrapAll(\n func ? structure.call(this, index) :\n clone ? dom.cloneNode(true) : dom\n )\n })\n },\n wrapAll: function(structure){\n if (this[0]) {\n $(this[0]).before(structure = $(structure))\n var children\n // drill down to the inmost element\n while ((children = structure.children()).length) structure = children.first()\n $(structure).append(this)\n }\n return this\n },\n wrapInner: function(structure){\n var func = isFunction(structure)\n return this.each(function(index){\n var self = $(this), contents = self.contents(),\n dom = func ? structure.call(this, index) : structure\n contents.length ? contents.wrapAll(dom) : self.append(dom)\n })\n },\n unwrap: function(){\n this.parent().each(function(){\n $(this).replaceWith($(this).children())\n })\n return this\n },\n clone: function(){\n return this.map(function(){ return this.cloneNode(true) })\n },\n hide: function(){\n return this.css(\"display\", \"none\")\n },\n toggle: function(setting){\n return this.each(function(){\n var el = $(this)\n ;(setting === undefined ? el.css(\"display\") == \"none\" : setting) ? el.show() : el.hide()\n })\n },\n prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') },\n next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') },\n html: function(html){\n return 0 in arguments ?\n this.each(function(idx){\n var originHtml = this.innerHTML\n $(this).empty().append( funcArg(this, html, idx, originHtml) )\n }) :\n (0 in this ? this[0].innerHTML : null)\n },\n text: function(text){\n return 0 in arguments ?\n this.each(function(idx){\n var newText = funcArg(this, text, idx, this.textContent)\n this.textContent = newText == null ? '' : ''+newText\n }) :\n (0 in this ? this.pluck('textContent').join(\"\") : null)\n },\n attr: function(name, value){\n var result\n return (typeof name == 'string' && !(1 in arguments)) ?\n (0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) :\n this.each(function(idx){\n if (this.nodeType !== 1) return\n if (isObject(name)) for (key in name) setAttribute(this, key, name[key])\n else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))\n })\n },\n removeAttr: function(name){\n return this.each(function(){ this.nodeType === 1 && name.split(' ').forEach(function(attribute){\n setAttribute(this, attribute)\n }, this)})\n },\n prop: function(name, value){\n name = propMap[name] || name\n return (1 in arguments) ?\n this.each(function(idx){\n this[name] = funcArg(this, value, idx, this[name])\n }) :\n (this[0] && this[0][name])\n },\n removeProp: function(name){\n name = propMap[name] || name\n return this.each(function(){ delete this[name] })\n },\n data: function(name, value){\n var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase()\n\n var data = (1 in arguments) ?\n this.attr(attrName, value) :\n this.attr(attrName)\n\n return data !== null ? deserializeValue(data) : undefined\n },\n val: function(value){\n if (0 in arguments) {\n if (value == null) value = \"\"\n return this.each(function(idx){\n this.value = funcArg(this, value, idx, this.value)\n })\n } else {\n return this[0] && (this[0].multiple ?\n $(this[0]).find('option').filter(function(){ return this.selected }).pluck('value') :\n this[0].value)\n }\n },\n offset: function(coordinates){\n if (coordinates) return this.each(function(index){\n var $this = $(this),\n coords = funcArg(this, coordinates, index, $this.offset()),\n parentOffset = $this.offsetParent().offset(),\n props = {\n top: coords.top - parentOffset.top,\n left: coords.left - parentOffset.left\n }\n\n if ($this.css('position') == 'static') props['position'] = 'relative'\n $this.css(props)\n })\n if (!this.length) return null\n if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0]))\n return {top: 0, left: 0}\n var obj = this[0].getBoundingClientRect()\n return {\n left: obj.left + window.pageXOffset,\n top: obj.top + window.pageYOffset,\n width: Math.round(obj.width),\n height: Math.round(obj.height)\n }\n },\n css: function(property, value){\n if (arguments.length < 2) {\n var element = this[0]\n if (typeof property == 'string') {\n if (!element) return\n return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property)\n } else if (isArray(property)) {\n if (!element) return\n var props = {}\n var computedStyle = getComputedStyle(element, '')\n $.each(property, function(_, prop){\n props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop))\n })\n return props\n }\n }\n\n var css = ''\n if (type(property) == 'string') {\n if (!value && value !== 0)\n this.each(function(){ this.style.removeProperty(dasherize(property)) })\n else\n css = dasherize(property) + \":\" + maybeAddPx(property, value)\n } else {\n for (key in property)\n if (!property[key] && property[key] !== 0)\n this.each(function(){ this.style.removeProperty(dasherize(key)) })\n else\n css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'\n }\n\n return this.each(function(){ this.style.cssText += ';' + css })\n },\n index: function(element){\n return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0])\n },\n hasClass: function(name){\n if (!name) return false\n return emptyArray.some.call(this, function(el){\n return this.test(className(el))\n }, classRE(name))\n },\n addClass: function(name){\n if (!name) return this\n return this.each(function(idx){\n if (!('className' in this)) return\n classList = []\n var cls = className(this), newName = funcArg(this, name, idx, cls)\n newName.split(/\\s+/g).forEach(function(klass){\n if (!$(this).hasClass(klass)) classList.push(klass)\n }, this)\n classList.length && className(this, cls + (cls ? \" \" : \"\") + classList.join(\" \"))\n })\n },\n removeClass: function(name){\n return this.each(function(idx){\n if (!('className' in this)) return\n if (name === undefined) return className(this, '')\n classList = className(this)\n funcArg(this, name, idx, classList).split(/\\s+/g).forEach(function(klass){\n classList = classList.replace(classRE(klass), \" \")\n })\n className(this, classList.trim())\n })\n },\n toggleClass: function(name, when){\n if (!name) return this\n return this.each(function(idx){\n var $this = $(this), names = funcArg(this, name, idx, className(this))\n names.split(/\\s+/g).forEach(function(klass){\n (when === undefined ? !$this.hasClass(klass) : when) ?\n $this.addClass(klass) : $this.removeClass(klass)\n })\n })\n },\n scrollTop: function(value){\n if (!this.length) return\n var hasScrollTop = 'scrollTop' in this[0]\n if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset\n return this.each(hasScrollTop ?\n function(){ this.scrollTop = value } :\n function(){ this.scrollTo(this.scrollX, value) })\n },\n scrollLeft: function(value){\n if (!this.length) return\n var hasScrollLeft = 'scrollLeft' in this[0]\n if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset\n return this.each(hasScrollLeft ?\n function(){ this.scrollLeft = value } :\n function(){ this.scrollTo(value, this.scrollY) })\n },\n position: function() {\n if (!this.length) return\n\n var elem = this[0],\n // Get *real* offsetParent\n offsetParent = this.offsetParent(),\n // Get correct offsets\n offset = this.offset(),\n parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset()\n\n // Subtract element margins\n // note: when an element has margin: auto the offsetLeft and marginLeft\n // are the same in Safari causing offset.left to incorrectly be 0\n offset.top -= parseFloat( $(elem).css('margin-top') ) || 0\n offset.left -= parseFloat( $(elem).css('margin-left') ) || 0\n\n // Add offsetParent borders\n parentOffset.top += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0\n parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0\n\n // Subtract the two offsets\n return {\n top: offset.top - parentOffset.top,\n left: offset.left - parentOffset.left\n }\n },\n offsetParent: function() {\n return this.map(function(){\n var parent = this.offsetParent || document.body\n while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css(\"position\") == \"static\")\n parent = parent.offsetParent\n return parent\n })\n }\n }\n\n // for now\n $.fn.detach = $.fn.remove\n\n // Generate the `width` and `height` functions\n ;['width', 'height'].forEach(function(dimension){\n var dimensionProperty =\n dimension.replace(/./, function(m){ return m[0].toUpperCase() })\n\n $.fn[dimension] = function(value){\n var offset, el = this[0]\n if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] :\n isDocument(el) ? el.documentElement['scroll' + dimensionProperty] :\n (offset = this.offset()) && offset[dimension]\n else return this.each(function(idx){\n el = $(this)\n el.css(dimension, funcArg(this, value, idx, el[dimension]()))\n })\n }\n })\n\n function traverseNode(node, fun) {\n fun(node)\n for (var i = 0, len = node.childNodes.length; i < len; i++)\n traverseNode(node.childNodes[i], fun)\n }\n\n // Generate the `after`, `prepend`, `before`, `append`,\n // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.\n adjacencyOperators.forEach(function(operator, operatorIndex) {\n var inside = operatorIndex % 2 //=> prepend, append\n\n $.fn[operator] = function(){\n // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings\n var argType, nodes = $.map(arguments, function(arg) {\n var arr = []\n argType = type(arg)\n if (argType == \"array\") {\n arg.forEach(function(el) {\n if (el.nodeType !== undefined) return arr.push(el)\n else if ($.zepto.isZ(el)) return arr = arr.concat(el.get())\n arr = arr.concat(zepto.fragment(el))\n })\n return arr\n }\n return argType == \"object\" || arg == null ?\n arg : zepto.fragment(arg)\n }),\n parent, copyByClone = this.length > 1\n if (nodes.length < 1) return this\n\n return this.each(function(_, target){\n parent = inside ? target : target.parentNode\n\n // convert all methods to a \"before\" operation\n target = operatorIndex == 0 ? target.nextSibling :\n operatorIndex == 1 ? target.firstChild :\n operatorIndex == 2 ? target :\n null\n\n var parentInDocument = $.contains(document.documentElement, parent)\n\n nodes.forEach(function(node){\n if (copyByClone) node = node.cloneNode(true)\n else if (!parent) return $(node).remove()\n\n parent.insertBefore(node, target)\n if (parentInDocument) traverseNode(node, function(el){\n if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' &&\n (!el.type || el.type === 'text/javascript') && !el.src){\n var target = el.ownerDocument ? el.ownerDocument.defaultView : window\n target['eval'].call(target, el.innerHTML)\n }\n })\n })\n })\n }\n\n // after => insertAfter\n // prepend => prependTo\n // before => insertBefore\n // append => appendTo\n $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){\n $(html)[operator](this)\n return this\n }\n })\n\n zepto.Z.prototype = Z.prototype = $.fn\n\n // Export internal API functions in the `$.zepto` namespace\n zepto.uniq = uniq\n zepto.deserializeValue = deserializeValue\n $.zepto = zepto\n\n return $\n})()\n\nwindow.Zepto = Zepto\nwindow.$ === undefined && (window.$ = Zepto)\n\n;(function($){\n var _zid = 1, undefined,\n slice = Array.prototype.slice,\n isFunction = $.isFunction,\n isString = function(obj){ return typeof obj == 'string' },\n handlers = {},\n specialEvents={},\n focusinSupported = 'onfocusin' in window,\n focus = { focus: 'focusin', blur: 'focusout' },\n hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' }\n\n specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'\n\n function zid(element) {\n return element._zid || (element._zid = _zid++)\n }\n function findHandlers(element, event, fn, selector) {\n event = parse(event)\n if (event.ns) var matcher = matcherFor(event.ns)\n return (handlers[zid(element)] || []).filter(function(handler) {\n return handler\n && (!event.e || handler.e == event.e)\n && (!event.ns || matcher.test(handler.ns))\n && (!fn || zid(handler.fn) === zid(fn))\n && (!selector || handler.sel == selector)\n })\n }\n function parse(event) {\n var parts = ('' + event).split('.')\n return {e: parts[0], ns: parts.slice(1).sort().join(' ')}\n }\n function matcherFor(ns) {\n return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)')\n }\n\n function eventCapture(handler, captureSetting) {\n return handler.del &&\n (!focusinSupported && (handler.e in focus)) ||\n !!captureSetting\n }\n\n function realEvent(type) {\n return hover[type] || (focusinSupported && focus[type]) || type\n }\n\n function add(element, events, fn, data, selector, delegator, capture){\n var id = zid(element), set = (handlers[id] || (handlers[id] = []))\n events.split(/\\s/).forEach(function(event){\n if (event == 'ready') return $(document).ready(fn)\n var handler = parse(event)\n handler.fn = fn\n handler.sel = selector\n // emulate mouseenter, mouseleave\n if (handler.e in hover) fn = function(e){\n var related = e.relatedTarget\n if (!related || (related !== this && !$.contains(this, related)))\n return handler.fn.apply(this, arguments)\n }\n handler.del = delegator\n var callback = delegator || fn\n handler.proxy = function(e){\n e = compatible(e)\n if (e.isImmediatePropagationStopped()) return\n e.data = data\n var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args))\n if (result === false) e.preventDefault(), e.stopPropagation()\n return result\n }\n handler.i = set.length\n set.push(handler)\n if ('addEventListener' in element)\n element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))\n })\n }\n function remove(element, events, fn, selector, capture){\n var id = zid(element)\n ;(events || '').split(/\\s/).forEach(function(event){\n findHandlers(element, event, fn, selector).forEach(function(handler){\n delete handlers[id][handler.i]\n if ('removeEventListener' in element)\n element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))\n })\n })\n }\n\n $.event = { add: add, remove: remove }\n\n $.proxy = function(fn, context) {\n var args = (2 in arguments) && slice.call(arguments, 2)\n if (isFunction(fn)) {\n var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) }\n proxyFn._zid = zid(fn)\n return proxyFn\n } else if (isString(context)) {\n if (args) {\n args.unshift(fn[context], fn)\n return $.proxy.apply(null, args)\n } else {\n return $.proxy(fn[context], fn)\n }\n } else {\n throw new TypeError(\"expected function\")\n }\n }\n\n $.fn.bind = function(event, data, callback){\n return this.on(event, data, callback)\n }\n $.fn.unbind = function(event, callback){\n return this.off(event, callback)\n }\n $.fn.one = function(event, selector, data, callback){\n return this.on(event, selector, data, callback, 1)\n }\n\n var returnTrue = function(){return true},\n returnFalse = function(){return false},\n ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,\n eventMethods = {\n preventDefault: 'isDefaultPrevented',\n stopImmediatePropagation: 'isImmediatePropagationStopped',\n stopPropagation: 'isPropagationStopped'\n }\n\n function compatible(event, source) {\n if (source || !event.isDefaultPrevented) {\n source || (source = event)\n\n $.each(eventMethods, function(name, predicate) {\n var sourceMethod = source[name]\n event[name] = function(){\n this[predicate] = returnTrue\n return sourceMethod && sourceMethod.apply(source, arguments)\n }\n event[predicate] = returnFalse\n })\n\n event.timeStamp || (event.timeStamp = Date.now())\n\n if (source.defaultPrevented !== undefined ? source.defaultPrevented :\n 'returnValue' in source ? source.returnValue === false :\n source.getPreventDefault && source.getPreventDefault())\n event.isDefaultPrevented = returnTrue\n }\n return event\n }\n\n function createProxy(event) {\n var key, proxy = { originalEvent: event }\n for (key in event)\n if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key]\n\n return compatible(proxy, event)\n }\n\n $.fn.delegate = function(selector, event, callback){\n return this.on(event, selector, callback)\n }\n $.fn.undelegate = function(selector, event, callback){\n return this.off(event, selector, callback)\n }\n\n $.fn.live = function(event, callback){\n $(document.body).delegate(this.selector, event, callback)\n return this\n }\n $.fn.die = function(event, callback){\n $(document.body).undelegate(this.selector, event, callback)\n return this\n }\n\n $.fn.on = function(event, selector, data, callback, one){\n var autoRemove, delegator, $this = this\n if (event && !isString(event)) {\n $.each(event, function(type, fn){\n $this.on(type, selector, data, fn, one)\n })\n return $this\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false)\n callback = data, data = selector, selector = undefined\n if (callback === undefined || data === false)\n callback = data, data = undefined\n\n if (callback === false) callback = returnFalse\n\n return $this.each(function(_, element){\n if (one) autoRemove = function(e){\n remove(element, e.type, callback)\n return callback.apply(this, arguments)\n }\n\n if (selector) delegator = function(e){\n var evt, match = $(e.target).closest(selector, element).get(0)\n if (match && match !== element) {\n evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element})\n return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)))\n }\n }\n\n add(element, event, callback, data, selector, delegator || autoRemove)\n })\n }\n $.fn.off = function(event, selector, callback){\n var $this = this\n if (event && !isString(event)) {\n $.each(event, function(type, fn){\n $this.off(type, selector, fn)\n })\n return $this\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false)\n callback = selector, selector = undefined\n\n if (callback === false) callback = returnFalse\n\n return $this.each(function(){\n remove(this, event, callback, selector)\n })\n }\n\n $.fn.trigger = function(event, args){\n event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event)\n event._args = args\n return this.each(function(){\n // handle focus(), blur() by calling them directly\n if (event.type in focus && typeof this[event.type] == \"function\") this[event.type]()\n // items in the collection might not be DOM elements\n else if ('dispatchEvent' in this) this.dispatchEvent(event)\n else $(this).triggerHandler(event, args)\n })\n }\n\n // triggers event handlers on current element just as if an event occurred,\n // doesn't trigger an actual event, doesn't bubble\n $.fn.triggerHandler = function(event, args){\n var e, result\n this.each(function(i, element){\n e = createProxy(isString(event) ? $.Event(event) : event)\n e._args = args\n e.target = element\n $.each(findHandlers(element, event.type || event), function(i, handler){\n result = handler.proxy(e)\n if (e.isImmediatePropagationStopped()) return false\n })\n })\n return result\n }\n\n // shortcut methods for `.bind(event, fn)` for each event type\n ;('focusin focusout focus blur load resize scroll unload click dblclick '+\n 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+\n 'change select keydown keypress keyup error').split(' ').forEach(function(event) {\n $.fn[event] = function(callback) {\n return (0 in arguments) ?\n this.bind(event, callback) :\n this.trigger(event)\n }\n })\n\n $.Event = function(type, props) {\n if (!isString(type)) props = type, type = props.type\n var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true\n if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name])\n event.initEvent(type, bubbles, true)\n return compatible(event)\n }\n\n})(Zepto)\n\n;(function($){\n var jsonpID = +new Date(),\n document = window.document,\n key,\n name,\n rscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n scriptTypeRE = /^(?:text|application)\\/javascript/i,\n xmlTypeRE = /^(?:text|application)\\/xml/i,\n jsonType = 'application/json',\n htmlType = 'text/html',\n blankRE = /^\\s*$/,\n originAnchor = document.createElement('a')\n\n originAnchor.href = window.location.href\n\n // trigger a custom event and return false if it was cancelled\n function triggerAndReturn(context, eventName, data) {\n var event = $.Event(eventName)\n $(context).trigger(event, data)\n return !event.isDefaultPrevented()\n }\n\n // trigger an Ajax \"global\" event\n function triggerGlobal(settings, context, eventName, data) {\n if (settings.global) return triggerAndReturn(context || document, eventName, data)\n }\n\n // Number of active Ajax requests\n $.active = 0\n\n function ajaxStart(settings) {\n if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart')\n }\n function ajaxStop(settings) {\n if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop')\n }\n\n // triggers an extra global event \"ajaxBeforeSend\" that's like \"ajaxSend\" but cancelable\n function ajaxBeforeSend(xhr, settings) {\n var context = settings.context\n if (settings.beforeSend.call(context, xhr, settings) === false ||\n triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false)\n return false\n\n triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])\n }\n function ajaxSuccess(data, xhr, settings, deferred) {\n var context = settings.context, status = 'success'\n settings.success.call(context, data, status, xhr)\n if (deferred) deferred.resolveWith(context, [data, status, xhr])\n triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data])\n ajaxComplete(status, xhr, settings)\n }\n // type: \"timeout\", \"error\", \"abort\", \"parsererror\"\n function ajaxError(error, type, xhr, settings, deferred) {\n var context = settings.context\n settings.error.call(context, xhr, type, error)\n if (deferred) deferred.rejectWith(context, [xhr, type, error])\n triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type])\n ajaxComplete(type, xhr, settings)\n }\n // status: \"success\", \"notmodified\", \"error\", \"timeout\", \"abort\", \"parsererror\"\n function ajaxComplete(status, xhr, settings) {\n var context = settings.context\n settings.complete.call(context, xhr, status)\n triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings])\n ajaxStop(settings)\n }\n\n function ajaxDataFilter(data, type, settings) {\n if (settings.dataFilter == empty) return data\n var context = settings.context\n return settings.dataFilter.call(context, data, type)\n }\n\n // Empty function, used as default callback\n function empty() {}\n\n $.ajaxJSONP = function(options, deferred){\n if (!('type' in options)) return $.ajax(options)\n\n var _callbackName = options.jsonpCallback,\n callbackName = ($.isFunction(_callbackName) ?\n _callbackName() : _callbackName) || ('Zepto' + (jsonpID++)),\n script = document.createElement('script'),\n originalCallback = window[callbackName],\n responseData,\n abort = function(errorType) {\n $(script).triggerHandler('error', errorType || 'abort')\n },\n xhr = { abort: abort }, abortTimeout\n\n if (deferred) deferred.promise(xhr)\n\n $(script).on('load error', function(e, errorType){\n clearTimeout(abortTimeout)\n $(script).off().remove()\n\n if (e.type == 'error' || !responseData) {\n ajaxError(null, errorType || 'error', xhr, options, deferred)\n } else {\n ajaxSuccess(responseData[0], xhr, options, deferred)\n }\n\n window[callbackName] = originalCallback\n if (responseData && $.isFunction(originalCallback))\n originalCallback(responseData[0])\n\n originalCallback = responseData = undefined\n })\n\n if (ajaxBeforeSend(xhr, options) === false) {\n abort('abort')\n return xhr\n }\n\n window[callbackName] = function(){\n responseData = arguments\n }\n\n script.src = options.url.replace(/\\?(.+)=\\?/, '?$1=' + callbackName)\n document.head.appendChild(script)\n\n if (options.timeout > 0) abortTimeout = setTimeout(function(){\n abort('timeout')\n }, options.timeout)\n\n return xhr\n }\n\n $.ajaxSettings = {\n // Default type of request\n type: 'GET',\n // Callback that is executed before request\n beforeSend: empty,\n // Callback that is executed if the request succeeds\n success: empty,\n // Callback that is executed the the server drops error\n error: empty,\n // Callback that is executed on request complete (both: error and success)\n complete: empty,\n // The context for the callbacks\n context: null,\n // Whether to trigger \"global\" Ajax events\n global: true,\n // Transport\n xhr: function () {\n return new window.XMLHttpRequest()\n },\n // MIME types mapping\n // IIS returns Javascript as \"application/x-javascript\"\n accepts: {\n script: 'text/javascript, application/javascript, application/x-javascript',\n json: jsonType,\n xml: 'application/xml, text/xml',\n html: htmlType,\n text: 'text/plain'\n },\n // Whether the request is to another domain\n crossDomain: false,\n // Default timeout\n timeout: 0,\n // Whether data should be serialized to string\n processData: true,\n // Whether the browser should be allowed to cache GET responses\n cache: true,\n //Used to handle the raw response data of XMLHttpRequest.\n //This is a pre-filtering function to sanitize the response.\n //The sanitized response should be returned\n dataFilter: empty\n }\n\n function mimeToDataType(mime) {\n if (mime) mime = mime.split(';', 2)[0]\n return mime && ( mime == htmlType ? 'html' :\n mime == jsonType ? 'json' :\n scriptTypeRE.test(mime) ? 'script' :\n xmlTypeRE.test(mime) && 'xml' ) || 'text'\n }\n\n function appendQuery(url, query) {\n if (query == '') return url\n return (url + '&' + query).replace(/[&?]{1,2}/, '?')\n }\n\n // serialize payload and append it to the URL for GET requests\n function serializeData(options) {\n if (options.processData && options.data && $.type(options.data) != \"string\")\n options.data = $.param(options.data, options.traditional)\n if (options.data && (!options.type || options.type.toUpperCase() == 'GET' || 'jsonp' == options.dataType))\n options.url = appendQuery(options.url, options.data), options.data = undefined\n }\n\n $.ajax = function(options){\n var settings = $.extend({}, options || {}),\n deferred = $.Deferred && $.Deferred(),\n urlAnchor, hashIndex\n for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]\n\n ajaxStart(settings)\n\n if (!settings.crossDomain) {\n urlAnchor = document.createElement('a')\n urlAnchor.href = settings.url\n // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049\n urlAnchor.href = urlAnchor.href\n settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host)\n }\n\n if (!settings.url) settings.url = window.location.toString()\n if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex)\n serializeData(settings)\n\n var dataType = settings.dataType, hasPlaceholder = /\\?.+=\\?/.test(settings.url)\n if (hasPlaceholder) dataType = 'jsonp'\n\n if (settings.cache === false || (\n (!options || options.cache !== true) &&\n ('script' == dataType || 'jsonp' == dataType)\n ))\n settings.url = appendQuery(settings.url, '_=' + Date.now())\n\n if ('jsonp' == dataType) {\n if (!hasPlaceholder)\n settings.url = appendQuery(settings.url,\n settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?')\n return $.ajaxJSONP(settings, deferred)\n }\n\n var mime = settings.accepts[dataType],\n headers = { },\n setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] },\n protocol = /^([\\w-]+:)\\/\\//.test(settings.url) ? RegExp.$1 : window.location.protocol,\n xhr = settings.xhr(),\n nativeSetHeader = xhr.setRequestHeader,\n abortTimeout\n\n if (deferred) deferred.promise(xhr)\n\n if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest')\n setHeader('Accept', mime || '*/*')\n if (mime = settings.mimeType || mime) {\n if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0]\n xhr.overrideMimeType && xhr.overrideMimeType(mime)\n }\n if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET'))\n setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded')\n\n if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name])\n xhr.setRequestHeader = setHeader\n\n xhr.onreadystatechange = function(){\n if (xhr.readyState == 4) {\n xhr.onreadystatechange = empty\n clearTimeout(abortTimeout)\n var result, error = false\n if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) {\n dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'))\n\n if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob')\n result = xhr.response\n else {\n result = xhr.responseText\n\n try {\n // http://perfectionkills.com/global-eval-what-are-the-options/\n // sanitize response accordingly if data filter callback provided\n result = ajaxDataFilter(result, dataType, settings)\n if (dataType == 'script') (1,eval)(result)\n else if (dataType == 'xml') result = xhr.responseXML\n else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result)\n } catch (e) { error = e }\n\n if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred)\n }\n\n ajaxSuccess(result, xhr, settings, deferred)\n } else {\n ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred)\n }\n }\n }\n\n if (ajaxBeforeSend(xhr, settings) === false) {\n xhr.abort()\n ajaxError(null, 'abort', xhr, settings, deferred)\n return xhr\n }\n\n var async = 'async' in settings ? settings.async : true\n xhr.open(settings.type, settings.url, async, settings.username, settings.password)\n\n if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]\n\n for (name in headers) nativeSetHeader.apply(xhr, headers[name])\n\n if (settings.timeout > 0) abortTimeout = setTimeout(function(){\n xhr.onreadystatechange = empty\n xhr.abort()\n ajaxError(null, 'timeout', xhr, settings, deferred)\n }, settings.timeout)\n\n // avoid sending empty string (#319)\n xhr.send(settings.data ? settings.data : null)\n return xhr\n }\n\n // handle optional data/success arguments\n function parseArguments(url, data, success, dataType) {\n if ($.isFunction(data)) dataType = success, success = data, data = undefined\n if (!$.isFunction(success)) dataType = success, success = undefined\n return {\n url: url\n , data: data\n , success: success\n , dataType: dataType\n }\n }\n\n $.get = function(/* url, data, success, dataType */){\n return $.ajax(parseArguments.apply(null, arguments))\n }\n\n $.post = function(/* url, data, success, dataType */){\n var options = parseArguments.apply(null, arguments)\n options.type = 'POST'\n return $.ajax(options)\n }\n\n $.getJSON = function(/* url, data, success */){\n var options = parseArguments.apply(null, arguments)\n options.dataType = 'json'\n return $.ajax(options)\n }\n\n $.fn.load = function(url, data, success){\n if (!this.length) return this\n var self = this, parts = url.split(/\\s/), selector,\n options = parseArguments(url, data, success),\n callback = options.success\n if (parts.length > 1) options.url = parts[0], selector = parts[1]\n options.success = function(response){\n self.html(selector ?\n $('<div>').html(response.replace(rscript, \"\")).find(selector)\n : response)\n callback && callback.apply(self, arguments)\n }\n $.ajax(options)\n return this\n }\n\n var escape = encodeURIComponent\n\n function serialize(params, obj, traditional, scope){\n var type, array = $.isArray(obj), hash = $.isPlainObject(obj)\n $.each(obj, function(key, value) {\n type = $.type(value)\n if (scope) key = traditional ? scope :\n scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']'\n // handle data in serializeArray() format\n if (!scope && array) params.add(value.name, value.value)\n // recurse into nested objects\n else if (type == \"array\" || (!traditional && type == \"object\"))\n serialize(params, value, traditional, key)\n else params.add(key, value)\n })\n }\n\n $.param = function(obj, traditional){\n var params = []\n params.add = function(key, value) {\n if ($.isFunction(value)) value = value()\n if (value == null) value = \"\"\n this.push(escape(key) + '=' + escape(value))\n }\n serialize(params, obj, traditional)\n return params.join('&').replace(/%20/g, '+')\n }\n})(Zepto)\n\n;(function($){\n $.fn.serializeArray = function() {\n var name, type, result = [],\n add = function(value) {\n if (value.forEach) return value.forEach(add)\n result.push({ name: name, value: value })\n }\n if (this[0]) $.each(this[0].elements, function(_, field){\n type = field.type, name = field.name\n if (name && field.nodeName.toLowerCase() != 'fieldset' &&\n !field.disabled && type != 'submit' && type != 'reset' && type != 'button' && type != 'file' &&\n ((type != 'radio' && type != 'checkbox') || field.checked))\n add($(field).val())\n })\n return result\n }\n\n $.fn.serialize = function(){\n var result = []\n this.serializeArray().forEach(function(elm){\n result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value))\n })\n return result.join('&')\n }\n\n $.fn.submit = function(callback) {\n if (0 in arguments) this.bind('submit', callback)\n else if (this.length) {\n var event = $.Event('submit')\n this.eq(0).trigger(event)\n if (!event.isDefaultPrevented()) this.get(0).submit()\n }\n return this\n }\n\n})(Zepto)\n\n;(function(){\n // getComputedStyle shouldn't freak out when called\n // without a valid element as argument\n try {\n getComputedStyle(undefined)\n } catch(e) {\n var nativeGetComputedStyle = getComputedStyle\n window.getComputedStyle = function(element, pseudoElement){\n try {\n return nativeGetComputedStyle(element, pseudoElement)\n } catch(e) {\n return null\n }\n }\n }\n})()\n return Zepto\n}))\n"},function(){!function(e){e.expr={":":{}},e.support={},e.fn.clone=function(){var t=e();return this.each(function(){t.push(this.cloneNode(!0))}),t},["Left","Top"].forEach(function(t,n){function i(e){return function(e){return e&&"object"==g(e)&&"setInterval"in e}(e)?e:!(9!==e.nodeType)&&(e.defaultView||e.parentWindow)}var o="scroll"+t;e.fn[o]=function(t){var s,r;return void 0===t?(s=this[0])?(r=i(s))?"pageXOffset"in r?r[n?"pageYOffset":"pageXOffset"]:r.document.documentElement[o]||r.document.body[o]:s[o]:null:void this.each(function(){if(r=i(this)){var s=n?e(r).scrollLeft():t,a=n?t:e(r).scrollTop();r.scrollTo(s,a)}else this[o]=t})}}),["width","height"].forEach(function(t){var n=t.replace(/./,function(e){return e[0].toUpperCase()});e.fn["inner"+n]=function(e){var n=this;if(n){var i=n[t]();return{width:["left","right"],height:["top","bottom"]}[t].forEach(function(t){i+=parseInt(n.css("padding-"+t),10),e&&(i+=parseInt(n.css("margin-"+t),10))}),i}return null},e.fn["outer"+n]=function(e){var n=this;if(n){var i=n[t]();return{width:["left","right"],height:["top","bottom"]}[t].forEach(function(t){e&&(i+=parseInt(n.css("margin-"+t),10))}),i}return null}}),e.proxy=function(t,n){if("string"==typeof n){var i=t[n];n=t,t=i}if(e.isFunction(t)){var o=Array.prototype.slice.call(arguments,2),s=function(){return t.apply(n,o.concat(Array.prototype.slice.call(arguments)))};return s.guid=t.guid=t.guid||s.guid||e.guid++,s}};var t=String.prototype.trim;e.trim=function(e,n){return!n&&t?t.call(e):(n=defaultToWhiteSpace(n),e.replace(new RegExp("^["+n+"]+|["+n+"]+$","g"),""))};var n=/^(?:body|html)$/i;e.fn.position=function(){if(!this[0])return null;var t=this[0],i=this.offsetParent(),o=this.offset(),s=n.test(i[0].nodeName)?{top:0,left:0}:i.offset();return o.top-=parseFloat(e(t).css("margin-top"))||0,o.left-=parseFloat(e(t).css("margin-left"))||0,s.top+=parseFloat(e(i[0]).css("border-top-width"))||0,s.left+=parseFloat(e(i[0]).css("border-left-width"))||0,{top:o.top-s.top,left:o.left-s.left}},e.fn.offsetParent=function(){var t=e();return this.each(function(){for(var i=this.offsetParent||document.body;i&&!n.test(i.nodeName)&&"static"===e(i).css("position");)i=i.offsetParent;t.push(i)}),t}}(Zepto)}])},"object"==g(t)&&"object"==g(e)?e.exports=s():(i=[],void 0===(o="function"==typeof(n=s)?n.apply(t,i):n)||(e.exports=o))}).call(this,n(2)(e))},function(e,t,n){"use strict";n.r(t);var i=n(0),o=new(n.n(i).a)({settings:{showPopoutIcon:!1,showCloseIcon:!1},dimensions:{minItemHeight:40},content:[{type:"row",content:[{type:"column",width:40,content:[{type:"component",componentName:"template",title:"Game",componentState:{id:"client_wrapper"}},{type:"component",title:"Miscellaneous",height:5,componentName:"template",componentState:{id:"misc"}}]},{type:"column",content:[{type:"stack",height:60,content:[{type:"component",title:"Server chat",componentName:"template",componentState:{id:"ooc"}},{type:"component",title:"Log",componentName:"template",componentState:{id:"log"}}]},{type:"row",content:[{type:"component",title:"Music",componentName:"template",componentState:{id:"music"}},{type:"stack",content:[{type:"component",title:"Settings",componentName:"template",componentState:{id:"client_settings"}},{type:"component",title:"About",componentName:"template",componentState:{id:"about"}}]}]}]}]}]});o.registerComponent("template",function(e,t){var n=document.querySelector("#".concat(t.id));e.getElement().html(n.content)}),o.init()},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}}]);
+!function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){(function(e){var n,i,o,s;function r(e){var t="function"==typeof Map?new Map:void 0;return(r=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return a(e,arguments,u(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),m(i,e)})(e)}function a(e,t,n){return(a=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct:function(e,t,n){var i=[null];i.push.apply(i,t);var o=new(Function.bind.apply(e,i));return n&&m(o,n.prototype),o}).apply(null,arguments)}function l(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function c(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),e}function h(e,t){return!t||"object"!==g(t)&&"function"!=typeof t?d(e):t}function u(e){return(u=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function f(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&m(e,t)}function m(e,t){return(m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function g(e){return(g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}"undefined"==typeof self||self,s=function(){var e=Math.min,t=Math.floor,n=Math.max;return function(e){function t(i){if(n[i])return n[i].exports;var o=n[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=35)}([function(e,t,n){"use strict";t.e=function(e){return $.zepto?e.touches?e.targetTouches[0]:e:e.originalEvent&&e.originalEvent.touches?e.originalEvent.touches[0]:e},t.j=function(e){var t,n;if("function"==typeof o.a)return o()(e);for(n in t=[],e)t.push(n);return t},t.d=function(e){if(window.location.hash)return function(e){var t=location.hash.match(new RegExp(e+"=([^&]*)"));return t?t[1]:null}(e);if(!window.location.search)return null;var t,n,i=window.location.search.substr(1).split("&"),o={};for(n=0;n<i.length;n++)o[(t=i[n].split("="))[0]]=t[1];return o[e]||null},t.b=function(e,t){for(var n in t)e[n]=t[n];return e},t.a=function(e){return(window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)})(function(){e()})},t.g=function(e,t){if(!(t instanceof Array))throw new Error("Haystack is not an Array");if(t.indexOf)return t.indexOf(e);for(var n=0;n<t.length;n++)if(t[n]===e)return n;return-1},n.d(t,"h",function(){return r}),t.c=function(e,t,n){if(void 0!==Function.prototype.bind)return Function.prototype.bind.apply(e,[t].concat(n||[]));var i=function i(){var o=(n||[]).concat(Array.prototype.slice.call(arguments,0));return this instanceof i?void e.apply(this,o):e.apply(t,o)};return i.prototype=e.prototype,i},t.i=function(){return"function"==typeof Date.now?Date.now():(new Date).getTime()},t.f=function(){return(1e15*Math.random()).toString(36).replace(".","")},t.k=function(e){return $.trim(e.replace(/(<([^>]+)>)/gi,""))};var i=n(40),o=n.n(i),s=n(60),r=(n.n(s),"object"!=("undefined"==typeof Int8Array?"undefined":g(Int8Array))?function(e){return"function"==typeof e||!1}:function(e){return"[object Function]"===toString.call(e)})},function(e,t,n){"use strict";var i=n(0),o="__all";t.a=o,t.b=function(){return function e(){p(this,e),this._mSubscriptions={},this._mSubscriptions[o]=[],this.on=function(e,t,n){if(!Object(i.h)(t))throw new Error("Tried to listen to event "+e+" with non-function callback "+t);this._mSubscriptions[e]||(this._mSubscriptions[e]=[]),this._mSubscriptions[e].push({fn:t,ctx:n})},this.emit=function(e){var t,n,i;i=Array.prototype.slice.call(arguments,1);var s=this._mSubscriptions[e];if(s)for(s=s.slice(),t=0;t<s.length;t++)n=s[t].ctx||{},s[t].fn.apply(n,i);i.unshift(e);var r=this._mSubscriptions[o].slice();for(t=0;t<r.length;t++)n=r[t].ctx||{},r[t].fn.apply(n,i)},this.unbind=function(e,t,n){if(!this._mSubscriptions[e])throw new Error("No subscribtions to unsubscribe for event "+e);var i,o=!1;for(i=0;i<this._mSubscriptions[e].length;i++)t&&this._mSubscriptions[e][i].fn!==t||n&&n!==this._mSubscriptions[e][i].ctx||(this._mSubscriptions[e].splice(i,1),o=!0);if(0==o)throw new Error("Nothing to unbind for "+e)},this.off=this.unbind,this.trigger=this.emit}}()},function(e){var t=e.exports={version:"2.5.6"};"number"==typeof __e&&(__e=t)},function(e,t,n){"use strict";var i=n(1),o=n(26),s=n(12),r=n(27),a=n(66),l=n(0),m=function(e){function t(e,n,o){var s;return p(this,t),(s=h(this,u(t).call(this))).config=s._extendItemNode(n),s.type=n.type,s.contentItems=[],s.parent=o,s.isInitialised=!1,s.isMaximised=!1,s.isRoot=!1,s.isRow=!1,s.isColumn=!1,s.isStack=!1,s.isComponent=!1,s.layoutManager=e,s._pendingEventPropagations={},s._throttledEvents=["stateChanged"],s.on(i.a,s._propagateEvent,d(s)),n.content&&s._createContentItems(n),s}return f(t,i.b),c(t,[{key:"setSize",value:function(){throw new Error("Abstract Method")}},{key:"callDownwards",value:function(e,t,n,i){var o;for(!0!==n&&!0!==i&&this[e].apply(this,t||[]),o=0;o<this.contentItems.length;o++)this.contentItems[o].callDownwards(e,t,n);!0===n&&!0!==i&&this[e].apply(this,t||[])}},{key:"removeChild",value:function(e,t){var n=Object(l.g)(e,this.contentItems);if(-1===n)throw new Error("Can't remove child item. Unknown content item");!0!==t&&this.contentItems[n]._$destroy(),this.contentItems.splice(n,1),this.config.content.splice(n,1),0<this.contentItems.length?this.callDownwards("setSize"):!(this instanceof s.a)&&!0===this.config.isClosable&&this.parent.removeChild(this)}},{key:"undisplayChild",value:function(e){if(-1===Object(l.g)(e,this.contentItems))throw new Error("Can't remove child item. Unknown content item");this instanceof s.a||!0!==this.config.isClosable||this.parent.undisplayChild(this)}},{key:"addChild",value:function(e,t){void 0===t&&(t=this.contentItems.length),this.contentItems.splice(t,0,e),void 0===this.config.content&&(this.config.content=[]),this.config.content.splice(t,0,e.config),e.parent=this,!0===e.parent.isInitialised&&!1===e.isInitialised&&e._$init()}},{key:"replaceChild",value:function(e,t,n){t=this.layoutManager._$normalizeContentItem(t);var i=Object(l.g)(e,this.contentItems),o=e.element[0].parentNode;if(-1===i)throw new Error("Can't replace child. oldChild is not child of this");o.replaceChild(t.element[0],e.element[0]),!0===n&&(e.parent=null,e._$destroy()),this.contentItems[i]=t,t.parent=this,this.isStack&&(this.header.tabs[i].contentItem=t),!0===t.parent.isInitialised&&!1===t.isInitialised&&t._$init(),this.callDownwards("setSize")}},{key:"remove",value:function(){this.parent.removeChild(this)}},{key:"popout",value:function(){var e=this.layoutManager.createPopout(this);return this.emitBubblingEvent("stateChanged"),e}},{key:"toggleMaximise",value:function(e){e&&e.preventDefault(),!0===this.isMaximised?this.layoutManager._$minimiseItem(this):this.layoutManager._$maximiseItem(this),this.isMaximised=!this.isMaximised,this.emitBubblingEvent("stateChanged")}},{key:"select",value:function(){this.layoutManager.selectedItem!==this&&(this.layoutManager.selectItem(this,!0),this.element.addClass("lm_selected"))}},{key:"deselect",value:function(){this.layoutManager.selectedItem===this&&(this.layoutManager.selectedItem=null,this.element.removeClass("lm_selected"))}},{key:"setTitle",value:function(e){this.config.title=e,this.emit("titleChanged",e),this.emit("stateChanged")}},{key:"hasId",value:function(e){return!!this.config.id&&("string"==typeof this.config.id?this.config.id===e:this.config.id instanceof Array?-1!==Object(l.g)(e,this.config.id):void 0)}},{key:"addId",value:function(e){this.hasId(e)||(this.config.id?"string"==typeof this.config.id?this.config.id=[this.config.id,e]:this.config.id instanceof Array&&this.config.id.push(e):this.config.id=e)}},{key:"removeId",value:function(e){if(!this.hasId(e))throw new Error("Id not found");if("string"==typeof this.config.id)delete this.config.id;else if(this.config.id instanceof Array){var t=Object(l.g)(e,this.config.id);this.config.id.splice(t,1)}}},{key:"getItemsByFilter",value:function(e){var t=[];return function n(i){for(var o=0;o<i.contentItems.length;o++)!0===e(i.contentItems[o])&&t.push(i.contentItems[o]),n(i.contentItems[o])}(this),t}},{key:"getItemsById",value:function(e){return this.getItemsByFilter(function(t){return t.config.id instanceof Array?-1!==Object(l.g)(e,t.config.id):t.config.id===e})}},{key:"getItemsByType",value:function(e){return this._$getItemsByProperty("type",e)}},{key:"getComponentsByName",value:function(e){var t,n=this._$getItemsByProperty("componentName",e),i=[];for(t=0;t<n.length;t++)i.push(n[t].instance);return i}},{key:"_$getItemsByProperty",value:function(e,t){return this.getItemsByFilter(function(n){return n[e]===t})}},{key:"_$setParent",value:function(e){this.parent=e}},{key:"_$highlightDropZone",value:function(e,t,n){this.layoutManager.dropTargetIndicator.highlightArea(n)}},{key:"_$onDrop",value:function(e){this.addChild(e)}},{key:"_$hide",value:function(){this._callOnActiveComponents("hide"),this.element.hide(),this.layoutManager.updateSize()}},{key:"_$show",value:function(){this._callOnActiveComponents("show"),this.element.show(),this.layoutManager.updateSize()}},{key:"_callOnActiveComponents",value:function(e){var t,n,i=this.getItemsByType("stack");for(n=0;n<i.length;n++)(t=i[n].getActiveContentItem())&&t.isComponent&&t.container[e]()}},{key:"_$destroy",value:function(){this.emitBubblingEvent("beforeItemDestroyed"),this.callDownwards("_$destroy",[],!0,!0),this.element.remove(),this.emitBubblingEvent("itemDestroyed")}},{key:"_$getArea",value:function(e){var t=(e=e||this.element).offset(),n=e.width(),i=e.height();return{x1:t.left,y1:t.top,x2:t.left+n,y2:t.top+i,surface:n*i,contentItem:this}}},{key:"_$init",value:function(){var e;for(this.setSize(),e=0;e<this.contentItems.length;e++)this.childElementContainer.append(this.contentItems[e].element);this.isInitialised=!0,this.emitBubblingEvent("itemCreated"),this.emitBubblingEvent(this.type+"Created")}},{key:"emitBubblingEvent",value:function(e){var t=new o.a(e,this);this.emit(e,t)}},{key:"_createContentItems",value:function(e){var t,n;if(!(e.content instanceof Array))throw new r.a("content must be an Array",e);for(n=0;n<e.content.length;n++)t=this.layoutManager.createContentItem(e.content[n],this),this.contentItems.push(t)}},{key:"_extendItemNode",value:function(e){for(var t in a.a)void 0===e[t]&&(e[t]=a.a[t]);return e}},{key:"_propagateEvent",value:function(e,t){t instanceof o.a&&!1===t.isPropagationStopped&&!0===this.isInitialised&&(!1===this.isRoot&&this.parent?this.parent.emit.apply(this.parent,Array.prototype.slice.call(arguments,0)):this._scheduleEventPropagationToLayoutManager(e,t))}},{key:"_scheduleEventPropagationToLayoutManager",value:function(e,t){-1===Object(l.g)(e,this._throttledEvents)?this.layoutManager.emit(e,t.origin):!0!==this._pendingEventPropagations[e]&&(this._pendingEventPropagations[e]=!0,Object(l.a)(Object(l.c)(this._propagateEventToLayoutManager,this,[e,t])))}},{key:"_propagateEventToLayoutManager",value:function(e,t){this._pendingEventPropagations[e]=!1,this.layoutManager.emit(e,t)}}]),t}();t.a=m},function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)},function(e,t,n){e.exports=!n(10)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,i,o){"use strict";var s=Math.round,r=o(3),a=o(13),l=o(67),d=o(0),m=function(e){function i(e,t,n,o){var s;return p(this,i),(s=h(this,u(i).call(this,t,n,o))).isRow=!e,s.isColumn=e,s.element=$('<div class="lm_item lm_'+(e?"column":"row")+'"></div>'),s.childElementContainer=s.element,s._splitterSize=t.config.dimensions.borderWidth,s._splitterGrabSize=t.config.dimensions.borderGrabWidth,s._isColumn=e,s._dimension=e?"height":"width",s._splitter=[],s._splitterPosition=null,s._splitterMinPosition=null,s._splitterMaxPosition=null,s}return f(i,r.a),c(i,[{key:"addChild",value:function(e,t,i){var o,s,a,l;if(e=this.layoutManager._$normalizeContentItem(e,this),void 0===t&&(t=this.contentItems.length),0<this.contentItems.length?(l=this._createSplitter(n(0,t-1)).element,0<t?(this.contentItems[t-1].element.after(l),l.after(e.element),this._isDocked(t-1)&&(this._splitter[t-1].element.hide(),this._splitter[t].element.show())):(this.contentItems[0].element.before(l),l.before(e.element))):this.childElementContainer.append(e.element),r.a.prototype.addChild.call(this,e,t),o=1/this.contentItems.length*100,!0!==i){for(a=0;a<this.contentItems.length;a++)this.contentItems[a]===e?e.config[this._dimension]=o:(s=this.contentItems[a].config[this._dimension]*=(100-o)/100,this.contentItems[a].config[this._dimension]=s);this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged"),this._validateDocking()}else this.emitBubblingEvent("stateChanged")}},{key:"undisplayChild",value:function(e){var t,i=e.config[this._dimension],o=Object(d.g)(e,this.contentItems),s=n(o-1,0);if(-1===o)throw new Error("Can't undisplay child. ContentItem is not child of this Row or Column");this._splitter[s]&&this._splitter[s].element.hide(),s<this._splitter.length&&this._isDocked(s)&&this._splitter[s].element.hide();var a=this._isDocked();for(t=0;t<this.contentItems.length;t++)this.contentItems[t]===e?this.contentItems[t].config[this._dimension]=0:this._isDocked(t)||(this.contentItems[t].config[this._dimension]+=i/(this.contentItems.length-1-a));1===this.contentItems.length&&r.a.prototype.undisplayChild.call(this,e),this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")}},{key:"removeChild",value:function(e,t){var i,o,s=e.config[this._dimension],a=Object(d.g)(e,this.contentItems),l=n(a-1,0);if(-1===a)throw new Error("Can't remove child. ContentItem is not child of this Row or Column");this._splitter[l]&&(this._splitter[l]._$destroy(),this._splitter.splice(l,1)),l<this._splitter.length&&this._isDocked(l)&&this._splitter[l].element.hide();var c=this._isDocked();for(i=0;i<this.contentItems.length;i++)this.contentItems[i]!==e&&(this._isDocked(i)||(this.contentItems[i].config[this._dimension]+=s/(this.contentItems.length-1-c)));r.a.prototype.removeChild.call(this,e,t),1===this.contentItems.length&&!0===this.config.isClosable?(o=this.contentItems[0],this.contentItems=[],this.parent.replaceChild(this,o,!0),this._validateDocking(this.parent)):(this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged"),this._validateDocking())}},{key:"replaceChild",value:function(e,t){var n=e.config[this._dimension];r.a.prototype.replaceChild.call(this,e,t),t.config[this._dimension]=n,this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")}},{key:"setSize",value:function(){0<this.contentItems.length&&(this._calculateRelativeSizes(),this._setAbsoluteSizes()),this.emitBubblingEvent("stateChanged"),this.emit("resize")}},{key:"dock",value:function(e,t,i){if(1===this.contentItems.length)throw new Error("Can't dock child when it single");var o=e.config[this._dimension],s=this.layoutManager.config.dimensions.headerHeight,r=Object(d.g)(e,this.contentItems),a=n(r-1,0);if(-1===r)throw new Error("Can't dock child. ContentItem is not child of this Row or Column");var l,c=e._docker&&e._docker.docked;if(void 0===t||t!=c){if(c){for(this._splitter[a].element.show(),l=0;l<this.contentItems.length;l++){var h=e._docker.size;this.contentItems[l]===e?e.config[this._dimension]=h:(itemSize=this.contentItems[l].config[this._dimension]*=(100-h)/100,this.contentItems[l].config[this._dimension]=itemSize)}e._docker={docked:!1}}else{if(2>this.contentItems.length-this._isDocked())throw new Error("Can't dock child when it is last in "+this.config.type);var u={column:{first:"top",last:"bottom"},row:{first:"left",last:"right"}}[this.config.type][r?"last":"first"];e.header.position()!=u&&e.header.position(u),this._splitter[a]&&this._splitter[a].element.hide();var f=this._isDocked();for(l=0;l<this.contentItems.length;l++)this.contentItems[l]===e?this.contentItems[l].config[this._dimension]=0:this._isDocked(l)||(this.contentItems[l].config[this._dimension]+=o/(this.contentItems.length-1-f));e._docker={dimension:this._dimension,size:o,realSize:e.element[this._dimension]()-s,docked:!0},i&&e.childElementContainer[this._dimension](0)}e.element.toggleClass("lm_docked",e._docker.docked),this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged"),this._validateDocking()}}},{key:"_$init",value:function(){if(!0!==this.isInitialised){var e;for(r.a.prototype._$init.call(this),e=0;e<this.contentItems.length-1;e++)this.contentItems[e].element.after(this._createSplitter(e).element);for(e=0;e<this.contentItems.length;e++)this.contentItems[e]._header&&this.contentItems[e]._header.docked&&this.dock(this.contentItems[e],!0,!0)}}},{key:"_setAbsoluteSizes",value:function(){var e,t=this._calculateAbsoluteSizes();for(e=0;e<this.contentItems.length;e++)0<t.additionalPixel-e&&t.itemSizes[e]++,this._isColumn?(this.contentItems[e].element.width(t.totalWidth),this.contentItems[e].element.height(t.itemSizes[e])):(this.contentItems[e].element.width(t.itemSizes[e]),this.contentItems[e].element.height(t.totalHeight))}},{key:"_calculateAbsoluteSizes",value:function(){var e,n,i=(this.contentItems.length-1)*this._splitterSize,o=this.layoutManager.config.dimensions.headerHeight,s=this.element.width(),r=this.element.height(),a=0,l=[];for(this._isColumn?r-=i:s-=i,e=0;e<this.contentItems.length;e++)this._isDocked(e)&&(this._isColumn?r-=o-this._splitterSize:s-=o-this._splitterSize);for(e=0;e<this.contentItems.length;e++)n=this._isColumn?t(r*(this.contentItems[e].config.height/100)):t(s*(this.contentItems[e].config.width/100)),this._isDocked(e)&&(n=o),a+=n,l.push(n);return{itemSizes:l,additionalPixel:t((this._isColumn?r:s)-a),totalWidth:s,totalHeight:r}}},{key:"_calculateRelativeSizes",value:function(){var e,t=0,n=[],i=this._isColumn?"height":"width";for(e=0;e<this.contentItems.length;e++)void 0===this.contentItems[e].config[i]?n.push(this.contentItems[e]):t+=this.contentItems[e].config[i];if(100!==s(t))if(100>s(t)&&0<n.length){for(e=0;e<n.length;e++)n[e].config[i]=(100-t)/n.length;this._respectMinItemWidth()}else{if(100<s(t))for(e=0;e<n.length;e++)n[e].config[i]=50,t+=50;for(e=0;e<this.contentItems.length;e++)this.contentItems[e].config[i]=this.contentItems[e].config[i]/t*100;this._respectMinItemWidth()}else this._respectMinItemWidth()}},{key:"_respectMinItemWidth",value:function(){var e,t,n,i=this.layoutManager.config.dimensions&&this.layoutManager.config.dimensions.minItemWidth||0,o=null,r=[],a=0,l=0,c=0,h=0,u=[];if(!(this._isColumn||!i||1>=this.contentItems.length)){o=this._calculateAbsoluteSizes();for(var d=0;d<this.contentItems.length;d++)this.contentItems[d],(h=o.itemSizes[d])<i?(l+=i-h,n={width:i}):(a+=h-i,n={width:h},r.push(n)),u.push(n);if(!(0==l||l>a)){for(e=l/a,c=l,d=0;d<r.length;d++)n=r[d],c-=t=s((n.width-i)*e),n.width-=t;for(0!==c&&(u[u.length-1].width-=c),d=0;d<this.contentItems.length;d++)this.contentItems[d].config.width=u[d].width/o.totalWidth*100}}}},{key:"_createSplitter",value:function(e){var t;return(t=new l.a(this._isColumn,this._splitterSize,this._splitterGrabSize)).on("drag",Object(d.c)(this._onSplitterDrag,this,[t]),this),t.on("dragStop",Object(d.c)(this._onSplitterDragStop,this,[t]),this),t.on("dragStart",Object(d.c)(this._onSplitterDragStart,this,[t]),this),this._splitter.splice(e,0,t),t}},{key:"_getItemsForSplitter",value:function(e){var t=Object(d.g)(e,this._splitter);return{before:this.contentItems[t],after:this.contentItems[t+1]}}},{key:"_isDocked",value:function(e){if(void 0===e){for(var t=0,n=0;n<this.contentItems.length;++n)this._isDocked(n)&&t++;return t}return e<this.contentItems.length?this.contentItems[e]._docker&&this.contentItems[e]._docker.docked:void 0}},{key:"_validateDocking",value:function(e){for(var t=1<(e=e||this).contentItems.length-e._isDocked(),n=0;n<e.contentItems.length;++n)e.contentItems[n]instanceof a.a&&(e.contentItems[n].header._setDockable(e._isDocked(n)||t),e.contentItems[n].header._$setClosable(t))}},{key:"_getMinimumDimensions",value:function(e){for(var t=0,i=0,o=0;o<e.length;++o)t=n(e[o].minWidth||0,t),i=n(e[o].minHeight||0,i);return{horizontal:t,vertical:i}}},{key:"_onSplitterDragStart",value:function(e){var t=this._getItemsForSplitter(e),n=this.layoutManager.config.dimensions[this._isColumn?"minItemHeight":"minItemWidth"],i=this._getMinimumDimensions(t.before.config.content),o=this._isColumn?i.vertical:i.horizontal,s=this._getMinimumDimensions(t.after.config.content),r=this._isColumn?s.vertical:s.horizontal;this._splitterPosition=0,this._splitterMinPosition=-1*(t.before.element[this._dimension]()-(o||n)),this._splitterMaxPosition=t.after.element[this._dimension]()-(r||n)}},{key:"_onSplitterDrag",value:function(e,t,n){var i=this._isColumn?n:t;i>this._splitterMinPosition&&i<this._splitterMaxPosition&&(this._splitterPosition=i,e.element.css(this._isColumn?"top":"left",i))}},{key:"_onSplitterDragStop",value:function(e){var t=this._getItemsForSplitter(e),n=t.before.element[this._dimension](),i=t.after.element[this._dimension](),o=(this._splitterPosition+n)/(n+i),s=t.before.config[this._dimension]+t.after.config[this._dimension];t.before.config[this._dimension]=o*s,t.after.config[this._dimension]=(1-o)*s,e.element.css({top:0,left:0}),Object(d.a)(Object(d.c)(this.callDownwards,this,["setSize"]))}}]),i}();i.a=m},function(e,t,n){"use strict";var i=n(1),o=n(0),s=function(e){function t(e,n){var i;return p(this,t),(i=h(this,u(t).call(this)))._timeout=null,i._eElement=$(e),i._oDocument=$(document),i._eBody=$(document.body),i._nButtonCode=n||0,i._nDelay=200,i._nDistance=10,i._nX=0,i._nY=0,i._nOriginalX=0,i._nOriginalY=0,i._bDragging=!1,i._fMove=Object(o.c)(i.onMouseMove,d(i)),i._fUp=Object(o.c)(i.onMouseUp,d(i)),i._fDown=Object(o.c)(i.onMouseDown,d(i)),i._eElement.on("mousedown touchstart",i._fDown),i}return f(t,i.b),c(t,[{key:"destroy",value:function(){this._eElement.unbind("mousedown touchstart",this._fDown),this._oDocument.unbind("mouseup touchend",this._fUp),this._eElement=null,this._oDocument=null,this._eBody=null}},{key:"onMouseDown",value:function(e){if(e.preventDefault(),0==e.button||"touchstart"===e.type){var t=this._getCoordinates(e);this._nOriginalX=t.x,this._nOriginalY=t.y,this._oDocument.on("mousemove touchmove",this._fMove),this._oDocument.one("mouseup touchend",this._fUp),this._timeout=setTimeout(Object(o.c)(this._startDrag,this),this._nDelay)}}},{key:"onMouseMove",value:function(e){var t=Math.abs;if(null!=this._timeout){e.preventDefault();var n=this._getCoordinates(e);this._nX=n.x-this._nOriginalX,this._nY=n.y-this._nOriginalY,!1===this._bDragging&&(t(this._nX)>this._nDistance||t(this._nY)>this._nDistance)&&(clearTimeout(this._timeout),this._startDrag()),this._bDragging&&this.emit("drag",this._nX,this._nY,e)}}},{key:"onMouseUp",value:function(e){null!=this._timeout&&(clearTimeout(this._timeout),this._eBody.removeClass("lm_dragging"),this._eElement.removeClass("lm_dragging"),this._oDocument.find("iframe").css("pointer-events",""),this._oDocument.unbind("mousemove touchmove",this._fMove),this._oDocument.unbind("mouseup touchend",this._fUp),!0===this._bDragging&&(this._bDragging=!1,this.emit("dragStop",e,this._nOriginalX+this._nX)))}},{key:"_startDrag",value:function(){this._bDragging=!0,this._eBody.addClass("lm_dragging"),this._eElement.addClass("lm_dragging"),this._oDocument.find("iframe").css("pointer-events","none"),this.emit("dragStart",this._nOriginalX,this._nOriginalY)}},{key:"_getCoordinates",value:function(e){return{x:(e=Object(o.e)(e)).pageX,y:e.pageY}}}]),t}();t.a=s},function(e,t,n){var i=n(9);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},function(e){e.exports=function(e){return"object"==g(e)?null!==e:"function"==typeof e}},function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){"use strict";var i=n(0);t.a=function(){function e(){if(p(this,e),this._keys=["settings","hasHeaders","constrainDragToContainer","selectionEnabled","dimensions","borderWidth","minItemHeight","minItemWidth","headerHeight","dragProxyWidth","dragProxyHeight","labels","close","maximise","minimise","popout","content","componentName","componentState","id","width","type","height","isClosable","title","popoutWholeStack","openPopouts","parentId","activeItemIndex","reorderEnabled","borderGrabWidth"],36<this._keys.length)throw new Error("Too many keys in config minifier map");this._values=[!0,!1,"row","column","stack","component","close","maximise","minimise","open in new window"]}return c(e,[{key:"minifyConfig",value:function(e){var t={};return this._nextLevel(e,t,"_min"),t}},{key:"unminifyConfig",value:function(e){var t={};return this._nextLevel(e,t,"_max"),t}},{key:"_nextLevel",value:function(e,t,n){var i,o;for(i in e)e instanceof Array&&(i=parseInt(i,10)),e.hasOwnProperty(i)&&(o=this[n](i,this._keys),"object"==g(e[i])?(t[o]=e[i]instanceof Array?[]:{},this._nextLevel(e[i],t[o],n)):t[o]=this[n](e[i],this._values))}},{key:"_min",value:function(e,t){if("string"==typeof e&&1===e.length)return"___"+e;var n=Object(i.g)(e,t);return-1===n?e:n.toString(36)}},{key:"_max",value:function(e,t){return"string"==typeof e&&1===e.length?t[parseInt(e,36)]:"string"==typeof e&&"___"===e.substr(0,3)?e[3]:e}}]),e}()},function(e,t,n){"use strict";var i=n(3),o=n(6),s=function(e){function t(e,n,i){var o;return p(this,t),(o=h(this,u(t).call(this,e,n,null))).isRoot=!0,o.type="root",o.element=$('<div class="lm_goldenlayout lm_item lm_root"></div>'),o.childElementContainer=o.element,o._containerElement=i,o._containerElement.append(o.element),o}return f(t,i.a),c(t,[{key:"addChild",value:function(e){if(0<this.contentItems.length)throw new Error("Root node can only have a single child");e=this.layoutManager._$normalizeContentItem(e,this),this.childElementContainer.append(e.element),i.a.prototype.addChild.call(this,e),this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")}},{key:"setSize",value:function(e,t){e=void 0===e?this._containerElement.width():e,t=void 0===t?this._containerElement.height():t,this.element.width(e),this.element.height(t),this.contentItems[0]&&(this.contentItems[0].element.width(e),this.contentItems[0].element.height(t))}},{key:"_$highlightDropZone",value:function(){this.layoutManager.tabDropPlaceholder.remove(),i.a.prototype._$highlightDropZone.apply(this,arguments)}},{key:"_$onDrop",value:function(e,t){var n;if(e.isComponent&&((n=this.layoutManager.createContentItem({type:"stack",header:e.config.header||{}},this))._$init(),n.addChild(e),e=n),this.contentItems.length){("row"===e.config.type||"column"===e.config.type)&&((n=this.layoutManager.createContentItem({type:"stack"},this)).addChild(e),e=n);var i="x"==t.side[0]?"row":"column",s="x"==t.side[0]?"width":"height",r="2"==t.side[1],a=this.contentItems[0];if(a instanceof o.a&&a.type==i){var l=a.contentItems[r?0:a.contentItems.length-1];a.addChild(e,r?0:void 0,!0),l.config[s]*=.5,e.config[s]=l.config[s],a.callDownwards("setSize")}else{var c=this.layoutManager.createContentItem({type:i},this);this.replaceChild(a,c),c.addChild(e,r?0:void 0,!0),c.addChild(a,r?void 0:0,!0),a.config[s]=50,e.config[s]=50,c.callDownwards("setSize")}}else this.addChild(e)}}]),t}();t.a=s},function(t,i,o){"use strict";var s=o(3),r=o(6),a=o(28),l=o(0),m=function(t){function i(e,t,n){var o;p(this,i),(o=h(this,u(i).call(this,e,t,n))).element=$('<div class="lm_item lm_stack"></div>'),o._activeContentItem=null;var s=e.config;return o._header={show:!0===s.settings.hasHeaders&&!1!==t.hasHeaders,popout:s.settings.showPopoutIcon&&s.labels.popout,maximise:s.settings.showMaximiseIcon&&s.labels.maximise,close:s.settings.showCloseIcon&&s.labels.close,minimise:s.labels.minimise},s.header&&Object(l.b)(o._header,s.header),t.header&&Object(l.b)(o._header,t.header),t.content&&t.content[0]&&t.content[0].header&&Object(l.b)(o._header,t.content[0].header),o._dropZones={},o._dropSegment=null,o._contentAreaDimensions=null,o._dropIndex=null,o.isStack=!0,o.childElementContainer=$('<div class="lm_items"></div>'),o.header=new a.a(e,d(o)),o.element.on("mouseleave mouseenter",Object(l.c)(function(e){this._docker&&this._docker.docked&&this.childElementContainer[this._docker.dimension]("mouseenter"==e.type?this._docker.realSize:0)},d(o))),o.element.append(o.header.element),o.element.append(o.childElementContainer),o._setupHeaderPosition(),o._$validateClosability(),o}return f(i,s.a),c(i,[{key:"dock",value:function(e){this._header.dock&&this.parent instanceof r.a&&this.parent.dock(this,e)}},{key:"setSize",value:function(){if("none"!==this.element.css("display")){var e=this._docker&&this._docker.docked,t={width:this.element.width(),height:this.element.height()};this._header.show&&(t[this._sided?"width":"height"]-=this.layoutManager.config.dimensions.headerHeight),e&&(t[this._docker.dimension]=this._docker.realSize),e&&"height"!=this._docker.dimension||this.childElementContainer.width(t.width),e&&"width"!=this._docker.dimension||this.childElementContainer.height(t.height);for(var n=0;n<this.contentItems.length;n++)this.contentItems[n].element.width(t.width),this.contentItems[n].element.height(t.height);this.emit("resize"),this.emitBubblingEvent("stateChanged")}}},{key:"_$init",value:function(){var e,t;if(!0!==this.isInitialised){for(s.a.prototype._$init.call(this),e=0;e<this.contentItems.length;e++)this.header.createTab(this.contentItems[e]),this.contentItems[e]._$hide();if(0<this.contentItems.length){if(!(t=this.contentItems[this.config.activeItemIndex||0]))throw new Error("Configured activeItemIndex out of bounds");this.setActiveContentItem(t)}}}},{key:"setActiveContentItem",value:function(e){if(-1===Object(l.g)(e,this.contentItems))throw new Error("contentItem is not a child of this stack");null!==this._activeContentItem&&this._activeContentItem._$hide(),this._activeContentItem=e,this.header.setActiveContentItem(e),e._$show(),this.emit("activeContentItemChanged",e),this.layoutManager.emit("activeContentItemChanged",e),this.emitBubblingEvent("stateChanged")}},{key:"getActiveContentItem",value:function(){return this.header.activeContentItem}},{key:"addChild",value:function(e,t){t>this.contentItems.length&&(t-=1),e=this.layoutManager._$normalizeContentItem(e,this),s.a.prototype.addChild.call(this,e,t),this.childElementContainer.append(e.element),this.header.createTab(e,t),this.setActiveContentItem(e),this.callDownwards("setSize"),this._$validateClosability(),this.parent instanceof r.a&&this.parent._validateDocking(),this.emitBubblingEvent("stateChanged")}},{key:"removeChild",value:function(e,t){var i=Object(l.g)(e,this.contentItems);s.a.prototype.removeChild.call(this,e,t),this.header.removeTab(e),this.header.activeContentItem===e&&(0<this.contentItems.length?this.setActiveContentItem(this.contentItems[n(i-1,0)]):this._activeContentItem=null),this._$validateClosability(),this.parent instanceof r.a&&this.parent._validateDocking(),this.emitBubblingEvent("stateChanged")}},{key:"undisplayChild",value:function(e){if(1<this.contentItems.length){var t=Object(l.g)(e,this.contentItems);e._$hide&&e._$hide(),this.setActiveContentItem(this.contentItems[0===t?t+1:t-1])}else this.header.hideTab(e),e._$hide&&e._$hide(),s.a.prototype.undisplayChild.call(this,e),this.parent instanceof r.a&&this.parent._validateDocking();this.emitBubblingEvent("stateChanged")}},{key:"_$validateClosability",value:function(){var e,t,n;for(e=this.header._isClosable(),n=0,t=this.contentItems.length;n<t&&e;n++)e=this.contentItems[n].config.isClosable;this.header._$setClosable(e)}},{key:"_$destroy",value:function(){s.a.prototype._$destroy.call(this),this.header._$destroy(),this.element.off("mouseenter mouseleave")}},{key:"_$onDrop",value:function(e){if("header"===this._dropSegment)return this._resetHeaderDropZone(),void this.addChild(e,this._dropIndex);if("body"!==this._dropSegment){var t,n,i,o="top"===this._dropSegment||"bottom"===this._dropSegment,s="left"===this._dropSegment||"right"===this._dropSegment,r="top"===this._dropSegment||"left"===this._dropSegment,a=o&&this.parent.isColumn||s&&this.parent.isRow,c=o?"column":"row",h=o?"height":"width";e.isComponent&&((n=this.layoutManager.createContentItem({type:"stack",header:e.config.header||{}},this))._$init(),n.addChild(e),e=n),("row"===e.config.type||"column"===e.config.type)&&((n=this.layoutManager.createContentItem({type:"stack"},this)).addChild(e),e=n),a?(t=Object(l.g)(this,this.parent.contentItems),this.parent.addChild(e,r?t:t+1,!0),this.config[h]*=.5,e.config[h]=this.config[h],this.parent.callDownwards("setSize")):(c=o?"column":"row",i=this.layoutManager.createContentItem({type:c},this),this.parent.replaceChild(this,i),i.addChild(e,r?0:void 0,!0),i.addChild(this,r?void 0:0,!0),this.config[h]=50,e.config[h]=50,i.callDownwards("setSize")),this.parent._validateDocking()}else this.addChild(e)}},{key:"_$highlightDropZone",value:function(e,t){var n,i;for(n in this._contentAreaDimensions)if((i=this._contentAreaDimensions[n].hoverArea).x1<e&&i.x2>e&&i.y1<t&&i.y2>t)return void("header"===n?(this._dropSegment="header",this._highlightHeaderDropZone(this._sided?t:e)):(this._resetHeaderDropZone(),this._highlightBodyDropZone(n)))}},{key:"_$getArea",value:function(){if("none"===this.element.css("display"))return null;var e=s.a.prototype._$getArea,t=e.call(this,this.header.element),n=e.call(this,this.childElementContainer),i=n.x2-n.x1,o=n.y2-n.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2},highlightArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2}}},this._activeContentItem&&!1===this._activeContentItem.isComponent?t:0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2}},e.call(this,this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:n.x1,y1:n.y1,x2:n.x1+.25*i,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x1+.5*i,y2:n.y2}},this._contentAreaDimensions.top={hoverArea:{x1:n.x1+.25*i,y1:n.y1,x2:n.x1+.75*i,y2:n.y1+.5*o},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y1+.5*o}},this._contentAreaDimensions.right={hoverArea:{x1:n.x1+.75*i,y1:n.y1,x2:n.x2,y2:n.y2},highlightArea:{x1:n.x1+.5*i,y1:n.y1,x2:n.x2,y2:n.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:n.x1+.25*i,y1:n.y1+.5*o,x2:n.x1+.75*i,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1+.5*o,x2:n.x2,y2:n.y2}},e.call(this,this.element))}},{key:"_highlightHeaderDropZone",value:function(t){var n,i,o,s,r,a,l,c,h=this.header.tabs.length,u=!1;if(0===h)return l=this.header.element.offset(),void this.layoutManager.dropTargetIndicator.highlightArea({x1:l.left,x2:l.left+100,y1:l.top+this.header.element.height()-20,y2:l.top+this.header.element.height()});for(n=0;n<h;n++)if(r=(i=this.header.tabs[n].element).offset(),this._sided?(s=r.top,o=r.left,c=i.height()):(s=r.left,o=r.top,c=i.width()),t>s&&t<s+c){u=!0;break}if(!(0==u&&t<s)){if(t<s+c/2?(this._dropIndex=n,i.before(this.layoutManager.tabDropPlaceholder)):(this._dropIndex=e(n+1,h),i.after(this.layoutManager.tabDropPlaceholder)),this._sided){var d=this.layoutManager.tabDropPlaceholder.offset().top;return void this.layoutManager.dropTargetIndicator.highlightArea({x1:o,x2:o+i.innerHeight(),y1:d,y2:d+this.layoutManager.tabDropPlaceholder.width()})}a=this.layoutManager.tabDropPlaceholder.offset().left,this.layoutManager.dropTargetIndicator.highlightArea({x1:a,x2:a+this.layoutManager.tabDropPlaceholder.width(),y1:o,y2:o+i.innerHeight()})}}},{key:"_resetHeaderDropZone",value:function(){this.layoutManager.tabDropPlaceholder.remove()}},{key:"toggleMaximise",value:function(e){this.isMaximised||this.dock(!1),s.a.prototype.toggleMaximise.call(this,e)}},{key:"_setupHeaderPosition",value:function(){var e=0<=["right","left","bottom"].indexOf(this._header.show)&&this._header.show;if(this.header.element.toggle(!!this._header.show),this._side=e,this._sided=0<=["right","left"].indexOf(this._side),this.element.removeClass("lm_left lm_right lm_bottom"),this._side&&this.element.addClass("lm_"+this._side),this.element.find(".lm_header").length&&this.childElementContainer){var t=0<=["right","bottom"].indexOf(this._side)?"before":"after";this.header.element[t](this.childElementContainer),this.callDownwards("setSize")}}},{key:"_highlightBodyDropZone",value:function(e){var t=this._contentAreaDimensions[e].highlightArea;this.layoutManager.dropTargetIndicator.highlightArea(t),this._dropSegment=e}}]),i}();i.a=m},function(e){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var i=n(44),o=n(20);e.exports=Object.keys||function(e){return i(e,o)}},function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},function(e,t,n){var i=n(45),o=n(14);e.exports=function(e){return i(o(e))}},function(e){var n=Math.ceil;e.exports=function(e){return isNaN(e=+e)?0:(0<e?t:n)(e)}},function(e,t,n){var i=n(50)("keys"),o=n(52);e.exports=function(e){return i[e]||(i[e]=o(e))}},function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){var i=n(4),o=n(2),s=n(54),r=n(56),a=n(16),l="prototype",c=function e(t,n,c){var h,u,d,f=t&e.F,m=t&e.G,p=t&e.S,g=t&e.P,y=t&e.B,v=t&e.W,_=m?o:o[n]||(o[n]={}),b=_[l],w=m?i:p?i[n]:(i[n]||{})[l];for(h in m&&(c=n),c)(u=!f&&w&&void 0!==w[h])&&a(_,h)||(d=u?w[h]:c[h],_[h]=m&&"function"!=typeof w[h]?c[h]:y&&u?s(d,i):v&&w[h]==d?function(e){var t=function(t,n,i){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,i)}return e.apply(this,arguments)};return t[l]=e[l],t}(d):g&&"function"==typeof d?s(Function.call,d):d,g&&((_.virtual||(_.virtual={}))[h]=d,t&e.R&&b&&!b[h]&&r(b,h,d)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,t,n){var i=n(8),o=n(57),s=n(58),r=Object.defineProperty;t.f=n(5)?Object.defineProperty:function(e,t,n){if(i(e),t=s(t,!0),i(n),o)try{return r(e,t,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var i=n(9),o=n(4).document,s=i(o)&&i(o.createElement);e.exports=function(e){return s?o.createElement(e):{}}},function(e,t){"use strict";t.a=function(){function e(t,n){p(this,e),this._reactComponent=null,this._originalComponentWillUpdate=null,this._container=t,this._initialState=n,this._reactClass=this._getReactClass(),this._container.on("open",this._render,this),this._container.on("destroy",this._destroy,this)}return c(e,[{key:"_render",value:function(){this._reactComponent=ReactDOM.render(this._getReactComponent(),this._container.getElement()[0]),this._originalComponentWillUpdate=this._reactComponent.componentWillUpdate||function(){},this._reactComponent.componentWillUpdate=this._onUpdate.bind(this),this._container.getState()&&this._reactComponent.setState(this._container.getState())}},{key:"_destroy",value:function(){ReactDOM.unmountComponentAtNode(this._container.getElement()[0]),this._container.off("open",this._render,this),this._container.off("destroy",this._destroy,this)}},{key:"_onUpdate",value:function(e,t){this._container.setState(t),this._originalComponentWillUpdate.call(this._reactComponent,e,t)}},{key:"_getReactClass",value:function(){var e,t=this._container._config.component;if(!t)throw new Error("No react component name. type: react-component needs a field `component`");if(!(e=this._container.layoutManager.getComponent(t)))throw new Error('React component "'+t+'" not found. Please register all components with GoldenLayout using `registerComponent(name, component)`');return e}},{key:"_getReactComponent",value:function(){var e={glEventHub:this._container.layoutManager.eventHub,glContainer:this._container},t=$.extend(e,this._container._config.props);return React.createElement(this._reactClass,t)}}]),e}()},function(e,t,n){"use strict";var i=n(1),o=n(0),s=function(e){function t(e){var n;return p(this,t),(n=h(this,u(t).call(this)))._layoutManager=e,n._dontPropagateToParent=null,n._childEventSource=null,n.on(i.a,Object(o.c)(n._onEventFromThis,d(n))),n._boundOnEventFromChild=Object(o.c)(n._onEventFromChild,d(n)),$(window).on("gl_child_event",n._boundOnEventFromChild),n}return f(t,i.b),c(t,[{key:"_onEventFromThis",value:function(){var e=Array.prototype.slice.call(arguments);this._layoutManager.isSubWindow&&e[0]!==this._dontPropagateToParent&&this._propagateToParent(e),this._propagateToChildren(e),this._dontPropagateToParent=null,this._childEventSource=null}},{key:"_$onEventFromParent",value:function(e){this._dontPropagateToParent=e[0],this.emit.apply(this,e)}},{key:"_onEventFromChild",value:function(e){this._childEventSource=e.originalEvent.__gl,this.emit.apply(this,e.originalEvent.__glArgs)}},{key:"_propagateToParent",value:function(e){var t,n="gl_child_event";document.createEvent?(t=window.opener.document.createEvent("HTMLEvents")).initEvent(n,!0,!0):(t=window.opener.document.createEventObject()).eventType=n,t.eventName=n,t.__glArgs=e,t.__gl=this._layoutManager,document.createEvent?window.opener.dispatchEvent(t):window.opener.fireEvent("on"+t.eventType,t)}},{key:"_propagateToChildren",value:function(e){var t,n;for(n=0;n<this._layoutManager.openPopouts.length;n++)(t=this._layoutManager.openPopouts[n].getGlInstance())&&t!==this._childEventSource&&t.eventHub._$onEventFromParent(e)}},{key:"destroy",value:function(){$(window).off("gl_child_event",this._boundOnEventFromChild)}}]),t}();t.a=s},function(e,t){"use strict";t.a=function(){function e(t,n){p(this,e),this.name=t,this.origin=n,this.isPropagationStopped=!1}return c(e,[{key:"stopPropagation",value:function(){this.isPropagationStopped=!0}}]),e}()},function(e,t){"use strict";var n=function(e){function t(e,n){var i;return p(this,t),(i=h(this,u(t).call(this))).name="Configuration Error",i.message=e,i.node=n,i}return f(t,r(Error)),t}();t.a=n},function(e,t,n){"use strict";var i=n(1),o=n(29),s=n(31),r=n(0),a=function(e){function t(e,n){var i;return p(this,t),(i=h(this,u(t).call(this))).layoutManager=e,i.element=$('<div class="lm_header"><ul class="lm_tabs"></ul><ul class="lm_controls"></ul><ul class="lm_tabdropdown_list"></ul></div>'),!0===i.layoutManager.config.settings.selectionEnabled&&(i.element.addClass("lm_selectable"),i.element.on("click touchstart",Object(r.c)(i._onHeaderClick,d(i)))),i.tabsContainer=i.element.find(".lm_tabs"),i.tabDropdownContainer=i.element.find(".lm_tabdropdown_list"),i.tabDropdownContainer.hide(),i.controlsContainer=i.element.find(".lm_controls"),i.parent=n,i.parent.on("resize",i._updateTabSizes,d(i)),i.tabs=[],i.tabsMarkedForRemoval=[],i.activeContentItem=null,i.closeButton=null,i.dockButton=null,i.tabDropdownButton=null,i.hideAdditionalTabsDropdown=Object(r.c)(i._hideAdditionalTabsDropdown,d(i)),$(document).mouseup(i.hideAdditionalTabsDropdown),i._lastVisibleTabIndex=-1,i._tabControlOffset=i.layoutManager.config.settings.tabControlOffset,i._createControls(),i}return f(t,i.b),c(t,[{key:"createTab",value:function(e,t){var n,i;for(i=0;i<this.tabs.length;i++)if(this.tabs[i].contentItem===e)return;return n=new o.a(this,e),0===this.tabs.length?(this.tabs.push(n),void this.tabsContainer.append(n.element)):(void 0===t&&(t=this.tabs.length),0<t?this.tabs[t-1].element.after(n.element):this.tabs[0].element.before(n.element),this.tabs.splice(t,0,n),void this._updateTabSizes())}},{key:"removeTab",value:function(e){for(var t=0;t<this.tabs.length;t++)if(this.tabs[t].contentItem===e)return this.tabs[t]._$destroy(),void this.tabs.splice(t,1);for(t=0;t<this.tabsMarkedForRemoval.length;t++)if(this.tabsMarkedForRemoval[t].contentItem===e)return this.tabsMarkedForRemoval[t]._$destroy(),void this.tabsMarkedForRemoval.splice(t,1);throw new Error("contentItem is not controlled by this header")}},{key:"hideTab",value:function(e){for(var t=0;t<this.tabs.length;t++)if(this.tabs[t].contentItem===e)return this.tabs[t].element.hide(),this.tabsMarkedForRemoval.push(this.tabs[t]),void this.tabs.splice(t,1);throw new Error("contentItem is not controlled by this header")}},{key:"setActiveContentItem",value:function(e){var t,n,i,o;for(t=0;t<this.tabs.length;t++)i=this.tabs[t].contentItem===e,this.tabs[t].setActive(i),!0===i&&(this.activeContentItem=e,this.parent.config.activeItemIndex=t);if(this.layoutManager.config.settings.reorderOnTabMenuClick&&-1!==this._lastVisibleTabIndex&&this.parent.config.activeItemIndex>this._lastVisibleTabIndex){for(o=this.tabs[this.parent.config.activeItemIndex],n=this.parent.config.activeItemIndex;0<n;n--)this.tabs[n]=this.tabs[n-1];this.tabs[0]=o,this.parent.config.activeItemIndex=0}this._updateTabSizes(),this.parent.emitBubblingEvent("stateChanged")}},{key:"position",value:function(e){var t=this.parent._header.show;if(this.parent._docker&&this.parent._docker.docked)throw new Error("Can't change header position in docked stack");return t&&!this.parent._side&&(t="top"),void 0!==e&&this.parent._header.show!=e&&(this.parent._header.show=e,this.parent._setupHeaderPosition()),t}},{key:"_$setClosable",value:function(e){return this._canDestroy=e||1<this.tabs.length,this.closeButton&&this._isClosable()&&(this.closeButton.element[e?"show":"hide"](),!0)}},{key:"_setDockable",value:function(e){return this.dockButton&&this.parent._header&&this.parent._header.dock&&(this.dockButton.element.toggle(!!e),!0)}},{key:"_$destroy",value:function(){this.emit("destroy",this);for(var e=0;e<this.tabs.length;e++)this.tabs[e]._$destroy();$(document).off("mouseup",this.hideAdditionalTabsDropdown),this.element.remove()}},{key:"_getHeaderSetting",value:function(e){if(e in this.parent._header)return this.parent._header[e]}},{key:"_createControls",value:function(){var e,t,n,i,o,a,l,c,h;if(h=Object(r.c)(this._showAdditionalTabsDropdown,this),c=this.layoutManager.config.labels.tabDropdown,this.tabDropdownButton=new s.a(this,c,"lm_tabdropdown",h),this.tabDropdownButton.element.hide(),this.parent._header&&this.parent._header.dock){var u=Object(r.c)(this.parent.dock,this.parent);n=this._getHeaderSetting("dock"),this.dockButton=new s.a(this,n,"lm_dock",u)}this._getHeaderSetting("popout")&&(t=Object(r.c)(this._onPopoutClick,this),n=this._getHeaderSetting("popout"),new s.a(this,n,"lm_popout",t)),this._getHeaderSetting("maximise")&&(a=Object(r.c)(this.parent.toggleMaximise,this.parent),i=this._getHeaderSetting("maximise"),o=this._getHeaderSetting("minimise"),l=new s.a(this,i,"lm_maximise",a),this.parent.on("maximised",function(){l.element.attr("title",o)}),this.parent.on("minimised",function(){l.element.attr("title",i)})),this._isClosable()&&(e=Object(r.c)(this.parent.remove,this.parent),n=this._getHeaderSetting("close"),this.closeButton=new s.a(this,n,"lm_close",e))}},{key:"_showAdditionalTabsDropdown",value:function(){this.tabDropdownContainer.show()}},{key:"_hideAdditionalTabsDropdown",value:function(){this.tabDropdownContainer.hide()}},{key:"_isClosable",value:function(){return this.parent.config.isClosable&&this.layoutManager.config.settings.showCloseIcon}},{key:"_onPopoutClick",value:function(){!0===this.layoutManager.config.settings.popoutWholeStack?this.parent.popout():this.activeContentItem.popout()}},{key:"_onHeaderClick",value:function(e){e.target===this.element[0]&&this.parent.select()}},{key:"_updateTabSizes",value:function(e){if(0!==this.tabs.length){this.tabDropdownButton.element.toggle(!0===e);var t=function(e){return e?"width":"height"};this.element.css(t(!this.parent._sided),""),this.element[t(this.parent._sided)](this.layoutManager.config.dimensions.headerHeight);var n,i,o,s,r=this.element.outerWidth()-this.controlsContainer.outerWidth()-this._tabControlOffset,a=0,l=0,c=0,h=this.layoutManager.config.settings.tabOverlapAllowance,u=!1,d=this.activeContentItem?this.tabs.indexOf(this.activeContentItem.tab):0,f=this.tabs[d];for(this.parent._sided&&(r=this.element.outerHeight()-this.controlsContainer.outerHeight()-this._tabControlOffset),this._lastVisibleTabIndex=-1,i=0;i<this.tabs.length;i++)if(n=this.tabs[i].element,this.tabsContainer.append(n),a+=n.outerWidth()+parseInt(n.css("margin-right"),10),(l=d<=i?a:a+f.element.outerWidth()+parseInt(f.element.css("margin-right"),10))>r){if(u)i===d&&(n.css({"z-index":"auto","margin-left":""}),this.tabsContainer.append(n));else if((c=0<d&&d<=i?(l-r)/(i-1):(l-r)/i)<h){for(o=0;o<=i;o++)s=o!==d&&0!==o?"-"+c+"px":"",this.tabs[o].element.css({"z-index":i-o,"margin-left":s});this._lastVisibleTabIndex=i,this.tabsContainer.append(n)}else u=!0;if(u&&i!==d){if(!e)return void this._updateTabSizes(!0);n.css({"z-index":"auto","margin-left":""}),this.tabDropdownContainer.append(n)}}else this._lastVisibleTabIndex=i,n.css({"z-index":"auto","margin-left":""}),this.tabsContainer.append(n)}}}]),t}();t.a=a},function(e,t,n){"use strict";var i=n(7),o=n(30),s=n(0);t.a=function(){function e(t,n){p(this,e),this.header=t,this.contentItem=n,this.element=$('<li class="lm_tab"><i class="lm_left"></i><span class="lm_title"></span><div class="lm_close_tab"></div><i class="lm_right"></i></li>'),this.titleElement=this.element.find(".lm_title"),this.closeElement=this.element.find(".lm_close_tab"),this.closeElement[n.config.isClosable?"show":"hide"](),this.isActive=!1,this.setTitle(n.config.title),this.contentItem.on("titleChanged",this.setTitle,this),this._layoutManager=this.contentItem.layoutManager,!0===this._layoutManager.config.settings.reorderEnabled&&!0===n.config.reorderEnabled&&(this._dragListener=new i.a(this.element),this._dragListener.on("dragStart",this._onDragStart,this),this.contentItem.on("destroy",this._dragListener.destroy,this._dragListener)),this._onTabClickFn=Object(s.c)(this._onTabClick,this),this._onCloseClickFn=Object(s.c)(this._onCloseClick,this),this.element.on("mousedown touchstart",this._onTabClickFn),this.contentItem.config.isClosable?(this.closeElement.on("click touchstart",this._onCloseClickFn),this.closeElement.on("mousedown",this._onCloseMousedown)):this.closeElement.remove(),this.contentItem.tab=this,this.contentItem.emit("tab",this),this.contentItem.layoutManager.emit("tabCreated",this),this.contentItem.isComponent&&(this.contentItem.container.tab=this,this.contentItem.container.emit("tab",this))}return c(e,[{key:"setTitle",value:function(e){this.element.attr("title",Object(s.k)(e)),this.titleElement.html(e)}},{key:"setActive",value:function(e){e===this.isActive||(this.isActive=e,e?this.element.addClass("lm_active"):this.element.removeClass("lm_active"))}},{key:"_$destroy",value:function(){this.element.off("mousedown touchstart",this._onTabClickFn),this.closeElement.off("click touchstart",this._onCloseClickFn),this._dragListener&&(this.contentItem.off("destroy",this._dragListener.destroy,this._dragListener),this._dragListener.off("dragStart",this._onDragStart),this._dragListener=null),this.element.remove()}},{key:"_onDragStart",value:function(e,t){return this.header._canDestroy?(!0===this.contentItem.parent.isMaximised&&this.contentItem.parent.toggleMaximise(),void new o.a(e,t,this._dragListener,this._layoutManager,this.contentItem,this.header.parent)):null}},{key:"_onTabClick",value:function(e){if(0===e.button||"touchstart"===e.type){var t=this.header.parent.getActiveContentItem();this.contentItem!==t&&this.header.parent.setActiveContentItem(this.contentItem)}else 1===e.button&&this.contentItem.config.isClosable&&this._onCloseClick(e)}},{key:"_onCloseClick",value:function(e){e.stopPropagation(),this.header._canDestroy&&this.header.parent.removeChild(this.contentItem)}},{key:"_onCloseMousedown",value:function(e){e.stopPropagation()}}]),e}()},function(e,t,n){"use strict";var i=n(1),o=n(0),s=function(e){function t(e,n,i,s,r,a){var l;p(this,t),(l=h(this,u(t).call(this)))._dragListener=i,l._layoutManager=s,l._contentItem=r,l._originalParent=a,l._area=null,l._lastValidArea=null,l._dragListener.on("drag",l._onDrag,d(l)),l._dragListener.on("dragStop",l._onDrop,d(l)),l.element=$('<div class="lm_dragProxy"><div class="lm_header"><ul class="lm_tabs"><li class="lm_tab lm_active"><i class="lm_left"></i><span class="lm_title"></span><i class="lm_right"></i></li></ul></div><div class="lm_content"></div></div>'),a&&a._side&&(l._sided=a._sided,l.element.addClass("lm_"+a._side),0<=["right","bottom"].indexOf(a._side)&&l.element.find(".lm_content").after(l.element.find(".lm_header"))),l.element.css({left:e,top:n}),l.element.find(".lm_tab").attr("title",Object(o.k)(l._contentItem.config.title)),l.element.find(".lm_title").html(l._contentItem.config.title),l.childElementContainer=l.element.find(".lm_content"),l.childElementContainer.append(r.element),l._undisplayTree(),l._layoutManager._$calculateItemAreas(),l._setDimensions(),$(document.body).append(l.element);var c=l._layoutManager.container.offset();return l._minX=c.left,l._minY=c.top,l._maxX=l._layoutManager.container.width()+l._minX,l._maxY=l._layoutManager.container.height()+l._minY,l._width=l.element.width(),l._height=l.element.height(),l._setDropPosition(e,n),l}return f(t,i.b),c(t,[{key:"_onDrag",value:function(e,t,n){var i=(n=Object(o.e)(n)).pageX,s=n.pageY;(i>this._minX&&i<this._maxX&&s>this._minY&&s<this._maxY||!0!==this._layoutManager.config.settings.constrainDragToContainer)&&this._setDropPosition(i,s)}},{key:"_setDropPosition",value:function(e,t){this.element.css({left:e,top:t}),this._area=this._layoutManager._$getArea(e,t),null!==this._area&&(this._lastValidArea=this._area,this._area.contentItem._$highlightDropZone(e,t,this._area))}},{key:"_onDrop",value:function(){this._updateTree(),this._layoutManager.dropTargetIndicator.hide(),null===this._area?null===this._lastValidArea?this._originalParent?this._originalParent.addChild(this._contentItem):this._contentItem._$destroy():this._lastValidArea.contentItem._$onDrop(this._contentItem,this._lastValidArea):this._area.contentItem._$onDrop(this._contentItem,this._area),this.element.remove(),this._layoutManager.emit("itemDropped",this._contentItem)}},{key:"_undisplayTree",value:function(){this._contentItem.parent&&this._contentItem.parent.undisplayChild(this._contentItem)}},{key:"_updateTree",value:function(){this._contentItem.parent&&this._contentItem.parent.removeChild(this._contentItem,!0),this._contentItem._$setParent(this)}},{key:"_setDimensions",value:function(){var e=this._layoutManager.config.dimensions,t=e.dragProxyWidth,n=e.dragProxyHeight;this.element.width(t),this.element.height(n),t-=this._sided?e.headerHeight:0,n-=this._sided?0:e.headerHeight,this.childElementContainer.width(t),this.childElementContainer.height(n),this._contentItem.element.width(t),this._contentItem.element.height(n),this._contentItem.callDownwards("_$show"),this._contentItem.callDownwards("setSize")}}]),t}();t.a=s},function(e,t){"use strict";t.a=function(){function e(t,n,i,o){p(this,e),this._header=t,this.element=$('<li class="'+i+'" title="'+n+'"></li>'),this._header.on("destroy",this._$destroy,this),this._action=o,this.element.on("click touchstart",this._action),this._header.controlsContainer.append(this.element)}return c(e,[{key:"_$destroy",value:function(){this.element.off(),this.element.remove()}}]),e}()},function(e,t,n){"use strict";var i=n(3),o=n(33),s=function(e){function t(e,n,i){var s;p(this,t),s=h(this,u(t).call(this,e,n,i));var r=e.getComponent(s.config.componentName),a=$.extend(!0,{},s.config.componentState||{});return a.componentName=s.config.componentName,s.componentName=s.config.componentName,""===s.config.title&&(s.config.title=s.config.componentName),s.isComponent=!0,s.container=new o.a(s.config,d(s),e),s.instance=new r(s.container,a),s.element=s.container._element,s}return f(t,i.a),c(t,[{key:"close",value:function(){this.parent.removeChild(this)}},{key:"setSize",value:function(){"none"!==this.element.css("display")&&this.container._$setSize(this.element.width(),this.element.height())}},{key:"_$init",value:function(){i.a.prototype._$init.call(this),this.container.emit("open")}},{key:"_$hide",value:function(){this.container.hide(),i.a.prototype._$hide.call(this)}},{key:"_$show",value:function(){this.container.show(),i.a.prototype._$show.call(this)}},{key:"_$shown",value:function(){this.container.shown(),i.a.prototype._$shown.call(this)}},{key:"_$destroy",value:function(){this.container.emit("destroy",this),i.a.prototype._$destroy.call(this)}},{key:"_$getArea",value:function(){return null}}]),t}();t.a=s},function(e,t,n){"use strict";var i=n(1),o=function(e){function t(e,n,i){var o;return p(this,t),(o=h(this,u(t).call(this))).width=null,o.height=null,o.title=e.componentName,o.parent=n,o.layoutManager=i,o.isHidden=!1,o._config=e,o._element=$('<div class="lm_item_container"><div class="lm_content"></div></div>'),o._contentElement=o._element.find(".lm_content"),o}return f(t,i.b),c(t,[{key:"getElement",value:function(){return this._contentElement}},{key:"hide",value:function(){this.emit("hide"),this.isHidden=!0,this._element.hide()}},{key:"show",value:function(){this.emit("show"),this.isHidden=!1,this._element.show(),(0!=this.height||0!=this.width)&&this.emit("shown")}},{key:"setSize",value:function(e,t){for(var n,i,o,s,r=this.parent,a=this;!r.isColumn&&!r.isRow;)if(a=r,(r=r.parent).isRoot)return!1;for(n=("height"===(i=r.isColumn?"height":"width")?t:e)/(this[i]*(1/(a.config[i]/100)))*100,o=(a.config[i]-n)/(r.contentItems.length-1),s=0;s<r.contentItems.length;s++)r.contentItems[s]===a?r.contentItems[s].config[i]=n:r.contentItems[s].config[i]+=o;return r.callDownwards("setSize"),!0}},{key:"close",value:function(){this._config.isClosable&&(this.emit("close"),this.parent.close())}},{key:"getState",value:function(){return this._config.componentState}},{key:"extendState",value:function(e){this.setState($.extend(!0,this.getState(),e))}},{key:"setState",value:function(e){this._config.componentState=e,this.parent.emitBubblingEvent("stateChanged")}},{key:"setTitle",value:function(e){this.parent.setTitle(e)}},{key:"_$setSize",value:function(e,t){(e!==this.width||t!==this.height)&&(this.width=e,this.height=t,$.zepto?this._contentElement.width(e):this._contentElement.outerWidth(e),$.zepto?this._contentElement.height(t):this._contentElement.outerHeight(t),this.emit("resize"))}}]),t}();t.a=o},function(e,n,i){"use strict";var o=i(68),s=i.n(o),r=i(1),a=i(11),l=i(0),d=function(e){function n(e,t,i,o,s){var r;return p(this,n),(r=h(this,u(n).call(this))).isInitialised=!1,r._config=e,r._dimensions=t,r._parentId=i,r._indexInParent=o,r._layoutManager=s,r._popoutWindow=null,r._id=null,r._createWindow(),r}return f(n,r.b),c(n,[{key:"toConfig",value:function(){if(!1===this.isInitialised)throw new Error("Can't create config, layout not yet initialised");return{dimensions:{width:this.getGlInstance().width,height:this.getGlInstance().height,left:this._popoutWindow.screenX||this._popoutWindow.screenLeft,top:this._popoutWindow.screenY||this._popoutWindow.screenTop},content:this.getGlInstance().toConfig().content,parentId:this._parentId,indexInParent:this._indexInParent}}},{key:"getGlInstance",value:function(){return this._popoutWindow.__glInstance}},{key:"getWindow",value:function(){return this._popoutWindow}},{key:"close",value:function(){if(this.getGlInstance())this.getGlInstance()._$closeWindow();else try{this.getWindow().close()}catch(e){}}},{key:"popIn",value:function(){var e,t;this._indexInParent;this._parentId&&(e=$.extend(!0,{},this.getGlInstance().toConfig()).content[0],!(t=this._layoutManager.root.getItemsById(this._parentId)[0])&&(t=0<this._layoutManager.root.contentItems.length?this._layoutManager.root.contentItems[0]:this._layoutManager.root)),t.addChild(e,this._indexInParent),this.close()}},{key:"_createWindow",value:function(){var e,n=this._createUrl(),i=t(1e6*Math.random()).toString(36),o=this._serializeWindowOptions({width:this._dimensions.width,height:this._dimensions.height,innerWidth:this._dimensions.width,innerHeight:this._dimensions.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=window.open(n,i,o),this._popoutWindow)$(this._popoutWindow).on("load",Object(l.c)(this._positionWindow,this)).on("unload beforeunload",Object(l.c)(this._onClose,this)),e=setInterval(Object(l.c)(function(){this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._onInitialised(),clearInterval(e))},this),10);else if(!0===this._layoutManager.config.settings.blockedPopoutsThrowError){var s=new Error("Popout blocked");throw s.type="popoutBlocked",s}}},{key:"_serializeWindowOptions",value:function(e){var t,n=[];for(t in e)n.push(t+"="+e[t]);return n.join(",")}},{key:"_createUrl",value:function(){var e,t={content:this._config},n="gl-window-config-"+Object(l.f)();t=(new a.a).minifyConfig(t);try{localStorage.setItem(n,s()(t))}catch(t){throw new Error("Error while writing to localStorage "+t.toString())}return 1===(e=document.location.href.split("?")).length?e[0]+"?gl-window="+n:document.location.href+"&gl-window="+n}},{key:"_positionWindow",value:function(){this._popoutWindow.moveTo(this._dimensions.left,this._dimensions.top),this._popoutWindow.focus()}},{key:"_onInitialised",value:function(){this.isInitialised=!0,this.getGlInstance().on("popIn",this.popIn,this),this.emit("initialised")}},{key:"_onClose",value:function(){setTimeout(Object(l.c)(this.emit,this,["closed"]),50)}}]),n}();n.a=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(36),o=(n.n(i),n(37)),s=(n.n(o),n(38)),r=(n.n(s),n(39));n.d(t,"default",function(){return r.a});var a=n(33);n.d(t,"ItemContainer",function(){return a.a});var l=n(34);n.d(t,"BrowserPopout",function(){return l.a});var c=n(28);n.d(t,"Header",function(){return c.a});var h=n(31);n.d(t,"HeaderButton",function(){return h.a});var u=n(29);n.d(t,"Tab",function(){return u.a});var d=n(32);n.d(t,"Component",function(){return d.a});var f=n(12);n.d(t,"Root",function(){return f.a});var m=n(6);n.d(t,"RowOrColumn",function(){return m.a});var p=n(13);n.d(t,"Stack",function(){return p.a});var g=n(26);n.d(t,"BubblingEvent",function(){return g.a});var y=n(11);n.d(t,"ConfigMinifier",function(){return y.a});var v=n(7);n.d(t,"DragListener",function(){return v.a});var _=n(1);n.d(t,"EventEmitter",function(){return _.b});var b=n(25);n.d(t,"EventHub",function(){return b.a});var w=n(24);n.d(t,"ReactComponentHandler",function(){return w.a}),{}.ES6&&(n(74),n(77))},function(){},function(){},function(){},function(e,i,o){"use strict";var s=o(1),r=o(24),a=o(11),l=o(25),m=o(12),y=o(6),v=o(13),_=o(32),b=o(3),w=o(34),x=o(70),k=o(71),I=o(72),C=o(27),S=o(73),E=o(0),j=function(e){function i(e,t){var n;if(p(this,i),!$){throw'Please either expose $ on GoldenLayout\'s scope (e.g. window) or add "jquery" to ',"your paths when using RequireJS/AMD",new Error('jQuery is missing as dependency for GoldenLayout. Please either expose $ on GoldenLayout\'s scope (e.g. window) or add "jquery" to your paths when using RequireJS/AMD')}return(n=h(this,u(i).call(this))).isInitialised=!1,n._isFullPage=!1,n._resizeTimeoutId=null,n._components={"lm-react-component":r.a},n._itemAreas=[],n._resizeFunction=Object(E.c)(n._onResize,d(n)),n._unloadFunction=Object(E.c)(n._onUnload,d(n)),n._maximisedItem=null,n._maximisePlaceholder=$('<div class="lm_maximise_place"></div>'),n._creationTimeoutPassed=!1,n._subWindowsCreated=!1,n._dragSources=[],n._updatingColumnsResponsive=!1,n._firstLoad=!0,n.width=null,n.height=null,n.root=null,n.openPopouts=[],n.selectedItem=null,n.isSubWindow=!1,n.eventHub=new l.a(d(n)),n.config=n._createConfig(e),n.container=t,n.dropTargetIndicator=null,n.transitionIndicator=null,n.tabDropPlaceholder=$('<div class="lm_drop_tab_placeholder"></div>'),!0===n.isSubWindow&&$("body").css("visibility","hidden"),n._typeToItem={column:Object(E.c)(y.a,d(n),[!0]),row:Object(E.c)(y.a,d(n),[!1]),stack:v.a,component:_.a},n}return f(i,s.b),c(i,[{key:"minifyConfig",value:function(e){return(new a.a).minifyConfig(e)}},{key:"unminifyConfig",value:function(e){return(new a.a).unminifyConfig(e)}},{key:"registerComponent",value:function(e,t){if("function"!=typeof t)throw new Error("Please register a constructor function");if(void 0!==this._components[e])throw new Error("Component "+e+" is already registered");this._components[e]=t}},{key:"toConfig",value:function(e){var t,n,i;if(!1===this.isInitialised)throw new Error("Can't create config, layout not yet initialised");if(e&&!(e instanceof b.a))throw new Error("Root must be a ContentItem");for((t={settings:Object(E.b)({},this.config.settings),dimensions:Object(E.b)({},this.config.dimensions),labels:Object(E.b)({},this.config.labels)}).content=[],(n=function(e,t){var i,o;for(i in t.config)"content"!==i&&(e[i]=t.config[i]);if(t.contentItems.length)for(e.content=[],o=0;o<t.contentItems.length;o++)e.content[o]={},n(e.content[o],t.contentItems[o])})(t,e?{contentItems:[e]}:this.root),this._$reconcilePopoutWindows(),t.openPopouts=[],i=0;i<this.openPopouts.length;i++)t.openPopouts.push(this.openPopouts[i].toConfig());return t.maximisedItemId=this._maximisedItem?"__glMaximised":null,t}},{key:"getComponent",value:function(e){if(void 0===this._components[e])throw new C.a('Unknown component "'+e+'"');return this._components[e]}},{key:"init",value:function(){return!1===this._subWindowsCreated&&(this._createSubWindows(),this._subWindowsCreated=!0),"loading"===document.readyState||null===document.body?void $(document).ready(Object(E.c)(this.init,this)):!0===this.isSubWindow&&!1===this._creationTimeoutPassed?(setTimeout(Object(E.c)(this.init,this),7),void(this._creationTimeoutPassed=!0)):(!0===this.isSubWindow&&this._adjustToWindowMode(),this._setContainer(),this.dropTargetIndicator=new k.a(this.container),this.transitionIndicator=new I.a,this.updateSize(),this._create(this.config),this._bindEvents(),this.isInitialised=!0,this._adjustColumnsResponsive(),void this.emit("initialised"))}},{key:"updateSize",value:function(e,t){2===arguments.length?(this.width=e,this.height=t):(this.width=this.container.width(),this.height=this.container.height()),!0===this.isInitialised&&(this.root.callDownwards("setSize",[this.width,this.height]),this._maximisedItem&&(this._maximisedItem.element.width(this.container.width()),this._maximisedItem.element.height(this.container.height()),this._maximisedItem.callDownwards("setSize")),this._adjustColumnsResponsive())}},{key:"destroy",value:function(){!1===this.isInitialised||(this._onUnload(),$(window).off("resize",this._resizeFunction),$(window).off("unload beforeunload",this._unloadFunction),this.root.callDownwards("_$destroy",[],!0),this.root.contentItems=[],this.tabDropPlaceholder.remove(),this.dropTargetIndicator.destroy(),this.transitionIndicator.destroy(),this.eventHub.destroy(),this._dragSources.forEach(function(e){e._dragListener.destroy(),e._element=null,e._itemConfig=null,e._dragListener=null}),this._dragSources=[])}},{key:"createContentItem",value:function(e,t){var n;if("string"!=typeof e.type)throw new C.a("Missing parameter 'type'",e);if("react-component"===e.type&&(e.type="component",e.componentName="lm-react-component"),!this._typeToItem[e.type])throw n="Unknown type '"+e.type+"'. Valid types are "+Object(E.j)(this._typeToItem).join(","),new C.a(n);return"component"!==e.type||t instanceof v.a||!t||!0===this.isSubWindow&&t instanceof m.a||(e={type:"stack",width:e.width,height:e.height,content:[e]}),new this._typeToItem[e.type](this,e,t)}},{key:"createPopout",value:function(e,t,n,i){var o,s,r,a,l,c,h=e,u=e instanceof b.a,d=this;if(n=n||null,u){for(h=this.toConfig(e).content,n=Object(E.f)(),a=e.parent,l=e;1===a.contentItems.length&&!a.isRoot;)a=a.parent,l=l.parent;a.addId(n),isNaN(i)&&(i=Object(E.g)(l,a.contentItems))}else h instanceof Array||(h=[h]);return!t&&u&&(o=window.screenX||window.screenLeft,s=window.screenY||window.screenTop,t={left:o+(r=e.element.offset()).left,top:s+r.top,width:e.element.width(),height:e.element.height()}),t||u||(t={left:window.screenX||window.screenLeft+20,top:window.screenY||window.screenTop+20,width:500,height:309}),u&&e.remove(),(c=new w.a(h,t,n,i,this)).on("initialised",function(){d.emit("windowOpened",c)}),c.on("closed",function(){d._$reconcilePopoutWindows()}),this.openPopouts.push(c),c}},{key:"createDragSource",value:function(e,t){this.config.settings.constrainDragToContainer=!1;var n=new x.a($(e),t,this);return this._dragSources.push(n),n}},{key:"selectItem",value:function(e,t){if(!0!==this.config.settings.selectionEnabled)throw new Error("Please set selectionEnabled to true to use this feature");e===this.selectedItem||(null!==this.selectedItem&&this.selectedItem.deselect(),e&&!0!==t&&e.select(),this.selectedItem=e,this.emit("selectionChanged",e))}},{key:"_$maximiseItem",value:function(e){null!==this._maximisedItem&&this._$minimiseItem(this._maximisedItem),this._maximisedItem=e,this._maximisedItem.addId("__glMaximised"),e.element.addClass("lm_maximised"),e.element.after(this._maximisePlaceholder),this.root.element.prepend(e.element),e.element.width(this.container.width()),e.element.height(this.container.height()),e.callDownwards("setSize"),this._maximisedItem.emit("maximised"),this.emit("stateChanged")}},{key:"_$minimiseItem",value:function(e){e.element.removeClass("lm_maximised"),e.removeId("__glMaximised"),this._maximisePlaceholder.after(e.element),this._maximisePlaceholder.remove(),e.parent.callDownwards("setSize"),this._maximisedItem=null,e.emit("minimised"),this.emit("stateChanged")}},{key:"_$closeWindow",value:function(){window.setTimeout(function(){window.close()},1)}},{key:"_$getArea",value:function(e,t){var n,i,o=1/0,s=null;for(n=0;n<this._itemAreas.length;n++)e>(i=this._itemAreas[n]).x1&&e<i.x2&&t>i.y1&&t<i.y2&&o>i.surface&&(o=i.surface,s=i);return s}},{key:"_$createRootItemAreas",value:function(){var e={y2:0,x2:0,y1:"y2",x1:"x2"};for(var t in e){var n=this.root._$getArea();n.side=t,n[t]=e[t]?n[e[t]]-50:50,n.surface=(n.x2-n.x1)*(n.y2-n.y1),this._itemAreas.push(n)}}},{key:"_$calculateItemAreas",value:function(){var e,t,n=this._getAllContentItems();if(this._itemAreas=[],1!==n.length){for(this._$createRootItemAreas(),e=0;e<n.length;e++)if(n[e].isStack){if(null===(t=n[e]._$getArea()))continue;if(t instanceof Array)this._itemAreas=this._itemAreas.concat(t);else{this._itemAreas.push(t);var i={};Object(E.b)(i,t),Object(E.b)(i,t.contentItem._contentAreaDimensions.header.highlightArea),i.surface=(i.x2-i.x1)*(i.y2-i.y1),this._itemAreas.push(i)}}}else this._itemAreas.push(this.root._$getArea())}},{key:"_$normalizeContentItem",value:function(e,t){if(!e)throw new Error("No content item defined");if(Object(E.h)(e)&&(e=e()),e instanceof b.a)return e;if($.isPlainObject(e)&&e.type){var n=this.createContentItem(e,t);return n.callDownwards("_$init"),n}throw new Error("Invalid contentItem")}},{key:"_$reconcilePopoutWindows",value:function(){var e,t=[];for(e=0;e<this.openPopouts.length;e++)!1===this.openPopouts[e].getWindow().closed?t.push(this.openPopouts[e]):this.emit("windowClosed",this.openPopouts[e]);this.openPopouts.length!==t.length&&(this.emit("stateChanged"),this.openPopouts=t)}},{key:"_getAllContentItems",value:function(){var e=[];return function t(n){if(e.push(n),n.contentItems instanceof Array)for(var i=0;i<n.contentItems.length;i++)t(n.contentItems[i])}(this.root),e}},{key:"_bindEvents",value:function(){this._isFullPage&&$(window).resize(this._resizeFunction),$(window).on("unload beforeunload",this._unloadFunction)}},{key:"_onResize",value:function(){clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=setTimeout(Object(E.c)(this.updateSize,this),100)}},{key:"_createConfig",value:function(e){var t=Object(E.d)("gl-window");t&&(this.isSubWindow=!0,e=localStorage.getItem(t),e=JSON.parse(e),e=(new a.a).unminifyConfig(e),localStorage.removeItem(t));return function e(t){for(var n in t)"props"!=n&&"object"==g(t[n])?e(t[n]):"type"==n&&"react-component"===t[n]&&(t.type="component",t.componentName="lm-react-component")}(e=$.extend(!0,{},S.a,e)),!1===e.settings.hasHeaders&&(e.dimensions.headerHeight=0),e}},{key:"_adjustToWindowMode",value:function(){var e=$('<div class="lm_popin" title="'+this.config.labels.popin+'"><div class="lm_icon"></div><div class="lm_bg"></div></div>');e.click(Object(E.c)(function(){this.emit("popIn")},this)),document.title=Object(E.k)(this.config.content[0].title),$("head").append($("body link, body style, template, .gl_keep")),this.container=$("body").html("").css("visibility","visible").append(e),document.body.offsetHeight,window.__glInstance=this}},{key:"_createSubWindows",value:function(){var e,t;for(e=0;e<this.config.openPopouts.length;e++)t=this.config.openPopouts[e],this.createPopout(t.content,t.dimensions,t.parentId,t.indexInParent)}},{key:"_setContainer",value:function(){var e=$(this.container||"body");if(0===e.length)throw new Error("GoldenLayout container not found");if(1<e.length)throw new Error("GoldenLayout more than one container element specified");e[0]===document.body&&(this._isFullPage=!0,$("html, body").css({height:"100%",margin:0,padding:0,overflow:"hidden"})),this.container=e}},{key:"_create",value:function(e){var t;if(!(e.content instanceof Array))throw t=void 0===e.content?"Missing setting 'content' on top level of configuration":"Configuration parameter 'content' must be an array",new C.a(t,e);if(1<e.content.length)throw t="Top level content can't contain more then one element.",new C.a(t,e);this.root=new m.a(this,{content:e.content},this.container),this.root.callDownwards("_$init"),"__glMaximised"===e.maximisedItemId&&this.root.getItemsById(e.maximisedItemId)[0].toggleMaximise()}},{key:"_onUnload",value:function(){if(!0===this.config.settings.closePopoutsOnUnload)for(var e=0;e<this.openPopouts.length;e++)this.openPopouts[e].close()}},{key:"_adjustColumnsResponsive",value:function(){if(this._useResponsiveLayout()&&!this._updatingColumnsResponsive&&this.config.dimensions&&this.config.dimensions.minItemWidth&&0!==this.root.contentItems.length&&this.root.contentItems[0].isRow){this._firstLoad=!1;var e=this.root.contentItems[0].contentItems.length;if(!(1>=e)){var i=this.config.dimensions.minItemWidth;if(!(e*i<=this.width)){this._updatingColumnsResponsive=!0;for(var o,s=n(t(this.width/i),1),r=this.root.contentItems[0],a=this._findAllStackContainers()[0],l=0;l<e-s;l++)o=r.contentItems[r.contentItems.length-1],this._addChildContentItemsToContainer(a,o);this._updatingColumnsResponsive=!1}}}else this._firstLoad=!1}},{key:"_useResponsiveLayout",value:function(){return this.config.settings&&("always"==this.config.settings.responsiveMode||"onload"==this.config.settings.responsiveMode&&this._firstLoad)}},{key:"_addChildContentItemsToContainer",value:function(e,t){"stack"===t.type?t.contentItems.forEach(function(n){e.addChild(n),t.removeChild(n,!0)}):t.contentItems.forEach(Object(E.c)(function(t){this._addChildContentItemsToContainer(e,t)},this))}},{key:"_findAllStackContainers",value:function(){var e=[];return this._findAllStackContainersRecursive(e,this.root),e}},{key:"_findAllStackContainersRecursive",value:function(e,t){t.contentItems.forEach(Object(E.c)(function(t){"stack"==t.type?e.push(t):!t.isComponent&&this._findAllStackContainersRecursive(e,t)},this))}}]),i}();i.a=j},function(e,t,n){e.exports={default:n(41),__esModule:!0}},function(e,t,n){n(42),e.exports=n(2).Object.keys},function(e,t,n){var i=n(43),o=n(15);n(53)("keys",function(){return function(e){return o(i(e))}})},function(e,t,n){var i=n(14);e.exports=function(e){return Object(i(e))}},function(e,t,n){var i=n(16),o=n(17),s=n(47)(!1),r=n(19)("IE_PROTO");e.exports=function(e,t){var n,a=o(e),l=0,c=[];for(n in a)n!=r&&i(a,n)&&c.push(n);for(;t.length>l;)i(a,n=t[l++])&&(~s(c,n)||c.push(n));return c}},function(e,t,n){var i=n(46);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},function(e,t,n){var i=n(17),o=n(48),s=n(49);e.exports=function(e){return function(t,n,r){var a,l=i(t),c=o(l.length),h=s(r,c);if(e&&n!=n){for(;c>h;)if((a=l[h++])!=a)return!0}else for(;c>h;h++)if((e||h in l)&&l[h]===n)return e||h||0;return!e&&-1}}},function(t,n,i){var o=i(18);t.exports=function(t){return 0<t?e(o(t),9007199254740991):0}},function(t,i,o){var s=o(18);t.exports=function(t,i){return 0>(t=s(t))?n(t+i,0):e(t,i)}},function(e,t,n){var i=n(2),o=n(4),s="__core-js_shared__",r=o[s]||(o[s]={});(e.exports=function(e,t){return r[e]||(r[e]=void 0===t?{}:t)})("versions",[]).push({version:i.version,mode:n(51)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e){e.exports=!0},function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++t+n).toString(36))}},function(e,t,n){var i=n(21),o=n(2),s=n(10);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],r={};r[e]=t(n),i(i.S+i.F*s(function(){n(1)}),"Object",r)}},function(e,t,n){var i=n(55);e.exports=function(e,t,n){return i(e),void 0===t?e:1===n?function(n){return e.call(t,n)}:2===n?function(n,i){return e.call(t,n,i)}:3===n?function(n,i,o){return e.call(t,n,i,o)}:function(){return e.apply(t,arguments)}}},function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){var i=n(22),o=n(59);e.exports=n(5)?function(e,t,n){return i.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){e.exports=!n(5)&&!n(10)(function(){return 7!=Object.defineProperty(n(23)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var i=n(9);e.exports=function(e,t){if(!i(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!i(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){e.exports={default:n(61),__esModule:!0}},function(e,t,n){n(62);var i=n(2).Object;e.exports=function(e,t){return i.create(e,t)}},function(e,t,n){var i=n(21);i(i.S,"Object",{create:n(63)})},function(e,t,n){var i=n(8),o=n(64),s=n(20),r=n(19)("IE_PROTO"),a=function(){},l="prototype",c=function(){var e,t=n(23)("iframe"),i=s.length;for(t.style.display="none",n(65).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),c=e.F;i--;)delete c[l][s[i]];return c()};e.exports=Object.create||function(e,t){var n;return null===e?n=c():(a[l]=i(e),n=new a,a[l]=null,n[r]=e),void 0===t?n:o(n,t)}},function(e,t,n){var i=n(22),o=n(8),s=n(15);e.exports=n(5)?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},function(e,t,n){var i=n(4).document;e.exports=i&&i.documentElement},function(e,t){"use strict";t.a={isClosable:!0,reorderEnabled:!0,title:""}},function(e,t,n){"use strict";var i=n(7);t.a=function(){function e(t,n,o){p(this,e),this._isVertical=t,this._size=n,this._grabSize=o<n?n:o,this.element=this._createElement(),this._dragListener=new i.a(this.element)}return c(e,[{key:"on",value:function(e,t,n){this._dragListener.on(e,t,n)}},{key:"_$destroy",value:function(){this.element.remove()}},{key:"_createElement",value:function(){var e=$('<div class="lm_drag_handle"></div>'),t=$('<div class="lm_splitter"></div>');t.append(e);var n=this._grabSize-this._size,i=n/2;return this._isVertical?(e.css("top",-i),e.css("height",this._size+n),t.addClass("lm_vertical"),t.height(this._size)):(e.css("left",-i),e.css("width",this._size+n),t.addClass("lm_horizontal"),t.width(this._size)),t}}]),e}()},function(e,t,n){e.exports={default:n(69),__esModule:!0}},function(e,t,n){var i=n(2),o=i.JSON||(i.JSON={stringify:JSON.stringify});e.exports=function(){return o.stringify.apply(o,arguments)}},function(e,t,n){"use strict";var i=n(7),o=n(30),s=n(0);t.a=function(){function e(t,n,i){p(this,e),this._element=t,this._itemConfig=n,this._layoutManager=i,this._dragListener=null,this._createDragListener()}return c(e,[{key:"_createDragListener",value:function(){null!==this._dragListener&&this._dragListener.destroy(),this._dragListener=new i.a(this._element),this._dragListener.on("dragStart",this._onDragStart,this),this._dragListener.on("dragStop",this._createDragListener,this)}},{key:"_onDragStart",value:function(e,t){var n=this._itemConfig;Object(s.h)(n)&&(n=n());var i=this._layoutManager._$normalizeContentItem($.extend(!0,{},n)),r=new o.a(e,t,this._dragListener,this._layoutManager,i,null);this._layoutManager.transitionIndicator.transitionElements(this._element,r.element)}}]),e}()},function(e,t){"use strict";t.a=function(){function e(){p(this,e),this.element=$('<div class="lm_dropTargetIndicator"><div class="lm_inner"></div></div>'),$(document.body).append(this.element)}return c(e,[{key:"destroy",value:function(){this.element.remove()}},{key:"highlight",value:function(e,t,n,i){this.highlightArea({x1:e,y1:t,x2:n,y2:i})}},{key:"highlightArea",value:function(e){this.element.css({left:e.x1,top:e.y1,width:e.x2-e.x1,height:e.y2-e.y1}).show()}},{key:"hide",value:function(){this.element.hide()}}]),e}()},function(e,t,n){"use strict";var i=n(0);t.a=function(){function e(){p(this,e),this._element=$('<div class="lm_transition_indicator"></div>'),$(document.body).append(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null}return c(e,[{key:"destroy",value:function(){this._element.remove()}},{key:"transitionElements",value:function(){}},{key:"_nextAnimationFrame",value:function(){var e,t=this._measure(this._toElement),n=(Object(i.i)()-this._animationStartTime)/this._totalAnimationDuration,o={};if(1<=n)this._element.hide();else{for(e in t.opacity=0,this._fromDimensions)o[e]=this._fromDimensions[e]+(t[e]-this._fromDimensions[e])*n;this._element.css(o),Object(i.a)(Object(i.c)(this._nextAnimationFrame,this))}}},{key:"_measure",value:function(e){var t=e.offset();return{left:t.left,top:t.top,width:e.outerWidth(),height:e.outerHeight()}}}]),e}()},function(e,t){"use strict";t.a={openPopouts:[],settings:{hasHeaders:!0,constrainDragToContainer:!0,reorderEnabled:!0,selectionEnabled:!1,popoutWholeStack:!1,blockedPopoutsThrowError:!0,closePopoutsOnUnload:!0,showPopoutIcon:!0,showMaximiseIcon:!0,showCloseIcon:!0,responsiveMode:"onload",tabOverlapAllowance:0,reorderOnTabMenuClick:!0,tabControlOffset:10},dimensions:{borderWidth:5,borderGrabWidth:15,minItemHeight:10,minItemWidth:10,headerHeight:20,dragProxyWidth:300,dragProxyHeight:200},labels:{close:"close",maximise:"maximise",minimise:"minimise",popout:"open in new window",popin:"pop in",tabDropdown:"additional tabs"}}},function(e,t,n){n(75)(n(76))},function(e){e.exports=function(e){function t(e){"undefined"!=typeof console&&(console.error||console.log)("[Script Loader]",e)}try{"undefined"!=typeof execScript&&"undefined"!=typeof attachEvent&&"undefined"==typeof addEventListener?execScript(e):"undefined"==typeof eval?t("EvalError: No eval function available"):eval.call(null,e)}catch(e){t(e)}}},function(e){e.exports="/* Zepto v1.2.0 - zepto event ajax form ie - zeptojs.com/license */\n(function(global, factory) {\n if (typeof define === 'function' && define.amd)\n define(function() { return factory(global) })\n else\n factory(global)\n}(this, function(window) {\n var Zepto = (function() {\n var undefined, key, $, classList, emptyArray = [], concat = emptyArray.concat, filter = emptyArray.filter, slice = emptyArray.slice,\n document = window.document,\n elementDisplay = {}, classCache = {},\n cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 },\n fragmentRE = /^\\s*<(\\w+|!)[^>]*>/,\n singleTagRE = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n rootNodeRE = /^(?:body|html)$/i,\n capitalRE = /([A-Z])/g,\n\n // special attributes that should be get/set via method calls\n methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],\n\n adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ],\n table = document.createElement('table'),\n tableRow = document.createElement('tr'),\n containers = {\n 'tr': document.createElement('tbody'),\n 'tbody': table, 'thead': table, 'tfoot': table,\n 'td': tableRow, 'th': tableRow,\n '*': document.createElement('div')\n },\n readyRE = /complete|loaded|interactive/,\n simpleSelectorRE = /^[\\w-]*$/,\n class2type = {},\n toString = class2type.toString,\n zepto = {},\n camelize, uniq,\n tempParent = document.createElement('div'),\n propMap = {\n 'tabindex': 'tabIndex',\n 'readonly': 'readOnly',\n 'for': 'htmlFor',\n 'class': 'className',\n 'maxlength': 'maxLength',\n 'cellspacing': 'cellSpacing',\n 'cellpadding': 'cellPadding',\n 'rowspan': 'rowSpan',\n 'colspan': 'colSpan',\n 'usemap': 'useMap',\n 'frameborder': 'frameBorder',\n 'contenteditable': 'contentEditable'\n },\n isArray = Array.isArray ||\n function(object){ return object instanceof Array }\n\n zepto.matches = function(element, selector) {\n if (!selector || !element || element.nodeType !== 1) return false\n var matchesSelector = element.matches || element.webkitMatchesSelector ||\n element.mozMatchesSelector || element.oMatchesSelector ||\n element.matchesSelector\n if (matchesSelector) return matchesSelector.call(element, selector)\n // fall back to performing a selector:\n var match, parent = element.parentNode, temp = !parent\n if (temp) (parent = tempParent).appendChild(element)\n match = ~zepto.qsa(parent, selector).indexOf(element)\n temp && tempParent.removeChild(element)\n return match\n }\n\n function type(obj) {\n return obj == null ? String(obj) :\n class2type[toString.call(obj)] || \"object\"\n }\n\n function isFunction(value) { return type(value) == \"function\" }\n function isWindow(obj) { return obj != null && obj == obj.window }\n function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }\n function isObject(obj) { return type(obj) == \"object\" }\n function isPlainObject(obj) {\n return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype\n }\n\n function likeArray(obj) {\n var length = !!obj && 'length' in obj && obj.length,\n type = $.type(obj)\n\n return 'function' != type && !isWindow(obj) && (\n 'array' == type || length === 0 ||\n (typeof length == 'number' && length > 0 && (length - 1) in obj)\n )\n }\n\n function compact(array) { return filter.call(array, function(item){ return item != null }) }\n function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array }\n camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) }\n function dasherize(str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase()\n }\n uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) }\n\n function classRE(name) {\n return name in classCache ?\n classCache[name] : (classCache[name] = new RegExp('(^|\\\\s)' + name + '(\\\\s|$)'))\n }\n\n function maybeAddPx(name, value) {\n return (typeof value == \"number\" && !cssNumber[dasherize(name)]) ? value + \"px\" : value\n }\n\n function defaultDisplay(nodeName) {\n var element, display\n if (!elementDisplay[nodeName]) {\n element = document.createElement(nodeName)\n document.body.appendChild(element)\n display = getComputedStyle(element, '').getPropertyValue(\"display\")\n element.parentNode.removeChild(element)\n display == \"none\" && (display = \"block\")\n elementDisplay[nodeName] = display\n }\n return elementDisplay[nodeName]\n }\n\n function children(element) {\n return 'children' in element ?\n slice.call(element.children) :\n $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node })\n }\n\n function Z(dom, selector) {\n var i, len = dom ? dom.length : 0\n for (i = 0; i < len; i++) this[i] = dom[i]\n this.length = len\n this.selector = selector || ''\n }\n\n // `$.zepto.fragment` takes a html string and an optional tag name\n // to generate DOM nodes from the given html string.\n // The generated DOM nodes are returned as an array.\n // This function can be overridden in plugins for example to make\n // it compatible with browsers that don't support the DOM fully.\n zepto.fragment = function(html, name, properties) {\n var dom, nodes, container\n\n // A special case optimization for a single tag\n if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))\n\n if (!dom) {\n if (html.replace) html = html.replace(tagExpanderRE, \"<$1></$2>\")\n if (name === undefined) name = fragmentRE.test(html) && RegExp.$1\n if (!(name in containers)) name = '*'\n\n container = containers[name]\n container.innerHTML = '' + html\n dom = $.each(slice.call(container.childNodes), function(){\n container.removeChild(this)\n })\n }\n\n if (isPlainObject(properties)) {\n nodes = $(dom)\n $.each(properties, function(key, value) {\n if (methodAttributes.indexOf(key) > -1) nodes[key](value)\n else nodes.attr(key, value)\n })\n }\n\n return dom\n }\n\n // `$.zepto.Z` swaps out the prototype of the given `dom` array\n // of nodes with `$.fn` and thus supplying all the Zepto functions\n // to the array. This method can be overridden in plugins.\n zepto.Z = function(dom, selector) {\n return new Z(dom, selector)\n }\n\n // `$.zepto.isZ` should return `true` if the given object is a Zepto\n // collection. This method can be overridden in plugins.\n zepto.isZ = function(object) {\n return object instanceof zepto.Z\n }\n\n // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and\n // takes a CSS selector and an optional context (and handles various\n // special cases).\n // This method can be overridden in plugins.\n zepto.init = function(selector, context) {\n var dom\n // If nothing given, return an empty Zepto collection\n if (!selector) return zepto.Z()\n // Optimize for string selectors\n else if (typeof selector == 'string') {\n selector = selector.trim()\n // If it's a html fragment, create nodes from it\n // Note: In both Chrome 21 and Firefox 15, DOM error 12\n // is thrown if the fragment doesn't begin with <\n if (selector[0] == '<' && fragmentRE.test(selector))\n dom = zepto.fragment(selector, RegExp.$1, context), selector = null\n // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined) return $(context).find(selector)\n // If it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector)\n }\n // If a function is given, call it when the DOM is ready\n else if (isFunction(selector)) return $(document).ready(selector)\n // If a Zepto collection is given, just return it\n else if (zepto.isZ(selector)) return selector\n else {\n // normalize array if an array of nodes is given\n if (isArray(selector)) dom = compact(selector)\n // Wrap DOM nodes.\n else if (isObject(selector))\n dom = [selector], selector = null\n // If it's a html fragment, create nodes from it\n else if (fragmentRE.test(selector))\n dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null\n // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined) return $(context).find(selector)\n // And last but no least, if it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector)\n }\n // create a new Zepto collection from the nodes found\n return zepto.Z(dom, selector)\n }\n\n // `$` will be the base `Zepto` object. When calling this\n // function just call `$.zepto.init, which makes the implementation\n // details of selecting nodes and creating Zepto collections\n // patchable in plugins.\n $ = function(selector, context){\n return zepto.init(selector, context)\n }\n\n function extend(target, source, deep) {\n for (key in source)\n if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n if (isPlainObject(source[key]) && !isPlainObject(target[key]))\n target[key] = {}\n if (isArray(source[key]) && !isArray(target[key]))\n target[key] = []\n extend(target[key], source[key], deep)\n }\n else if (source[key] !== undefined) target[key] = source[key]\n }\n\n // Copy all but undefined properties from one or more\n // objects to the `target` object.\n $.extend = function(target){\n var deep, args = slice.call(arguments, 1)\n if (typeof target == 'boolean') {\n deep = target\n target = args.shift()\n }\n args.forEach(function(arg){ extend(target, arg, deep) })\n return target\n }\n\n // `$.zepto.qsa` is Zepto's CSS selector implementation which\n // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.\n // This method can be overridden in plugins.\n zepto.qsa = function(element, selector){\n var found,\n maybeID = selector[0] == '#',\n maybeClass = !maybeID && selector[0] == '.',\n nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked\n isSimple = simpleSelectorRE.test(nameOnly)\n return (element.getElementById && isSimple && maybeID) ? // Safari DocumentFragment doesn't have getElementById\n ( (found = element.getElementById(nameOnly)) ? [found] : [] ) :\n (element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] :\n slice.call(\n isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName\n maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class\n element.getElementsByTagName(selector) : // Or a tag\n element.querySelectorAll(selector) // Or it's not simple, and we need to query all\n )\n }\n\n function filtered(nodes, selector) {\n return selector == null ? $(nodes) : $(nodes).filter(selector)\n }\n\n $.contains = document.documentElement.contains ?\n function(parent, node) {\n return parent !== node && parent.contains(node)\n } :\n function(parent, node) {\n while (node && (node = node.parentNode))\n if (node === parent) return true\n return false\n }\n\n function funcArg(context, arg, idx, payload) {\n return isFunction(arg) ? arg.call(context, idx, payload) : arg\n }\n\n function setAttribute(node, name, value) {\n value == null ? node.removeAttribute(name) : node.setAttribute(name, value)\n }\n\n // access className property while respecting SVGAnimatedString\n function className(node, value){\n var klass = node.className || '',\n svg = klass && klass.baseVal !== undefined\n\n if (value === undefined) return svg ? klass.baseVal : klass\n svg ? (klass.baseVal = value) : (node.className = value)\n }\n\n // \"true\" => true\n // \"false\" => false\n // \"null\" => null\n // \"42\" => 42\n // \"42.5\" => 42.5\n // \"08\" => \"08\"\n // JSON => parse if valid\n // String => self\n function deserializeValue(value) {\n try {\n return value ?\n value == \"true\" ||\n ( value == \"false\" ? false :\n value == \"null\" ? null :\n +value + \"\" == value ? +value :\n /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n value )\n : value\n } catch(e) {\n return value\n }\n }\n\n $.type = type\n $.isFunction = isFunction\n $.isWindow = isWindow\n $.isArray = isArray\n $.isPlainObject = isPlainObject\n\n $.isEmptyObject = function(obj) {\n var name\n for (name in obj) return false\n return true\n }\n\n $.isNumeric = function(val) {\n var num = Number(val), type = typeof val\n return val != null && type != 'boolean' &&\n (type != 'string' || val.length) &&\n !isNaN(num) && isFinite(num) || false\n }\n\n $.inArray = function(elem, array, i){\n return emptyArray.indexOf.call(array, elem, i)\n }\n\n $.camelCase = camelize\n $.trim = function(str) {\n return str == null ? \"\" : String.prototype.trim.call(str)\n }\n\n // plugin compatibility\n $.uuid = 0\n $.support = { }\n $.expr = { }\n $.noop = function() {}\n\n $.map = function(elements, callback){\n var value, values = [], i, key\n if (likeArray(elements))\n for (i = 0; i < elements.length; i++) {\n value = callback(elements[i], i)\n if (value != null) values.push(value)\n }\n else\n for (key in elements) {\n value = callback(elements[key], key)\n if (value != null) values.push(value)\n }\n return flatten(values)\n }\n\n $.each = function(elements, callback){\n var i, key\n if (likeArray(elements)) {\n for (i = 0; i < elements.length; i++)\n if (callback.call(elements[i], i, elements[i]) === false) return elements\n } else {\n for (key in elements)\n if (callback.call(elements[key], key, elements[key]) === false) return elements\n }\n\n return elements\n }\n\n $.grep = function(elements, callback){\n return filter.call(elements, callback)\n }\n\n if (window.JSON) $.parseJSON = JSON.parse\n\n // Populate the class2type map\n $.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase()\n })\n\n // Define methods that will be available on all\n // Zepto collections\n $.fn = {\n constructor: zepto.Z,\n length: 0,\n\n // Because a collection acts like an array\n // copy over these useful array functions.\n forEach: emptyArray.forEach,\n reduce: emptyArray.reduce,\n push: emptyArray.push,\n sort: emptyArray.sort,\n splice: emptyArray.splice,\n indexOf: emptyArray.indexOf,\n concat: function(){\n var i, value, args = []\n for (i = 0; i < arguments.length; i++) {\n value = arguments[i]\n args[i] = zepto.isZ(value) ? value.toArray() : value\n }\n return concat.apply(zepto.isZ(this) ? this.toArray() : this, args)\n },\n\n // `map` and `slice` in the jQuery API work differently\n // from their array counterparts\n map: function(fn){\n return $($.map(this, function(el, i){ return fn.call(el, i, el) }))\n },\n slice: function(){\n return $(slice.apply(this, arguments))\n },\n\n ready: function(callback){\n // need to check if document.body exists for IE as that browser reports\n // document ready when it hasn't yet created the body element\n if (readyRE.test(document.readyState) && document.body) callback($)\n else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false)\n return this\n },\n get: function(idx){\n return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length]\n },\n toArray: function(){ return this.get() },\n size: function(){\n return this.length\n },\n remove: function(){\n return this.each(function(){\n if (this.parentNode != null)\n this.parentNode.removeChild(this)\n })\n },\n each: function(callback){\n emptyArray.every.call(this, function(el, idx){\n return callback.call(el, idx, el) !== false\n })\n return this\n },\n filter: function(selector){\n if (isFunction(selector)) return this.not(this.not(selector))\n return $(filter.call(this, function(element){\n return zepto.matches(element, selector)\n }))\n },\n add: function(selector,context){\n return $(uniq(this.concat($(selector,context))))\n },\n is: function(selector){\n return this.length > 0 && zepto.matches(this[0], selector)\n },\n not: function(selector){\n var nodes=[]\n if (isFunction(selector) && selector.call !== undefined)\n this.each(function(idx){\n if (!selector.call(this,idx)) nodes.push(this)\n })\n else {\n var excludes = typeof selector == 'string' ? this.filter(selector) :\n (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)\n this.forEach(function(el){\n if (excludes.indexOf(el) < 0) nodes.push(el)\n })\n }\n return $(nodes)\n },\n has: function(selector){\n return this.filter(function(){\n return isObject(selector) ?\n $.contains(this, selector) :\n $(this).find(selector).size()\n })\n },\n eq: function(idx){\n return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1)\n },\n first: function(){\n var el = this[0]\n return el && !isObject(el) ? el : $(el)\n },\n last: function(){\n var el = this[this.length - 1]\n return el && !isObject(el) ? el : $(el)\n },\n find: function(selector){\n var result, $this = this\n if (!selector) result = $()\n else if (typeof selector == 'object')\n result = $(selector).filter(function(){\n var node = this\n return emptyArray.some.call($this, function(parent){\n return $.contains(parent, node)\n })\n })\n else if (this.length == 1) result = $(zepto.qsa(this[0], selector))\n else result = this.map(function(){ return zepto.qsa(this, selector) })\n return result\n },\n closest: function(selector, context){\n var nodes = [], collection = typeof selector == 'object' && $(selector)\n this.each(function(_, node){\n while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))\n node = node !== context && !isDocument(node) && node.parentNode\n if (node && nodes.indexOf(node) < 0) nodes.push(node)\n })\n return $(nodes)\n },\n parents: function(selector){\n var ancestors = [], nodes = this\n while (nodes.length > 0)\n nodes = $.map(nodes, function(node){\n if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {\n ancestors.push(node)\n return node\n }\n })\n return filtered(ancestors, selector)\n },\n parent: function(selector){\n return filtered(uniq(this.pluck('parentNode')), selector)\n },\n children: function(selector){\n return filtered(this.map(function(){ return children(this) }), selector)\n },\n contents: function() {\n return this.map(function() { return this.contentDocument || slice.call(this.childNodes) })\n },\n siblings: function(selector){\n return filtered(this.map(function(i, el){\n return filter.call(children(el.parentNode), function(child){ return child!==el })\n }), selector)\n },\n empty: function(){\n return this.each(function(){ this.innerHTML = '' })\n },\n // `pluck` is borrowed from Prototype.js\n pluck: function(property){\n return $.map(this, function(el){ return el[property] })\n },\n show: function(){\n return this.each(function(){\n this.style.display == \"none\" && (this.style.display = '')\n if (getComputedStyle(this, '').getPropertyValue(\"display\") == \"none\")\n this.style.display = defaultDisplay(this.nodeName)\n })\n },\n replaceWith: function(newContent){\n return this.before(newContent).remove()\n },\n wrap: function(structure){\n var func = isFunction(structure)\n if (this[0] && !func)\n var dom = $(structure).get(0),\n clone = dom.parentNode || this.length > 1\n\n return this.each(function(index){\n $(this).wrapAll(\n func ? structure.call(this, index) :\n clone ? dom.cloneNode(true) : dom\n )\n })\n },\n wrapAll: function(structure){\n if (this[0]) {\n $(this[0]).before(structure = $(structure))\n var children\n // drill down to the inmost element\n while ((children = structure.children()).length) structure = children.first()\n $(structure).append(this)\n }\n return this\n },\n wrapInner: function(structure){\n var func = isFunction(structure)\n return this.each(function(index){\n var self = $(this), contents = self.contents(),\n dom = func ? structure.call(this, index) : structure\n contents.length ? contents.wrapAll(dom) : self.append(dom)\n })\n },\n unwrap: function(){\n this.parent().each(function(){\n $(this).replaceWith($(this).children())\n })\n return this\n },\n clone: function(){\n return this.map(function(){ return this.cloneNode(true) })\n },\n hide: function(){\n return this.css(\"display\", \"none\")\n },\n toggle: function(setting){\n return this.each(function(){\n var el = $(this)\n ;(setting === undefined ? el.css(\"display\") == \"none\" : setting) ? el.show() : el.hide()\n })\n },\n prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') },\n next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') },\n html: function(html){\n return 0 in arguments ?\n this.each(function(idx){\n var originHtml = this.innerHTML\n $(this).empty().append( funcArg(this, html, idx, originHtml) )\n }) :\n (0 in this ? this[0].innerHTML : null)\n },\n text: function(text){\n return 0 in arguments ?\n this.each(function(idx){\n var newText = funcArg(this, text, idx, this.textContent)\n this.textContent = newText == null ? '' : ''+newText\n }) :\n (0 in this ? this.pluck('textContent').join(\"\") : null)\n },\n attr: function(name, value){\n var result\n return (typeof name == 'string' && !(1 in arguments)) ?\n (0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) :\n this.each(function(idx){\n if (this.nodeType !== 1) return\n if (isObject(name)) for (key in name) setAttribute(this, key, name[key])\n else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))\n })\n },\n removeAttr: function(name){\n return this.each(function(){ this.nodeType === 1 && name.split(' ').forEach(function(attribute){\n setAttribute(this, attribute)\n }, this)})\n },\n prop: function(name, value){\n name = propMap[name] || name\n return (1 in arguments) ?\n this.each(function(idx){\n this[name] = funcArg(this, value, idx, this[name])\n }) :\n (this[0] && this[0][name])\n },\n removeProp: function(name){\n name = propMap[name] || name\n return this.each(function(){ delete this[name] })\n },\n data: function(name, value){\n var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase()\n\n var data = (1 in arguments) ?\n this.attr(attrName, value) :\n this.attr(attrName)\n\n return data !== null ? deserializeValue(data) : undefined\n },\n val: function(value){\n if (0 in arguments) {\n if (value == null) value = \"\"\n return this.each(function(idx){\n this.value = funcArg(this, value, idx, this.value)\n })\n } else {\n return this[0] && (this[0].multiple ?\n $(this[0]).find('option').filter(function(){ return this.selected }).pluck('value') :\n this[0].value)\n }\n },\n offset: function(coordinates){\n if (coordinates) return this.each(function(index){\n var $this = $(this),\n coords = funcArg(this, coordinates, index, $this.offset()),\n parentOffset = $this.offsetParent().offset(),\n props = {\n top: coords.top - parentOffset.top,\n left: coords.left - parentOffset.left\n }\n\n if ($this.css('position') == 'static') props['position'] = 'relative'\n $this.css(props)\n })\n if (!this.length) return null\n if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0]))\n return {top: 0, left: 0}\n var obj = this[0].getBoundingClientRect()\n return {\n left: obj.left + window.pageXOffset,\n top: obj.top + window.pageYOffset,\n width: Math.round(obj.width),\n height: Math.round(obj.height)\n }\n },\n css: function(property, value){\n if (arguments.length < 2) {\n var element = this[0]\n if (typeof property == 'string') {\n if (!element) return\n return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property)\n } else if (isArray(property)) {\n if (!element) return\n var props = {}\n var computedStyle = getComputedStyle(element, '')\n $.each(property, function(_, prop){\n props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop))\n })\n return props\n }\n }\n\n var css = ''\n if (type(property) == 'string') {\n if (!value && value !== 0)\n this.each(function(){ this.style.removeProperty(dasherize(property)) })\n else\n css = dasherize(property) + \":\" + maybeAddPx(property, value)\n } else {\n for (key in property)\n if (!property[key] && property[key] !== 0)\n this.each(function(){ this.style.removeProperty(dasherize(key)) })\n else\n css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'\n }\n\n return this.each(function(){ this.style.cssText += ';' + css })\n },\n index: function(element){\n return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0])\n },\n hasClass: function(name){\n if (!name) return false\n return emptyArray.some.call(this, function(el){\n return this.test(className(el))\n }, classRE(name))\n },\n addClass: function(name){\n if (!name) return this\n return this.each(function(idx){\n if (!('className' in this)) return\n classList = []\n var cls = className(this), newName = funcArg(this, name, idx, cls)\n newName.split(/\\s+/g).forEach(function(klass){\n if (!$(this).hasClass(klass)) classList.push(klass)\n }, this)\n classList.length && className(this, cls + (cls ? \" \" : \"\") + classList.join(\" \"))\n })\n },\n removeClass: function(name){\n return this.each(function(idx){\n if (!('className' in this)) return\n if (name === undefined) return className(this, '')\n classList = className(this)\n funcArg(this, name, idx, classList).split(/\\s+/g).forEach(function(klass){\n classList = classList.replace(classRE(klass), \" \")\n })\n className(this, classList.trim())\n })\n },\n toggleClass: function(name, when){\n if (!name) return this\n return this.each(function(idx){\n var $this = $(this), names = funcArg(this, name, idx, className(this))\n names.split(/\\s+/g).forEach(function(klass){\n (when === undefined ? !$this.hasClass(klass) : when) ?\n $this.addClass(klass) : $this.removeClass(klass)\n })\n })\n },\n scrollTop: function(value){\n if (!this.length) return\n var hasScrollTop = 'scrollTop' in this[0]\n if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset\n return this.each(hasScrollTop ?\n function(){ this.scrollTop = value } :\n function(){ this.scrollTo(this.scrollX, value) })\n },\n scrollLeft: function(value){\n if (!this.length) return\n var hasScrollLeft = 'scrollLeft' in this[0]\n if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset\n return this.each(hasScrollLeft ?\n function(){ this.scrollLeft = value } :\n function(){ this.scrollTo(value, this.scrollY) })\n },\n position: function() {\n if (!this.length) return\n\n var elem = this[0],\n // Get *real* offsetParent\n offsetParent = this.offsetParent(),\n // Get correct offsets\n offset = this.offset(),\n parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset()\n\n // Subtract element margins\n // note: when an element has margin: auto the offsetLeft and marginLeft\n // are the same in Safari causing offset.left to incorrectly be 0\n offset.top -= parseFloat( $(elem).css('margin-top') ) || 0\n offset.left -= parseFloat( $(elem).css('margin-left') ) || 0\n\n // Add offsetParent borders\n parentOffset.top += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0\n parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0\n\n // Subtract the two offsets\n return {\n top: offset.top - parentOffset.top,\n left: offset.left - parentOffset.left\n }\n },\n offsetParent: function() {\n return this.map(function(){\n var parent = this.offsetParent || document.body\n while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css(\"position\") == \"static\")\n parent = parent.offsetParent\n return parent\n })\n }\n }\n\n // for now\n $.fn.detach = $.fn.remove\n\n // Generate the `width` and `height` functions\n ;['width', 'height'].forEach(function(dimension){\n var dimensionProperty =\n dimension.replace(/./, function(m){ return m[0].toUpperCase() })\n\n $.fn[dimension] = function(value){\n var offset, el = this[0]\n if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] :\n isDocument(el) ? el.documentElement['scroll' + dimensionProperty] :\n (offset = this.offset()) && offset[dimension]\n else return this.each(function(idx){\n el = $(this)\n el.css(dimension, funcArg(this, value, idx, el[dimension]()))\n })\n }\n })\n\n function traverseNode(node, fun) {\n fun(node)\n for (var i = 0, len = node.childNodes.length; i < len; i++)\n traverseNode(node.childNodes[i], fun)\n }\n\n // Generate the `after`, `prepend`, `before`, `append`,\n // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.\n adjacencyOperators.forEach(function(operator, operatorIndex) {\n var inside = operatorIndex % 2 //=> prepend, append\n\n $.fn[operator] = function(){\n // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings\n var argType, nodes = $.map(arguments, function(arg) {\n var arr = []\n argType = type(arg)\n if (argType == \"array\") {\n arg.forEach(function(el) {\n if (el.nodeType !== undefined) return arr.push(el)\n else if ($.zepto.isZ(el)) return arr = arr.concat(el.get())\n arr = arr.concat(zepto.fragment(el))\n })\n return arr\n }\n return argType == \"object\" || arg == null ?\n arg : zepto.fragment(arg)\n }),\n parent, copyByClone = this.length > 1\n if (nodes.length < 1) return this\n\n return this.each(function(_, target){\n parent = inside ? target : target.parentNode\n\n // convert all methods to a \"before\" operation\n target = operatorIndex == 0 ? target.nextSibling :\n operatorIndex == 1 ? target.firstChild :\n operatorIndex == 2 ? target :\n null\n\n var parentInDocument = $.contains(document.documentElement, parent)\n\n nodes.forEach(function(node){\n if (copyByClone) node = node.cloneNode(true)\n else if (!parent) return $(node).remove()\n\n parent.insertBefore(node, target)\n if (parentInDocument) traverseNode(node, function(el){\n if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' &&\n (!el.type || el.type === 'text/javascript') && !el.src){\n var target = el.ownerDocument ? el.ownerDocument.defaultView : window\n target['eval'].call(target, el.innerHTML)\n }\n })\n })\n })\n }\n\n // after => insertAfter\n // prepend => prependTo\n // before => insertBefore\n // append => appendTo\n $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){\n $(html)[operator](this)\n return this\n }\n })\n\n zepto.Z.prototype = Z.prototype = $.fn\n\n // Export internal API functions in the `$.zepto` namespace\n zepto.uniq = uniq\n zepto.deserializeValue = deserializeValue\n $.zepto = zepto\n\n return $\n})()\n\nwindow.Zepto = Zepto\nwindow.$ === undefined && (window.$ = Zepto)\n\n;(function($){\n var _zid = 1, undefined,\n slice = Array.prototype.slice,\n isFunction = $.isFunction,\n isString = function(obj){ return typeof obj == 'string' },\n handlers = {},\n specialEvents={},\n focusinSupported = 'onfocusin' in window,\n focus = { focus: 'focusin', blur: 'focusout' },\n hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' }\n\n specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'\n\n function zid(element) {\n return element._zid || (element._zid = _zid++)\n }\n function findHandlers(element, event, fn, selector) {\n event = parse(event)\n if (event.ns) var matcher = matcherFor(event.ns)\n return (handlers[zid(element)] || []).filter(function(handler) {\n return handler\n && (!event.e || handler.e == event.e)\n && (!event.ns || matcher.test(handler.ns))\n && (!fn || zid(handler.fn) === zid(fn))\n && (!selector || handler.sel == selector)\n })\n }\n function parse(event) {\n var parts = ('' + event).split('.')\n return {e: parts[0], ns: parts.slice(1).sort().join(' ')}\n }\n function matcherFor(ns) {\n return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)')\n }\n\n function eventCapture(handler, captureSetting) {\n return handler.del &&\n (!focusinSupported && (handler.e in focus)) ||\n !!captureSetting\n }\n\n function realEvent(type) {\n return hover[type] || (focusinSupported && focus[type]) || type\n }\n\n function add(element, events, fn, data, selector, delegator, capture){\n var id = zid(element), set = (handlers[id] || (handlers[id] = []))\n events.split(/\\s/).forEach(function(event){\n if (event == 'ready') return $(document).ready(fn)\n var handler = parse(event)\n handler.fn = fn\n handler.sel = selector\n // emulate mouseenter, mouseleave\n if (handler.e in hover) fn = function(e){\n var related = e.relatedTarget\n if (!related || (related !== this && !$.contains(this, related)))\n return handler.fn.apply(this, arguments)\n }\n handler.del = delegator\n var callback = delegator || fn\n handler.proxy = function(e){\n e = compatible(e)\n if (e.isImmediatePropagationStopped()) return\n e.data = data\n var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args))\n if (result === false) e.preventDefault(), e.stopPropagation()\n return result\n }\n handler.i = set.length\n set.push(handler)\n if ('addEventListener' in element)\n element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))\n })\n }\n function remove(element, events, fn, selector, capture){\n var id = zid(element)\n ;(events || '').split(/\\s/).forEach(function(event){\n findHandlers(element, event, fn, selector).forEach(function(handler){\n delete handlers[id][handler.i]\n if ('removeEventListener' in element)\n element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))\n })\n })\n }\n\n $.event = { add: add, remove: remove }\n\n $.proxy = function(fn, context) {\n var args = (2 in arguments) && slice.call(arguments, 2)\n if (isFunction(fn)) {\n var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) }\n proxyFn._zid = zid(fn)\n return proxyFn\n } else if (isString(context)) {\n if (args) {\n args.unshift(fn[context], fn)\n return $.proxy.apply(null, args)\n } else {\n return $.proxy(fn[context], fn)\n }\n } else {\n throw new TypeError(\"expected function\")\n }\n }\n\n $.fn.bind = function(event, data, callback){\n return this.on(event, data, callback)\n }\n $.fn.unbind = function(event, callback){\n return this.off(event, callback)\n }\n $.fn.one = function(event, selector, data, callback){\n return this.on(event, selector, data, callback, 1)\n }\n\n var returnTrue = function(){return true},\n returnFalse = function(){return false},\n ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,\n eventMethods = {\n preventDefault: 'isDefaultPrevented',\n stopImmediatePropagation: 'isImmediatePropagationStopped',\n stopPropagation: 'isPropagationStopped'\n }\n\n function compatible(event, source) {\n if (source || !event.isDefaultPrevented) {\n source || (source = event)\n\n $.each(eventMethods, function(name, predicate) {\n var sourceMethod = source[name]\n event[name] = function(){\n this[predicate] = returnTrue\n return sourceMethod && sourceMethod.apply(source, arguments)\n }\n event[predicate] = returnFalse\n })\n\n event.timeStamp || (event.timeStamp = Date.now())\n\n if (source.defaultPrevented !== undefined ? source.defaultPrevented :\n 'returnValue' in source ? source.returnValue === false :\n source.getPreventDefault && source.getPreventDefault())\n event.isDefaultPrevented = returnTrue\n }\n return event\n }\n\n function createProxy(event) {\n var key, proxy = { originalEvent: event }\n for (key in event)\n if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key]\n\n return compatible(proxy, event)\n }\n\n $.fn.delegate = function(selector, event, callback){\n return this.on(event, selector, callback)\n }\n $.fn.undelegate = function(selector, event, callback){\n return this.off(event, selector, callback)\n }\n\n $.fn.live = function(event, callback){\n $(document.body).delegate(this.selector, event, callback)\n return this\n }\n $.fn.die = function(event, callback){\n $(document.body).undelegate(this.selector, event, callback)\n return this\n }\n\n $.fn.on = function(event, selector, data, callback, one){\n var autoRemove, delegator, $this = this\n if (event && !isString(event)) {\n $.each(event, function(type, fn){\n $this.on(type, selector, data, fn, one)\n })\n return $this\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false)\n callback = data, data = selector, selector = undefined\n if (callback === undefined || data === false)\n callback = data, data = undefined\n\n if (callback === false) callback = returnFalse\n\n return $this.each(function(_, element){\n if (one) autoRemove = function(e){\n remove(element, e.type, callback)\n return callback.apply(this, arguments)\n }\n\n if (selector) delegator = function(e){\n var evt, match = $(e.target).closest(selector, element).get(0)\n if (match && match !== element) {\n evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element})\n return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)))\n }\n }\n\n add(element, event, callback, data, selector, delegator || autoRemove)\n })\n }\n $.fn.off = function(event, selector, callback){\n var $this = this\n if (event && !isString(event)) {\n $.each(event, function(type, fn){\n $this.off(type, selector, fn)\n })\n return $this\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false)\n callback = selector, selector = undefined\n\n if (callback === false) callback = returnFalse\n\n return $this.each(function(){\n remove(this, event, callback, selector)\n })\n }\n\n $.fn.trigger = function(event, args){\n event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event)\n event._args = args\n return this.each(function(){\n // handle focus(), blur() by calling them directly\n if (event.type in focus && typeof this[event.type] == \"function\") this[event.type]()\n // items in the collection might not be DOM elements\n else if ('dispatchEvent' in this) this.dispatchEvent(event)\n else $(this).triggerHandler(event, args)\n })\n }\n\n // triggers event handlers on current element just as if an event occurred,\n // doesn't trigger an actual event, doesn't bubble\n $.fn.triggerHandler = function(event, args){\n var e, result\n this.each(function(i, element){\n e = createProxy(isString(event) ? $.Event(event) : event)\n e._args = args\n e.target = element\n $.each(findHandlers(element, event.type || event), function(i, handler){\n result = handler.proxy(e)\n if (e.isImmediatePropagationStopped()) return false\n })\n })\n return result\n }\n\n // shortcut methods for `.bind(event, fn)` for each event type\n ;('focusin focusout focus blur load resize scroll unload click dblclick '+\n 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+\n 'change select keydown keypress keyup error').split(' ').forEach(function(event) {\n $.fn[event] = function(callback) {\n return (0 in arguments) ?\n this.bind(event, callback) :\n this.trigger(event)\n }\n })\n\n $.Event = function(type, props) {\n if (!isString(type)) props = type, type = props.type\n var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true\n if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name])\n event.initEvent(type, bubbles, true)\n return compatible(event)\n }\n\n})(Zepto)\n\n;(function($){\n var jsonpID = +new Date(),\n document = window.document,\n key,\n name,\n rscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n scriptTypeRE = /^(?:text|application)\\/javascript/i,\n xmlTypeRE = /^(?:text|application)\\/xml/i,\n jsonType = 'application/json',\n htmlType = 'text/html',\n blankRE = /^\\s*$/,\n originAnchor = document.createElement('a')\n\n originAnchor.href = window.location.href\n\n // trigger a custom event and return false if it was cancelled\n function triggerAndReturn(context, eventName, data) {\n var event = $.Event(eventName)\n $(context).trigger(event, data)\n return !event.isDefaultPrevented()\n }\n\n // trigger an Ajax \"global\" event\n function triggerGlobal(settings, context, eventName, data) {\n if (settings.global) return triggerAndReturn(context || document, eventName, data)\n }\n\n // Number of active Ajax requests\n $.active = 0\n\n function ajaxStart(settings) {\n if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart')\n }\n function ajaxStop(settings) {\n if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop')\n }\n\n // triggers an extra global event \"ajaxBeforeSend\" that's like \"ajaxSend\" but cancelable\n function ajaxBeforeSend(xhr, settings) {\n var context = settings.context\n if (settings.beforeSend.call(context, xhr, settings) === false ||\n triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false)\n return false\n\n triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])\n }\n function ajaxSuccess(data, xhr, settings, deferred) {\n var context = settings.context, status = 'success'\n settings.success.call(context, data, status, xhr)\n if (deferred) deferred.resolveWith(context, [data, status, xhr])\n triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data])\n ajaxComplete(status, xhr, settings)\n }\n // type: \"timeout\", \"error\", \"abort\", \"parsererror\"\n function ajaxError(error, type, xhr, settings, deferred) {\n var context = settings.context\n settings.error.call(context, xhr, type, error)\n if (deferred) deferred.rejectWith(context, [xhr, type, error])\n triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type])\n ajaxComplete(type, xhr, settings)\n }\n // status: \"success\", \"notmodified\", \"error\", \"timeout\", \"abort\", \"parsererror\"\n function ajaxComplete(status, xhr, settings) {\n var context = settings.context\n settings.complete.call(context, xhr, status)\n triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings])\n ajaxStop(settings)\n }\n\n function ajaxDataFilter(data, type, settings) {\n if (settings.dataFilter == empty) return data\n var context = settings.context\n return settings.dataFilter.call(context, data, type)\n }\n\n // Empty function, used as default callback\n function empty() {}\n\n $.ajaxJSONP = function(options, deferred){\n if (!('type' in options)) return $.ajax(options)\n\n var _callbackName = options.jsonpCallback,\n callbackName = ($.isFunction(_callbackName) ?\n _callbackName() : _callbackName) || ('Zepto' + (jsonpID++)),\n script = document.createElement('script'),\n originalCallback = window[callbackName],\n responseData,\n abort = function(errorType) {\n $(script).triggerHandler('error', errorType || 'abort')\n },\n xhr = { abort: abort }, abortTimeout\n\n if (deferred) deferred.promise(xhr)\n\n $(script).on('load error', function(e, errorType){\n clearTimeout(abortTimeout)\n $(script).off().remove()\n\n if (e.type == 'error' || !responseData) {\n ajaxError(null, errorType || 'error', xhr, options, deferred)\n } else {\n ajaxSuccess(responseData[0], xhr, options, deferred)\n }\n\n window[callbackName] = originalCallback\n if (responseData && $.isFunction(originalCallback))\n originalCallback(responseData[0])\n\n originalCallback = responseData = undefined\n })\n\n if (ajaxBeforeSend(xhr, options) === false) {\n abort('abort')\n return xhr\n }\n\n window[callbackName] = function(){\n responseData = arguments\n }\n\n script.src = options.url.replace(/\\?(.+)=\\?/, '?$1=' + callbackName)\n document.head.appendChild(script)\n\n if (options.timeout > 0) abortTimeout = setTimeout(function(){\n abort('timeout')\n }, options.timeout)\n\n return xhr\n }\n\n $.ajaxSettings = {\n // Default type of request\n type: 'GET',\n // Callback that is executed before request\n beforeSend: empty,\n // Callback that is executed if the request succeeds\n success: empty,\n // Callback that is executed the the server drops error\n error: empty,\n // Callback that is executed on request complete (both: error and success)\n complete: empty,\n // The context for the callbacks\n context: null,\n // Whether to trigger \"global\" Ajax events\n global: true,\n // Transport\n xhr: function () {\n return new window.XMLHttpRequest()\n },\n // MIME types mapping\n // IIS returns Javascript as \"application/x-javascript\"\n accepts: {\n script: 'text/javascript, application/javascript, application/x-javascript',\n json: jsonType,\n xml: 'application/xml, text/xml',\n html: htmlType,\n text: 'text/plain'\n },\n // Whether the request is to another domain\n crossDomain: false,\n // Default timeout\n timeout: 0,\n // Whether data should be serialized to string\n processData: true,\n // Whether the browser should be allowed to cache GET responses\n cache: true,\n //Used to handle the raw response data of XMLHttpRequest.\n //This is a pre-filtering function to sanitize the response.\n //The sanitized response should be returned\n dataFilter: empty\n }\n\n function mimeToDataType(mime) {\n if (mime) mime = mime.split(';', 2)[0]\n return mime && ( mime == htmlType ? 'html' :\n mime == jsonType ? 'json' :\n scriptTypeRE.test(mime) ? 'script' :\n xmlTypeRE.test(mime) && 'xml' ) || 'text'\n }\n\n function appendQuery(url, query) {\n if (query == '') return url\n return (url + '&' + query).replace(/[&?]{1,2}/, '?')\n }\n\n // serialize payload and append it to the URL for GET requests\n function serializeData(options) {\n if (options.processData && options.data && $.type(options.data) != \"string\")\n options.data = $.param(options.data, options.traditional)\n if (options.data && (!options.type || options.type.toUpperCase() == 'GET' || 'jsonp' == options.dataType))\n options.url = appendQuery(options.url, options.data), options.data = undefined\n }\n\n $.ajax = function(options){\n var settings = $.extend({}, options || {}),\n deferred = $.Deferred && $.Deferred(),\n urlAnchor, hashIndex\n for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]\n\n ajaxStart(settings)\n\n if (!settings.crossDomain) {\n urlAnchor = document.createElement('a')\n urlAnchor.href = settings.url\n // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049\n urlAnchor.href = urlAnchor.href\n settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host)\n }\n\n if (!settings.url) settings.url = window.location.toString()\n if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex)\n serializeData(settings)\n\n var dataType = settings.dataType, hasPlaceholder = /\\?.+=\\?/.test(settings.url)\n if (hasPlaceholder) dataType = 'jsonp'\n\n if (settings.cache === false || (\n (!options || options.cache !== true) &&\n ('script' == dataType || 'jsonp' == dataType)\n ))\n settings.url = appendQuery(settings.url, '_=' + Date.now())\n\n if ('jsonp' == dataType) {\n if (!hasPlaceholder)\n settings.url = appendQuery(settings.url,\n settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?')\n return $.ajaxJSONP(settings, deferred)\n }\n\n var mime = settings.accepts[dataType],\n headers = { },\n setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] },\n protocol = /^([\\w-]+:)\\/\\//.test(settings.url) ? RegExp.$1 : window.location.protocol,\n xhr = settings.xhr(),\n nativeSetHeader = xhr.setRequestHeader,\n abortTimeout\n\n if (deferred) deferred.promise(xhr)\n\n if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest')\n setHeader('Accept', mime || '*/*')\n if (mime = settings.mimeType || mime) {\n if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0]\n xhr.overrideMimeType && xhr.overrideMimeType(mime)\n }\n if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET'))\n setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded')\n\n if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name])\n xhr.setRequestHeader = setHeader\n\n xhr.onreadystatechange = function(){\n if (xhr.readyState == 4) {\n xhr.onreadystatechange = empty\n clearTimeout(abortTimeout)\n var result, error = false\n if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) {\n dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'))\n\n if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob')\n result = xhr.response\n else {\n result = xhr.responseText\n\n try {\n // http://perfectionkills.com/global-eval-what-are-the-options/\n // sanitize response accordingly if data filter callback provided\n result = ajaxDataFilter(result, dataType, settings)\n if (dataType == 'script') (1,eval)(result)\n else if (dataType == 'xml') result = xhr.responseXML\n else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result)\n } catch (e) { error = e }\n\n if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred)\n }\n\n ajaxSuccess(result, xhr, settings, deferred)\n } else {\n ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred)\n }\n }\n }\n\n if (ajaxBeforeSend(xhr, settings) === false) {\n xhr.abort()\n ajaxError(null, 'abort', xhr, settings, deferred)\n return xhr\n }\n\n var async = 'async' in settings ? settings.async : true\n xhr.open(settings.type, settings.url, async, settings.username, settings.password)\n\n if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]\n\n for (name in headers) nativeSetHeader.apply(xhr, headers[name])\n\n if (settings.timeout > 0) abortTimeout = setTimeout(function(){\n xhr.onreadystatechange = empty\n xhr.abort()\n ajaxError(null, 'timeout', xhr, settings, deferred)\n }, settings.timeout)\n\n // avoid sending empty string (#319)\n xhr.send(settings.data ? settings.data : null)\n return xhr\n }\n\n // handle optional data/success arguments\n function parseArguments(url, data, success, dataType) {\n if ($.isFunction(data)) dataType = success, success = data, data = undefined\n if (!$.isFunction(success)) dataType = success, success = undefined\n return {\n url: url\n , data: data\n , success: success\n , dataType: dataType\n }\n }\n\n $.get = function(/* url, data, success, dataType */){\n return $.ajax(parseArguments.apply(null, arguments))\n }\n\n $.post = function(/* url, data, success, dataType */){\n var options = parseArguments.apply(null, arguments)\n options.type = 'POST'\n return $.ajax(options)\n }\n\n $.getJSON = function(/* url, data, success */){\n var options = parseArguments.apply(null, arguments)\n options.dataType = 'json'\n return $.ajax(options)\n }\n\n $.fn.load = function(url, data, success){\n if (!this.length) return this\n var self = this, parts = url.split(/\\s/), selector,\n options = parseArguments(url, data, success),\n callback = options.success\n if (parts.length > 1) options.url = parts[0], selector = parts[1]\n options.success = function(response){\n self.html(selector ?\n $('<div>').html(response.replace(rscript, \"\")).find(selector)\n : response)\n callback && callback.apply(self, arguments)\n }\n $.ajax(options)\n return this\n }\n\n var escape = encodeURIComponent\n\n function serialize(params, obj, traditional, scope){\n var type, array = $.isArray(obj), hash = $.isPlainObject(obj)\n $.each(obj, function(key, value) {\n type = $.type(value)\n if (scope) key = traditional ? scope :\n scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']'\n // handle data in serializeArray() format\n if (!scope && array) params.add(value.name, value.value)\n // recurse into nested objects\n else if (type == \"array\" || (!traditional && type == \"object\"))\n serialize(params, value, traditional, key)\n else params.add(key, value)\n })\n }\n\n $.param = function(obj, traditional){\n var params = []\n params.add = function(key, value) {\n if ($.isFunction(value)) value = value()\n if (value == null) value = \"\"\n this.push(escape(key) + '=' + escape(value))\n }\n serialize(params, obj, traditional)\n return params.join('&').replace(/%20/g, '+')\n }\n})(Zepto)\n\n;(function($){\n $.fn.serializeArray = function() {\n var name, type, result = [],\n add = function(value) {\n if (value.forEach) return value.forEach(add)\n result.push({ name: name, value: value })\n }\n if (this[0]) $.each(this[0].elements, function(_, field){\n type = field.type, name = field.name\n if (name && field.nodeName.toLowerCase() != 'fieldset' &&\n !field.disabled && type != 'submit' && type != 'reset' && type != 'button' && type != 'file' &&\n ((type != 'radio' && type != 'checkbox') || field.checked))\n add($(field).val())\n })\n return result\n }\n\n $.fn.serialize = function(){\n var result = []\n this.serializeArray().forEach(function(elm){\n result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value))\n })\n return result.join('&')\n }\n\n $.fn.submit = function(callback) {\n if (0 in arguments) this.bind('submit', callback)\n else if (this.length) {\n var event = $.Event('submit')\n this.eq(0).trigger(event)\n if (!event.isDefaultPrevented()) this.get(0).submit()\n }\n return this\n }\n\n})(Zepto)\n\n;(function(){\n // getComputedStyle shouldn't freak out when called\n // without a valid element as argument\n try {\n getComputedStyle(undefined)\n } catch(e) {\n var nativeGetComputedStyle = getComputedStyle\n window.getComputedStyle = function(element, pseudoElement){\n try {\n return nativeGetComputedStyle(element, pseudoElement)\n } catch(e) {\n return null\n }\n }\n }\n})()\n return Zepto\n}))\n"},function(){!function(e){e.expr={":":{}},e.support={},e.fn.clone=function(){var t=e();return this.each(function(){t.push(this.cloneNode(!0))}),t},["Left","Top"].forEach(function(t,n){function i(e){return function(e){return e&&"object"==g(e)&&"setInterval"in e}(e)?e:!(9!==e.nodeType)&&(e.defaultView||e.parentWindow)}var o="scroll"+t;e.fn[o]=function(t){var s,r;return void 0===t?(s=this[0])?(r=i(s))?"pageXOffset"in r?r[n?"pageYOffset":"pageXOffset"]:r.document.documentElement[o]||r.document.body[o]:s[o]:null:void this.each(function(){if(r=i(this)){var s=n?e(r).scrollLeft():t,a=n?t:e(r).scrollTop();r.scrollTo(s,a)}else this[o]=t})}}),["width","height"].forEach(function(t){var n=t.replace(/./,function(e){return e[0].toUpperCase()});e.fn["inner"+n]=function(e){var n=this;if(n){var i=n[t]();return{width:["left","right"],height:["top","bottom"]}[t].forEach(function(t){i+=parseInt(n.css("padding-"+t),10),e&&(i+=parseInt(n.css("margin-"+t),10))}),i}return null},e.fn["outer"+n]=function(e){var n=this;if(n){var i=n[t]();return{width:["left","right"],height:["top","bottom"]}[t].forEach(function(t){e&&(i+=parseInt(n.css("margin-"+t),10))}),i}return null}}),e.proxy=function(t,n){if("string"==typeof n){var i=t[n];n=t,t=i}if(e.isFunction(t)){var o=Array.prototype.slice.call(arguments,2),s=function(){return t.apply(n,o.concat(Array.prototype.slice.call(arguments)))};return s.guid=t.guid=t.guid||s.guid||e.guid++,s}};var t=String.prototype.trim;e.trim=function(e,n){return!n&&t?t.call(e):(n=defaultToWhiteSpace(n),e.replace(new RegExp("^["+n+"]+|["+n+"]+$","g"),""))};var n=/^(?:body|html)$/i;e.fn.position=function(){if(!this[0])return null;var t=this[0],i=this.offsetParent(),o=this.offset(),s=n.test(i[0].nodeName)?{top:0,left:0}:i.offset();return o.top-=parseFloat(e(t).css("margin-top"))||0,o.left-=parseFloat(e(t).css("margin-left"))||0,s.top+=parseFloat(e(i[0]).css("border-top-width"))||0,s.left+=parseFloat(e(i[0]).css("border-left-width"))||0,{top:o.top-s.top,left:o.left-s.left}},e.fn.offsetParent=function(){var t=e();return this.each(function(){for(var i=this.offsetParent||document.body;i&&!n.test(i.nodeName)&&"static"===e(i).css("position");)i=i.offsetParent;t.push(i)}),t}}(Zepto)}])},"object"==g(t)&&"object"==g(e)?e.exports=s():(i=[],void 0===(o="function"==typeof(n=s)?n.apply(t,i):n)||(e.exports=o))}).call(this,n(2)(e))},function(e,t,n){"use strict";n.r(t);var i=n(0),o=new(n.n(i).a)({settings:{showPopoutIcon:!1,showCloseIcon:!1},dimensions:{minItemHeight:40},content:[{type:"row",content:[{type:"column",width:40,content:[{type:"component",componentName:"template",title:"Game",componentState:{id:"client_wrapper"}}]},{type:"column",content:[{type:"row",height:65,content:[{type:"stack",content:[{type:"component",title:"Main",componentName:"template",componentState:{id:"mainmenu"}},{type:"component",title:"Log",componentName:"template",componentState:{id:"log"}}]},{type:"component",title:"Music",width:30,componentName:"template",componentState:{id:"music"}}]},{type:"row",content:[{type:"component",title:"Server chat",componentName:"template",componentState:{id:"ooc"}}]}]}]}]});o.registerComponent("template",function(e,t){var n=document.querySelector("#".concat(t.id));e.getElement().html(n.content)}),o.init()},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}}]);
//# sourceMappingURL=ui.b.js.map \ No newline at end of file
diff --git a/webAO/ui.b.js.map b/webAO/ui.b.js.map
index 3ff667b..11bd0ee 100644
--- a/webAO/ui.b.js.map
+++ b/webAO/ui.b.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///webpack:///webpack/universalModuleDefinition","webpack:///./webAO/ui.js","webpack:///(webpack)/buildin/module.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","self","e","Math","min","floor","max","configurable","$","zepto","touches","targetTouches","originalEvent","j","a","push","window","location","hash","match","RegExp","search","substr","split","length","b","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","setTimeout","g","Array","Error","indexOf","Function","apply","concat","slice","arguments","this","Date","now","getTime","f","random","toString","replace","k","trim","Int8Array","_typeof","_class","_classCallCheck","_mSubscriptions","on","h","fn","ctx","emit","unshift","unbind","splice","off","trigger","version","__e","_o$b","_this","_possibleConstructorReturn","_getPrototypeOf","config","_extendItemNode","type","contentItems","parent","isInitialised","isMaximised","isRoot","isRow","isColumn","isStack","isComponent","layoutManager","_pendingEventPropagations","_throttledEvents","_propagateEvent","_assertThisInitialized","content","_createContentItems","_inherits","_createClass","callDownwards","_$destroy","isClosable","removeChild","undisplayChild","_$init","_$normalizeContentItem","element","parentNode","replaceChild","header","tabs","contentItem","createPopout","emitBubblingEvent","preventDefault","_$minimiseItem","_$maximiseItem","selectedItem","selectItem","addClass","removeClass","title","id","hasId","getItemsByFilter","_$getItemsByProperty","instance","dropTargetIndicator","highlightArea","addChild","_callOnActiveComponents","hide","updateSize","show","getItemsByType","getActiveContentItem","container","remove","offset","width","height","x1","left","y1","top","x2","y2","surface","setSize","childElementContainer","append","createContentItem","isPropagationStopped","_scheduleEventPropagationToLayoutManager","origin","_propagateEventToLayoutManager","__g","round","_s$a","_this2","_splitterSize","dimensions","borderWidth","_splitterGrabSize","borderGrabWidth","_isColumn","_dimension","_splitter","_splitterPosition","_splitterMinPosition","_splitterMaxPosition","_createSplitter","after","_isDocked","before","_validateDocking","_calculateRelativeSizes","_setAbsoluteSizes","headerHeight","_docker","docked","size","itemSize","column","first","last","row","position","_","dimension","realSize","toggleClass","_header","dock","_calculateAbsoluteSizes","additionalPixel","itemSizes","totalWidth","totalHeight","_respectMinItemWidth","minItemWidth","_onSplitterDrag","_onSplitterDragStop","_onSplitterDragStart","_setDockable","_$setClosable","minWidth","minHeight","horizontal","vertical","_getItemsForSplitter","_getMinimumDimensions","css","_o$b2","_this3","_timeout","_eElement","_oDocument","document","_eBody","body","_nButtonCode","_nDelay","_nDistance","_nX","_nY","_nOriginalX","_nOriginalY","_bDragging","_fMove","onMouseMove","_fUp","onMouseUp","_fDown","onMouseDown","button","_getCoordinates","x","y","one","_startDrag","abs","clearTimeout","find","pageX","pageY","TypeError","_class2","_keys","_values","_nextLevel","parseInt","_o$a","_this4","_containerElement","tabDropPlaceholder","_$highlightDropZone","side","_a$a","_this5","_activeContentItem","settings","hasHeaders","popout","showPopoutIcon","labels","maximise","showMaximiseIcon","close","showCloseIcon","minimise","_dropZones","_dropSegment","_contentAreaDimensions","_dropIndex","_setupHeaderPosition","_$validateClosability","_sided","createTab","_$hide","activeItemIndex","setActiveContentItem","_$show","activeContentItem","removeTab","hideTab","_isClosable","_resetHeaderDropZone","hoverArea","_highlightHeaderDropZone","_highlightBodyDropZone","_$getArea","right","bottom","innerHeight","toggleMaximise","toggle","_side","keys","ceil","isNaN","F","G","u","S","P","B","W","v","_t","virtual","R","U","createElement","_class3","_reactComponent","_originalComponentWillUpdate","_container","_initialState","_reactClass","_getReactClass","_render","_destroy","ReactDOM","render","_getReactComponent","getElement","componentWillUpdate","_onUpdate","getState","setState","unmountComponentAtNode","_config","component","getComponent","glEventHub","eventHub","glContainer","extend","props","React","_o$b3","_this6","_layoutManager","_dontPropagateToParent","_childEventSource","_onEventFromThis","_boundOnEventFromChild","_onEventFromChild","isSubWindow","_propagateToParent","_propagateToChildren","__gl","__glArgs","createEvent","opener","initEvent","createEventObject","eventType","eventName","dispatchEvent","fireEvent","openPopouts","getGlInstance","_$onEventFromParent","_class4","_Error","_this7","message","node","_wrapNativeSuper","_o$b4","_this8","selectionEnabled","_onHeaderClick","tabsContainer","tabDropdownContainer","controlsContainer","_updateTabSizes","tabsMarkedForRemoval","closeButton","dockButton","tabDropdownButton","hideAdditionalTabsDropdown","_hideAdditionalTabsDropdown","mouseup","_lastVisibleTabIndex","_tabControlOffset","tabControlOffset","_createControls","setActive","reorderOnTabMenuClick","_canDestroy","_showAdditionalTabsDropdown","tabDropdown","_getHeaderSetting","_onPopoutClick","attr","popoutWholeStack","target","select","outerWidth","tabOverlapAllowance","tab","outerHeight","z-index","margin-left","_class5","titleElement","closeElement","isActive","setTitle","reorderEnabled","_dragListener","_onDragStart","destroy","_onTabClickFn","_onTabClick","_onCloseClickFn","_onCloseClick","_onCloseMousedown","html","stopPropagation","_o$b5","_a","_this9","_contentItem","_originalParent","_area","_lastValidArea","_onDrag","_onDrop","_undisplayTree","_$calculateItemAreas","_setDimensions","_minX","_minY","_maxX","_maxY","_width","_height","_setDropPosition","constrainDragToContainer","_updateTree","_$onDrop","_$setParent","dragProxyWidth","dragProxyHeight","_class6","_action","_o$a2","_this10","componentName","_a2","componentState","_element","_$setSize","shown","_$shown","_o$b6","_this11","isHidden","_contentElement","_s$b","_this12","_dimensions","_parentId","_indexInParent","_popoutWindow","_id","_createWindow","screenX","screenLeft","screenY","screenTop","toConfig","parentId","indexInParent","__glInstance","_$closeWindow","getWindow","root","getItemsById","_createUrl","_serializeWindowOptions","innerWidth","menubar","toolbar","personalbar","resizable","scrollbars","status","open","_positionWindow","_onClose","setInterval","_onInitialised","clearInterval","blockedPopoutsThrowError","join","minifyConfig","localStorage","setItem","href","moveTo","focus","popIn","D","w","ES6","_a$b","_this13","_isFullPage","_resizeTimeoutId","_components","lm-react-component","_itemAreas","_resizeFunction","_onResize","_unloadFunction","_onUnload","_maximisedItem","_maximisePlaceholder","_creationTimeoutPassed","_subWindowsCreated","_dragSources","_updatingColumnsResponsive","_firstLoad","_createConfig","transitionIndicator","_typeToItem","stack","unminifyConfig","_n","_$reconcilePopoutWindows","maximisedItemId","_createSubWindows","readyState","ready","init","_adjustToWindowMode","_setContainer","_create","_bindEvents","_adjustColumnsResponsive","forEach","_itemConfig","addId","deselect","prepend","removeId","Infinity","_getAllContentItems","_$createRootItemAreas","isPlainObject","closed","resize","getItem","JSON","parse","removeItem","popin","click","offsetHeight","margin","padding","overflow","closePopoutsOnUnload","_useResponsiveLayout","_findAllStackContainers","_addChildContentItemsToContainer","responsiveMode","_findAllStackContainersRecursive","default","propertyIsEnumerable","copyright","valueOf","writable","_c","style","display","appendChild","src","contentWindow","write","defineProperties","documentElement","_class7","_isVertical","_size","_grabSize","_createElement","stringify","_class8","_createDragListener","transitionElements","_class9","_class10","_toElement","_fromDimensions","_totalAnimationDuration","_animationStartTime","_measure","opacity","_nextAnimationFrame","minItemHeight","console","error","log","execScript","attachEvent","addEventListener","eval","expr",":","support","clone","each","cloneNode","nodeType","defaultView","parentWindow","scrollLeft","scrollTop","scrollTo","toUpperCase","proxy","isFunction","guid","String","defaultToWhiteSpace","offsetParent","test","nodeName","parseFloat","Zepto","__WEBPACK_AMD_DEFINE_ARRAY__","undefined","__WEBPACK_AMD_DEFINE_RESULT__","__WEBPACK_AMD_DEFINE_FACTORY__","__webpack_exports__","_golden_js_goldenlayout_js__WEBPACK_IMPORTED_MODULE_0__","golden","GoldenLayout","registerComponent","template","querySelector","webpackPolyfill","deprecate","paths","children"],"mappings":"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","file":"ui.b.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"GoldenLayout\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"GoldenLayout\"] = factory();\n\telse\n\t\troot[\"GoldenLayout\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","import GoldenLayout from \"./golden/js/goldenlayout.js\";\r\n\r\nvar config = {\r\n settings: {\r\n showPopoutIcon: false,\r\n showCloseIcon: false\r\n },\r\n dimensions: {\r\n minItemHeight: 40\r\n },\r\n content: [\r\n {\r\n type: \"row\",\r\n content: [\r\n {\r\n type: \"column\",\r\n width: 40,\r\n content: [\r\n {\r\n type: \"component\",\r\n componentName: \"template\",\r\n title: \"Game\",\r\n componentState: { id: \"client_wrapper\" }\r\n },\r\n {\r\n type: \"component\",\r\n title: \"Miscellaneous\",\r\n height: 5,\r\n componentName: \"template\",\r\n componentState: { id: \"misc\" }\r\n },\r\n ]\r\n },\r\n {\r\n type: \"column\",\r\n content: [\r\n {\r\n type: \"stack\",\r\n height: 60,\r\n content: [\r\n {\r\n type: \"component\",\r\n title: \"Server chat\",\r\n componentName: \"template\",\r\n componentState: { id: \"ooc\" }\r\n },\r\n {\r\n type: \"component\",\r\n title: \"Log\",\r\n componentName: \"template\",\r\n componentState: { id: \"log\" }\r\n }\r\n ]\r\n },\r\n {\r\n type: \"row\",\r\n content: [\r\n {\r\n type: \"component\",\r\n title: \"Music\",\r\n componentName: \"template\",\r\n componentState: { id: \"music\" }\r\n },\r\n {\r\n type: \"stack\",\r\n content: [\r\n {\r\n type: \"component\",\r\n title: \"Settings\",\r\n componentName: \"template\",\r\n componentState: { id: \"client_settings\" }\r\n },\r\n {\r\n type: \"component\",\r\n title: \"About\",\r\n componentName: \"template\",\r\n componentState: { id: \"about\" }\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n }]\r\n};\r\n\r\nvar golden = new GoldenLayout(config);\r\ngolden.registerComponent(\"template\", function(container, componentState) {\r\n let template = document.querySelector(`#${componentState.id}`);\r\n container.getElement().html(template.content);\r\n // TODO: support multiple locales\r\n // container.setTitle(document.querySelector(`#${componentState.id} meta[name='frame-title']`).getAttribute(\"content\"));\r\n});\r\ngolden.init();","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///webpack:///webpack/universalModuleDefinition","webpack:///./webAO/ui.js","webpack:///(webpack)/buildin/module.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","self","e","Math","min","floor","max","configurable","$","zepto","touches","targetTouches","originalEvent","j","a","push","window","location","hash","match","RegExp","search","substr","split","length","b","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","setTimeout","g","Array","Error","indexOf","Function","apply","concat","slice","arguments","this","Date","now","getTime","f","random","toString","replace","k","trim","Int8Array","_typeof","_class","_classCallCheck","_mSubscriptions","on","h","fn","ctx","emit","unshift","unbind","splice","off","trigger","version","__e","_o$b","_this","_possibleConstructorReturn","_getPrototypeOf","config","_extendItemNode","type","contentItems","parent","isInitialised","isMaximised","isRoot","isRow","isColumn","isStack","isComponent","layoutManager","_pendingEventPropagations","_throttledEvents","_propagateEvent","_assertThisInitialized","content","_createContentItems","_inherits","_createClass","callDownwards","_$destroy","isClosable","removeChild","undisplayChild","_$init","_$normalizeContentItem","element","parentNode","replaceChild","header","tabs","contentItem","createPopout","emitBubblingEvent","preventDefault","_$minimiseItem","_$maximiseItem","selectedItem","selectItem","addClass","removeClass","title","id","hasId","getItemsByFilter","_$getItemsByProperty","instance","dropTargetIndicator","highlightArea","addChild","_callOnActiveComponents","hide","updateSize","show","getItemsByType","getActiveContentItem","container","remove","offset","width","height","x1","left","y1","top","x2","y2","surface","setSize","childElementContainer","append","createContentItem","isPropagationStopped","_scheduleEventPropagationToLayoutManager","origin","_propagateEventToLayoutManager","__g","round","_s$a","_this2","_splitterSize","dimensions","borderWidth","_splitterGrabSize","borderGrabWidth","_isColumn","_dimension","_splitter","_splitterPosition","_splitterMinPosition","_splitterMaxPosition","_createSplitter","after","_isDocked","before","_validateDocking","_calculateRelativeSizes","_setAbsoluteSizes","headerHeight","_docker","docked","size","itemSize","column","first","last","row","position","_","dimension","realSize","toggleClass","_header","dock","_calculateAbsoluteSizes","additionalPixel","itemSizes","totalWidth","totalHeight","_respectMinItemWidth","minItemWidth","_onSplitterDrag","_onSplitterDragStop","_onSplitterDragStart","_setDockable","_$setClosable","minWidth","minHeight","horizontal","vertical","_getItemsForSplitter","_getMinimumDimensions","css","_o$b2","_this3","_timeout","_eElement","_oDocument","document","_eBody","body","_nButtonCode","_nDelay","_nDistance","_nX","_nY","_nOriginalX","_nOriginalY","_bDragging","_fMove","onMouseMove","_fUp","onMouseUp","_fDown","onMouseDown","button","_getCoordinates","x","y","one","_startDrag","abs","clearTimeout","find","pageX","pageY","TypeError","_class2","_keys","_values","_nextLevel","parseInt","_o$a","_this4","_containerElement","tabDropPlaceholder","_$highlightDropZone","side","_a$a","_this5","_activeContentItem","settings","hasHeaders","popout","showPopoutIcon","labels","maximise","showMaximiseIcon","close","showCloseIcon","minimise","_dropZones","_dropSegment","_contentAreaDimensions","_dropIndex","_setupHeaderPosition","_$validateClosability","_sided","createTab","_$hide","activeItemIndex","setActiveContentItem","_$show","activeContentItem","removeTab","hideTab","_isClosable","_resetHeaderDropZone","hoverArea","_highlightHeaderDropZone","_highlightBodyDropZone","_$getArea","right","bottom","innerHeight","toggleMaximise","toggle","_side","keys","ceil","isNaN","F","G","u","S","P","B","W","v","_t","virtual","R","U","createElement","_class3","_reactComponent","_originalComponentWillUpdate","_container","_initialState","_reactClass","_getReactClass","_render","_destroy","ReactDOM","render","_getReactComponent","getElement","componentWillUpdate","_onUpdate","getState","setState","unmountComponentAtNode","_config","component","getComponent","glEventHub","eventHub","glContainer","extend","props","React","_o$b3","_this6","_layoutManager","_dontPropagateToParent","_childEventSource","_onEventFromThis","_boundOnEventFromChild","_onEventFromChild","isSubWindow","_propagateToParent","_propagateToChildren","__gl","__glArgs","createEvent","opener","initEvent","createEventObject","eventType","eventName","dispatchEvent","fireEvent","openPopouts","getGlInstance","_$onEventFromParent","_class4","_Error","_this7","message","node","_wrapNativeSuper","_o$b4","_this8","selectionEnabled","_onHeaderClick","tabsContainer","tabDropdownContainer","controlsContainer","_updateTabSizes","tabsMarkedForRemoval","closeButton","dockButton","tabDropdownButton","hideAdditionalTabsDropdown","_hideAdditionalTabsDropdown","mouseup","_lastVisibleTabIndex","_tabControlOffset","tabControlOffset","_createControls","setActive","reorderOnTabMenuClick","_canDestroy","_showAdditionalTabsDropdown","tabDropdown","_getHeaderSetting","_onPopoutClick","attr","popoutWholeStack","target","select","outerWidth","tabOverlapAllowance","tab","outerHeight","z-index","margin-left","_class5","titleElement","closeElement","isActive","setTitle","reorderEnabled","_dragListener","_onDragStart","destroy","_onTabClickFn","_onTabClick","_onCloseClickFn","_onCloseClick","_onCloseMousedown","html","stopPropagation","_o$b5","_a","_this9","_contentItem","_originalParent","_area","_lastValidArea","_onDrag","_onDrop","_undisplayTree","_$calculateItemAreas","_setDimensions","_minX","_minY","_maxX","_maxY","_width","_height","_setDropPosition","constrainDragToContainer","_updateTree","_$onDrop","_$setParent","dragProxyWidth","dragProxyHeight","_class6","_action","_o$a2","_this10","componentName","_a2","componentState","_element","_$setSize","shown","_$shown","_o$b6","_this11","isHidden","_contentElement","_s$b","_this12","_dimensions","_parentId","_indexInParent","_popoutWindow","_id","_createWindow","screenX","screenLeft","screenY","screenTop","toConfig","parentId","indexInParent","__glInstance","_$closeWindow","getWindow","root","getItemsById","_createUrl","_serializeWindowOptions","innerWidth","menubar","toolbar","personalbar","resizable","scrollbars","status","open","_positionWindow","_onClose","setInterval","_onInitialised","clearInterval","blockedPopoutsThrowError","join","minifyConfig","localStorage","setItem","href","moveTo","focus","popIn","D","w","ES6","_a$b","_this13","_isFullPage","_resizeTimeoutId","_components","lm-react-component","_itemAreas","_resizeFunction","_onResize","_unloadFunction","_onUnload","_maximisedItem","_maximisePlaceholder","_creationTimeoutPassed","_subWindowsCreated","_dragSources","_updatingColumnsResponsive","_firstLoad","_createConfig","transitionIndicator","_typeToItem","stack","unminifyConfig","_n","_$reconcilePopoutWindows","maximisedItemId","_createSubWindows","readyState","ready","init","_adjustToWindowMode","_setContainer","_create","_bindEvents","_adjustColumnsResponsive","forEach","_itemConfig","addId","deselect","prepend","removeId","Infinity","_getAllContentItems","_$createRootItemAreas","isPlainObject","closed","resize","getItem","JSON","parse","removeItem","popin","click","offsetHeight","margin","padding","overflow","closePopoutsOnUnload","_useResponsiveLayout","_findAllStackContainers","_addChildContentItemsToContainer","responsiveMode","_findAllStackContainersRecursive","default","propertyIsEnumerable","copyright","valueOf","writable","_c","style","display","appendChild","src","contentWindow","write","defineProperties","documentElement","_class7","_isVertical","_size","_grabSize","_createElement","stringify","_class8","_createDragListener","transitionElements","_class9","_class10","_toElement","_fromDimensions","_totalAnimationDuration","_animationStartTime","_measure","opacity","_nextAnimationFrame","minItemHeight","console","error","log","execScript","attachEvent","addEventListener","eval","expr",":","support","clone","each","cloneNode","nodeType","defaultView","parentWindow","scrollLeft","scrollTop","scrollTo","toUpperCase","proxy","isFunction","guid","String","defaultToWhiteSpace","offsetParent","test","nodeName","parseFloat","Zepto","__WEBPACK_AMD_DEFINE_ARRAY__","undefined","__WEBPACK_AMD_DEFINE_RESULT__","__WEBPACK_AMD_DEFINE_FACTORY__","__webpack_exports__","_golden_js_goldenlayout_js__WEBPACK_IMPORTED_MODULE_0__","golden","GoldenLayout","registerComponent","template","querySelector","webpackPolyfill","deprecate","paths","children"],"mappings":"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","file":"ui.b.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"GoldenLayout\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"GoldenLayout\"] = factory();\n\telse\n\t\troot[\"GoldenLayout\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","/* eslint indent: [\"error\", 2] */\r\n\r\nimport GoldenLayout from \"./golden/js/goldenlayout.js\";\r\n\r\nvar config = {\r\n settings: {\r\n showPopoutIcon: false,\r\n showCloseIcon: false\r\n },\r\n dimensions: {\r\n minItemHeight: 40\r\n },\r\n content: [{\r\n type: \"row\",\r\n content: [{\r\n type: \"column\",\r\n width: 40,\r\n content: [{\r\n type: \"component\",\r\n componentName: \"template\",\r\n title: \"Game\",\r\n componentState: { id: \"client_wrapper\" }\r\n }]\r\n },\r\n {\r\n type: \"column\",\r\n content: [{\r\n type: \"row\",\r\n height: 65,\r\n content: [{\r\n type: \"stack\",\r\n content: [{\r\n type: \"component\",\r\n title: \"Main\",\r\n componentName: \"template\",\r\n componentState: { id: \"mainmenu\" }\r\n },\r\n {\r\n type: \"component\",\r\n title: \"Log\",\r\n componentName: \"template\",\r\n componentState: { id: \"log\" }\r\n }]\r\n },\r\n {\r\n type: \"component\",\r\n title: \"Music\",\r\n width: 30,\r\n componentName: \"template\",\r\n componentState: { id: \"music\" }\r\n }]\r\n },\r\n {\r\n type: \"row\",\r\n content: [{\r\n type: \"component\",\r\n title: \"Server chat\",\r\n componentName: \"template\",\r\n componentState: { id: \"ooc\" }\r\n }]\r\n }]\r\n }]\r\n }]\r\n};\r\n\r\nvar golden = new GoldenLayout(config);\r\ngolden.registerComponent(\"template\", function (container, componentState) {\r\n let template = document.querySelector(`#${componentState.id}`);\r\n container.getElement().html(template.content);\r\n // TODO: support multiple locales\r\n // container.setTitle(document.querySelector(`#${componentState.id} meta[name='frame-title']`).getAttribute(\"content\"));\r\n});\r\n\r\ngolden.init();","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/webAO/ui.js b/webAO/ui.js
index f5c3f3a..b44b425 100644
--- a/webAO/ui.js
+++ b/webAO/ui.js
@@ -1,96 +1,75 @@
-import GoldenLayout from "./golden/js/goldenlayout.js";
+/* eslint indent: ["error", 2] */
-var config = {
- settings: {
- showPopoutIcon: false,
- showCloseIcon: false
- },
- dimensions: {
- minItemHeight: 40
+// import GoldenLayout from "./golden/js/goldenlayout.js";
+import GoldenLayout from "golden-layout";
+
+const config = {
+ settings: {
+ showPopoutIcon: false,
+ showCloseIcon: false
+ },
+ dimensions: {
+ minItemHeight: 40
+ },
+ content: [{
+ type: "row",
+ content: [{
+ type: "column",
+ width: 40,
+ content: [{
+ type: "component",
+ componentName: "template",
+ title: "Game",
+ componentState: { id: "client_wrapper" }
+ }]
},
- content: [
{
+ type: "column",
+ content: [{
type: "row",
- content: [
- {
- type: "column",
- width: 40,
- content: [
- {
- type: "component",
- componentName: "template",
- title: "Game",
- componentState: { id: "client_wrapper" }
- },
- {
- type: "component",
- title: "Miscellaneous",
- height: 5,
- componentName: "template",
- componentState: { id: "misc" }
- },
- ]
- },
- {
- type: "column",
- content: [
- {
- type: "stack",
- height: 60,
- content: [
- {
- type: "component",
- title: "Server chat",
- componentName: "template",
- componentState: { id: "ooc" }
- },
- {
- type: "component",
- title: "Log",
- componentName: "template",
- componentState: { id: "log" }
- }
- ]
- },
- {
- type: "row",
- content: [
- {
- type: "component",
- title: "Music",
- componentName: "template",
- componentState: { id: "music" }
- },
- {
- type: "stack",
- content: [
- {
- type: "component",
- title: "Settings",
- componentName: "template",
- componentState: { id: "client_settings" }
- },
- {
- type: "component",
- title: "About",
- componentName: "template",
- componentState: { id: "about" }
- }
- ]
- }
- ]
- }
- ]
- }
- ]
+ height: 65,
+ content: [{
+ type: "stack",
+ content: [{
+ type: "component",
+ title: "Main",
+ componentName: "template",
+ componentState: { id: "mainmenu" }
+ },
+ {
+ type: "component",
+ title: "Log",
+ componentName: "template",
+ componentState: { id: "log" }
+ }]
+ },
+ {
+ type: "component",
+ title: "Music",
+ width: 30,
+ componentName: "template",
+ componentState: { id: "music" }
+ }]
+ },
+ {
+ type: "row",
+ content: [{
+ type: "component",
+ title: "Server chat",
+ componentName: "template",
+ componentState: { id: "ooc" }
+ }]
+ }]
}]
+ }]
};
-var golden = new GoldenLayout(config);
-golden.registerComponent("template", function(container, componentState) {
- let template = document.querySelector(`#${componentState.id}`);
- container.getElement().html(template.content);
- // TODO: support multiple locales
- // container.setTitle(document.querySelector(`#${componentState.id} meta[name='frame-title']`).getAttribute("content"));
+const golden = new GoldenLayout(config);
+golden.registerComponent("template", function (container, componentState) {
+ const template = document.querySelector(`#${componentState.id}`);
+ container.getElement().html(template.content);
+ // TODO: support multiple locales
+ // container.setTitle(document.querySelector(`#${componentState.id} meta[name='frame-title']`).getAttribute("content"));
});
+
golden.init(); \ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
index 8032471..78d68a1 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,9 +1,15 @@
+/* eslint-env node */
+
+const path = require('path');
+
module.exports = {
entry: {
ui: './webAO/ui.js',
- client: './webAO/client.js'
+ client: './webAO/client.js',
+ master: './webAO/master.js'
},
output: {
+ path: path.resolve(__dirname, 'webAO'),
filename: '[name].b.js'
},
module: {
@@ -14,7 +20,15 @@ module.exports = {
use: {
loader: 'babel-loader',
options: {
- presets: ['@babel/preset-env']
+ presets: [
+ [
+ '@babel/preset-env', {
+ useBuiltIns: 'usage',
+ targets: 'defaults',
+ corejs: 3
+ }
+ ]
+ ]
}
}
}
@@ -22,4 +36,4 @@ module.exports = {
},
devtool: 'source-map'
-} \ No newline at end of file
+}; \ No newline at end of file