From 1b91fd066d0bde0ba3a35770c339810b0b0878aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sun, 24 Sep 2017 21:02:33 +0200 Subject: [PATCH] Updated demo from current `work` --- about.html | 51 +- cfg_network.html | 19 +- cfg_system.html | 119 +- cfg_term.html | 205 +- cfg_wifi.html | 19 +- cfg_wifi_conn.html | 6 +- css/{app.6241b01.css => app.310033b.css} | 792 +----- css/app.css | 1 - css/app.css.map | 7 - css/app.d7551c3.css | 2810 --------------------- css/app.e3b21ad.css | 2811 ---------------------- help.html | 124 +- img/adapter.jpg.orig | Bin 18599 -> 0 bytes img/vt100.jpg.orig | Bin 18503 -> 0 bytes js/app.310033b.js | 2 + js/app.310033b.js.map | 1 + js/app.6241b01.js | 19 - js/app.6241b01.js.map | 1 - js/app.d7551c3.js | 19 - js/app.d7551c3.js.map | 1 - js/app.e3b21ad.js | 19 - js/app.e3b21ad.js.map | 1 - js/app.js | 17 - js/app.js.map | 1 - term.html | 46 +- 25 files changed, 375 insertions(+), 6716 deletions(-) rename css/{app.6241b01.css => app.310033b.css} (84%) delete mode 100644 css/app.css delete mode 100644 css/app.css.map delete mode 100644 css/app.d7551c3.css delete mode 100644 css/app.e3b21ad.css delete mode 100644 img/adapter.jpg.orig delete mode 100644 img/vt100.jpg.orig create mode 100644 js/app.310033b.js create mode 100644 js/app.310033b.js.map delete mode 100644 js/app.6241b01.js delete mode 100644 js/app.6241b01.js.map delete mode 100644 js/app.d7551c3.js delete mode 100644 js/app.d7551c3.js.map delete mode 100644 js/app.e3b21ad.js delete mode 100644 js/app.e3b21ad.js.map delete mode 100644 js/app.js delete mode 100644 js/app.js.map diff --git a/about.html b/about.html index c16463f..ef61898 100644 --- a/about.html +++ b/about.html @@ -3,10 +3,10 @@ - + About ESPTerm :: ESPTerm - - + + -
Loading…

About ESPTerm

@@ -55,12 +50,12 @@ - + - + @@ -77,7 +72,11 @@

Issues

- Please report any issues to the bugtracker or send them by e-mail (see above). + Please report any issues to our bugtracker or send them by e-mail. +

+

+ ESPTerm has a mailing list for + troubleshooting and release announcements.

Firmware updates can be downloaded from the releases page and flashed @@ -99,14 +98,26 @@

Thanks

-

- The webserver is based on a fork of the - esphttpd library by Jeroen Domburg (Sprite_tm). -

-

- Using (modified) JS library chibi.js by - Kyle Barrow as a lightweight jQuery alternative. -

+

…for making this project possible, in no particular order, go to:

+
    +
  • + Jeroen "SpriteTM" Domburg, for writing the esphttpd + server library we use (as a fork) +
  • +
  • + Kyle Barrow, for writing the chibi.js library + we use instead of jQuery +
  • +
  • + cpsdqs, for rewriting the front-end to use HTML5 canvas and other JS improvements +
  • +
  • + Guenter Honisch, for finding bugs and suggesting many improvements +
  • +
  • + doc. Jan Fischer, who came up with the original idea +
  • +
diff --git a/cfg_network.html b/cfg_network.html index 119a450..efa04ff 100644 --- a/cfg_network.html +++ b/cfg_network.html @@ -3,10 +3,10 @@ - + Network Settings :: ESPTerm - - + + -
Loading…

Network Settings

@@ -33,7 +28,7 @@
-
+

DHCP Client (Station)

@@ -62,11 +57,11 @@
-
+

DHCP Server (AP)

@@ -100,7 +95,7 @@
diff --git a/cfg_system.html b/cfg_system.html index 9420ab0..1be49ca 100644 --- a/cfg_system.html +++ b/cfg_system.html @@ -3,10 +3,10 @@ - + System Settings :: ESPTerm - - + + -
Loading…

System Settings

@@ -37,16 +32,15 @@
- ESPTerm contains two persistent memory banks, one for default and - one for active settings. Active settings can be stored as defaults - by the administrator (password required). + ESPTerm saves all settings in Flash. The active settings can be copied to + the "defaults area" and restored later using the blue button below.
- Reset active settings to defaults + Reset to saved defaults
@@ -61,70 +55,91 @@
-
-

Serial Port

+ +

Access Restrictions

+ +
+ + Some parts, or all of the web interface can be protected by a password prompt. + Leave the new password fields empty if you do not wish to change it. +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ Apply! +
+ + +
+

Change Admin Password

- This form controls the primary, communication UART. The debug UART is fixed at 115.200 baud, one stop-bit and no parity. + The "admin password" is used to manipulate the stored default settings + and to change access restrictions. This password is not saved as part + of the main config, i.e. using save / restore does not affect this + password. When the admin password is forgotten, the easiest way to + re-gain access is to wipe and re-flash the chip.
- - -  bps + +
- - + +
- - + +
diff --git a/cfg_term.html b/cfg_term.html index a95db47..96dc9fc 100644 --- a/cfg_term.html +++ b/cfg_term.html @@ -3,10 +3,10 @@ - + Terminal Settings :: ESPTerm - - + + -
Loading…

Terminal Settings

@@ -36,7 +31,7 @@ Reset screen & parser
-
+

Initial Settings

@@ -50,63 +45,66 @@
- 3031323334353637 + 3031323334353637
- 9091929394959697 + 9091929394959697
- 4041424344454647 + 4041424344454647
- 100101102103104105106107 + 100101102103104105106107
-
+
Default colors preview
@@ -131,22 +129,22 @@  
@@ -161,6 +159,12 @@
+
+ + +
+
  @@ -183,11 +187,66 @@
-
+ +

Serial Port

+ +
+ + This form controls the primary, communication UART. The debug UART is fixed + at 115.200 baud, one stop-bit and no parity. +
+ +
+ + +  bps +
+ +
+ + +
+ +
+ + +
+ +
+ Apply! +
+ + +

Expert Options

@@ -240,12 +299,6 @@
-
- - -
-
@@ -259,7 +312,7 @@
@@ -269,15 +322,15 @@ $('#cursor_shape').val(); $('#theme').val(0); + $('#uart_baud').val(115200); + $('#uart_parity').val(2); + $('#uart_stopbits').val(1); + function showColor() { var ex = qs('#color-example'); - ex.className = ''; - ex.classList.add('fg'+$('#default_fg').val()); - ex.classList.add('bg'+$('#default_bg').val()); - var th = $('#theme').val(); - $('.color-preview').forEach(function(e) { - e.className = 'Row color-preview theme-'+th; - }); + ex.dataset.fg = +$('#default_fg').val(); + ex.dataset.bg = +$('#default_bg').val(); + themes.themePreview(+$('#theme').val()) } showColor(); diff --git a/cfg_wifi.html b/cfg_wifi.html index 421e044..f157c7d 100644 --- a/cfg_wifi.html +++ b/cfg_wifi.html @@ -3,10 +3,10 @@ - + WiFi Settings :: ESPTerm - - + + -
Loading…

WiFi Settings

@@ -32,7 +27,7 @@ Validation errors for: 
-
+

Built-in Access Point

@@ -71,11 +66,11 @@
-
+

Join Existing Network

@@ -116,7 +111,7 @@
diff --git a/cfg_wifi_conn.html b/cfg_wifi_conn.html index 60d7d07..82a8b13 100644 --- a/cfg_wifi_conn.html +++ b/cfg_wifi_conn.html @@ -3,10 +3,10 @@ - + Connecting to Network :: ESPTerm - - + + + + -
Loading…

Quick Reference

@@ -474,9 +469,8 @@ stays unchanged.

-

Codepage 0

-
96`
97a
98b
99c
100d
101e
102f°
103g±
104h
105i
106j
107k
108l
109m
110n
111o
112p
113q
114r
115s
116t
117u
118v
119w
120x
121y
122z
123{π
124|
125}
126~·

Codepage 1

-
33!
34"
35#
36$
37%
38&
39'
40(
41)
42*
43+
44,
45-
46.
47/
480
491
502
513
524
535
546
557
568
579
58:
59;
60<
61=
62>
63?
64@
65A
66B
67C
68D
69E
70F
71G
72H
73I
74J
75K
76L
77M
78N
79O
80P
81Q
82R
83S
84T
85U
86V
87W
88X
89Y
90Z
91[
92\
93]
94^
95_
96`
97a
98b
99c
100d
101e
102f
103g
104h
105i
106j
107k
108l
109m
110n
111o
112p
113q
114rr
115ss
116tt
117uu
118vv
119ww
120xx
121yy
122zz
123{{
124||
125}
126~
+

Codepage !! ERROR: `../user/character_sets.h` not found !!

+
65A&

Switching commands

@@ -555,7 +549,7 @@ -

+

Commands: Color SGR

@@ -575,49 +569,49 @@

Foreground colors

- 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 + 3031323334353637
- 90 - 91 - 92 - 93 - 94 - 95 - 96 - 97 + 9091929394959697

Background colors

- 40 - 41 - 42 - 43 - 44 - 45 - 46 - 47 + 4041424344454647
- 100 - 101 - 102 - 103 - 104 - 105 - 106 - 107 + 100101102103104105106107

256-color palette

@@ -625,17 +619,44 @@

ESPTerm supports in total 256 standard colors. The dark and bright basic colors are numbered 0-7 and 8-15. To use colors higher than 15 (or 0-15 using this simpler numbering), - send CSI 38 ; 5 ; n m, where n is the color to set. Use 48 for background colors. + send CSI 38 ; 5 ; n m, where n is the color to set. Use CSI 48 ; 5 ; n m for background colors.

-

- For a fererence of all 256 shades please refer to - jonasjacek.github.io/colors - or look it up elsewhere. -

+
+
+ +

Commands: Cursor Functions

@@ -1070,6 +1091,9 @@ function hpfold(yes) { $('.fold').toggleClass('expanded', !!yes); } + + // show theme colors - but this is a static page, so we don't know the current theme. + themes.themePreview(1)
diff --git a/img/adapter.jpg.orig b/img/adapter.jpg.orig deleted file mode 100644 index ab6cfd39e73da089319da56e313b7fa5044567ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18599 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 diff --git a/img/vt100.jpg.orig b/img/vt100.jpg.orig deleted file mode 100644 index 909461afa7d6d3210eb1b8f378bf0a26ca79d87e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18503 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
    MS#bPer6nAqOM;aHvj%a~e!i>%@ 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 W>vTlJYXf_V^_BT}RYhHw6aU%So+knT diff --git a/js/app.310033b.js b/js/app.310033b.js new file mode 100644 index 0000000..db006ed --- /dev/null +++ b/js/app.310033b.js @@ -0,0 +1,2 @@ +!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},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=7)}([function(e,t,n){"use strict";t.mk=function(e){return document.createElement(e)},t.qs=function(e){return document.querySelector(e)},t.qsa=function(e){return document.querySelectorAll(e)},t.cr=function(e){return function(t){(10===t.which||13===t.which||32===t.which)&&e()}},t.bool=function(e){return 1===e||"1"===e||!0===e||"true"===e},t.parse2B=function(e){var t=1":">",'"':""","'":"'","/":"/","`":"`","=":"="};d.htmlEscape=function(e){return(e+"").replace(/[&<>"'`=\/]/g,function(e){return b[e]})},e.exports=d}()},function(e,t,n){"use strict";var r=n(1),i={},o=null;i.show=function(e,t){var n=r(e);n.removeClass("hidden visible"),setTimeout(function(){n.addClass("visible")},1),o=t},i.hide=function(e){var t=r(e);t.removeClass("visible"),setTimeout(function(){t.addClass("hidden"),o&&o()},500)},i.init=function(){r(".Modal").on("click",function(){r(this).hasClass("no-close")||i.hide(this)}),r(".Dialog").on("click",function(e){e.stopImmediatePropagation()}),r(window).on("keydown",function(e){27===e.which&&i.hide(".Modal")})},e.exports=i},function(e,t,n){"use strict";var r,i,o,s=n(1),a=n(2),c={},l=!1,u=function(){clearTimeout(i),clearTimeout(o)};c.show=function(e,t,n){r.toggleClass("error",!0===n),r.html(e),a.show(r),u(),(!t||0>=t)&&(t=2500),i=setTimeout(c.hide,t),l=!1,setTimeout(function(){l=!0},500)},c.hide=function(){var e=s("#notif");e.removeClass("visible"),o=setTimeout(function(){e.addClass("hidden")},250)},c.init=function(){r=s("#notif"),s(document).on("click",function(){l&&c.hide(this)}),r.on("click",function(e){return e.stopImmediatePropagation(),!1}),r.on("mouseenter",function(){u(),r.removeClass("hidden").addClass("visible")})},e.exports=c},function(e,t,n){"use strict";var r=t.themes=[["#111213","#CC0000","#4E9A06","#C4A000","#3465A4","#75507B","#06989A","#D3D7CF","#555753","#EF2929","#8AE234","#FCE94F","#729FCF","#AD7FA8","#34E2E2","#EEEEEC"],["#000000","#aa0000","#00aa00","#aa5500","#0000aa","#aa00aa","#00aaaa","#aaaaaa","#555555","#ff5555","#55ff55","#ffff55","#5555ff","#ff55ff","#55ffff","#ffffff"],["#000000","#cd0000","#00cd00","#cdcd00","#0000ee","#cd00cd","#00cdcd","#e5e5e5","#7f7f7f","#ff0000","#00ff00","#ffff00","#5c5cff","#ff00ff","#00ffff","#ffffff"],["#000000","#cd0000","#00cd00","#cdcd00","#0000cd","#cd00cd","#00cdcd","#faebd7","#404040","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"],["#2e3436","#cc0000","#4e9a06","#c4a000","#3465a4","#75507b","#06989a","#d3d7cf","#555753","#ef2929","#8ae234","#fce94f","#729fcf","#ad7fa8","#34e2e2","#eeeeec"],["#073642","#dc322f","#859900","#b58900","#268bd2","#d33682","#2aa198","#eee8d5","#002b36","#cb4b16","#586e75","#657b83","#839496","#6c71c4","#93a1a1","#fdf6e3"],["#073642","#dc322f","#859900","#b58900","#268bd2","#d33682","#2aa198","#eee8d5","#002b36","#cb4b16","#586e75","#657b83","#839496","#6c71c4","#93a1a1","#fdf6e3"],["#000000","#69001A","#117800","#769100","#1A00A6","#8019AB","#289E76","#A4A4A4","#484848","#C54E76","#6DD441","#D2ED46","#765BFF","#DC75FF","#84FAD2","#FFFFFF"],["#000000","#aa0000","#00aa00","#aaaa00","#0000aa","#aa00aa","#00aaaa","#aaaaaa","#000000","#ff0000","#00FF00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"],["#000000","#722640","#0E5940","#808080","#40337F","#E434FE","#1B9AFE","#BFB3FF","#404C00","#E46501","#1BCB01","#BFCC80","#808080","#F1A6BF","#8DD9BF","#ffffff"],["#000000","#8D3E37","#55A049","#AAB95D","#40318D","#80348B","#72C1C8","#D59F74","#8B5429","#B86962","#94E089","#FFFFB2","#8071CC","#AA5FB6","#87D6DD","#ffffff"]];t.fgbgThemes=[["#aaaaaa","#000000"],["#000000","#ffffdd"],["#000000","#ffffff"],["#ffffff","#000000"],["#00ff00","#000000"],["#e53c00","#000000"],["#ffffff","#300a24"],["#657b83","#fdf6e3"],["#839496","#002b36"]];var i=null;t.buildColorTable=function(){if(null!=i)return i;i=Array(16).fill("rgba(0, 0, 0, 0)");for(var e=0;6>e;e++)for(var t=0;6>t;t++)for(var n=0;6>n;n++){var r=40*e+(e?55:0),o=40*t+(t?55:0),s=40*n+(n?55:0);i.push("rgb("+r+", "+o+", "+s+")")}for(var a=0;24>a;a++){var c=10*a+8;i.push("rgb("+c+", "+c+", "+c+")")}return i},t.SELECTION_FG="#333",t.SELECTION_BG="#b2d7fe",t.themePreview=function(e){document.querySelectorAll("[data-fg]").forEach(function(t){var n=+t.dataset.fg;t.style.color=r[e][n]}),document.querySelectorAll("[data-bg]").forEach(function(t){var n=+t.dataset.bg;t.style.backgroundColor=r[e][n]})}},function(e,t){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function i(e){return"number"==typeof e}function o(e){return"object"==typeof e&&null!==e}function s(e){return void 0===e}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(e){if(!i(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},n.prototype.emit=function(e){var t,n,i,a,c,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var u=new Error('Uncaught, unspecified "error" event. ('+t+")");throw u.context=t,u}if(n=this._events[e],s(n))return!1;if(r(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),n.apply(this,a)}else if(o(n))for(a=Array.prototype.slice.call(arguments,1),l=n.slice(),i=l.length,c=0;c0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(e,t){function n(){this.removeListener(e,n),i||(i=!0,t.apply(this,arguments))}if(!r(t))throw TypeError("listener must be a function");var i=!1;return n.listener=t,this.on(e,n),this},n.prototype.removeListener=function(e,t){var n,i,s,a;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(n=this._events[e],s=n.length,i=-1,n===t||r(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(n)){for(a=s;a-- >0;)if(n[a]===t||n[a].listener&&n[a].listener===t){i=a;break}if(i<0)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},n.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(n=this._events[e],r(n))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},n.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},n.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},n.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=t)this.handler("move-cursor-"+("B">=t?"y":"x"),("B"===t||"C"===t?1:-1)*i);else if("E"===t||"F"===t)this.handler("move-cursor-line",("E"===t?1:-1)*i);else if("G"===t)this.handler("set-cursor-x",i-1);else if("J"===t){var o=r.length?r[0]:2;2===o&&this.handler("clear")}else if("P"===t)this.handler("delete",i);else if("@"===t)this.handler("insert-blanks",i);else if("q"===t)this.handler("set-cursor-style",i);else if("m"===t){if(!r.length||0===r[0])return void this.handler("reset-style");var s=r[0];if(1===s)this.handler("add-attrs",1);else if(2===s)this.handler("add-attrs",2);else if(3===s)this.handler("add-attrs",4);else if(4===s)this.handler("add-attrs",8);else if(5===s||6===s)this.handler("add-attrs",16);else if(7===s)this.handler("add-attrs",-1);else if(9===s)this.handler("add-attrs",64);else if(20===s)this.handler("add-attrs",32);else if(30<=s&&37>=s)this.handler("set-color-fg",s%10);else if(40<=s&&47>=s)this.handler("set-color-bg",s%10);else if(39===s)this.handler("reset-color-fg");else if(49===s)this.handler("reset-color-bg");else if(90<=s&&98>=s)this.handler("set-color-fg",s%10+8);else if(100<=s&&108>=s)this.handler("set-color-bg",s%10+8);else if((38===s||48===s)&&5===r[1]){var a=255&(0|r[2]);38===s&&this.handler("set-color-fg",a),48===s&&this.handler("set-color-bg",a)}}else("h"===t||"l"===t)&&"?25"===n&&("h"===t?this.handler("show-cursor"):"l"===t&&this.handler("hide-cursor"))}}},{key:"write",value:function(e){var t=!0,n=!1,r=void 0;try{for(var i,o=e.toString()[Symbol.iterator]();!(t=(i=o.next()).done);t=!0){var s=i.value,a=s.codePointAt(0);27===a?this.currentSequence=1:1===this.currentSequence&&"["===s?(this.currentSequence=2,this.sequence+="["):this.currentSequence&&s.match(/[\x40-\x7e]/)?(this.parseSequence(this.sequence+s),this.currentSequence=0,this.sequence=""):1a?this.handler("_null"):3===a?this.handler("sigint"):6>=a?this.handler("_null"):7===a?this.handler("bell"):8===a?this.handler("back"):9===a?this.handler("tab"):10===a?this.handler("new-line"):13===a?this.handler("return"):21===a?this.handler("delete-line"):23===a?this.handler("delete-word"):this.handler("write",s)}}catch(e){n=!0,r=e}finally{try{!t&&o.return&&o.return()}finally{if(n)throw r}}this.joinChunks||this.reset()}}]),e}(),m=function(e){var t=Math.PI,n=Math.floor,r=Math.sin;return 16+36*n(2.5*r(e)+2.5)+6*n(2.5*r(e+2/3*t)+2.5)+n(2.5*r(e+4/3*t)+2.5)},p=function(){function e(t){var n=this;s(this,e),this.width=80,this.height=25,this.termScreen=t,this.parser=new v(function(){return n.handleParsed.apply(n,arguments)}),this.reset(),this._lastLoad=Date.now(),this.termScreen.load(this.serialize()),window.showPage()}var t=Math.min,n=Math.max;return c(e,[{key:"reset",value:function(){this.style=0,this.cursor={x:0,y:0,style:1,visible:!0},this.trackMouse=!1,this.theme=-1,this.rainbow=!1,this.parser.reset(),this.clear()}},{key:"clear",value:function(){this.screen=[];for(var e=0;e=this.height&&this.scroll()}},{key:"writeChar",value:function(e){this.screen[this.cursor.y*this.width+this.cursor.x]=[e,this.style],++this.cursor.x>=this.width&&(this.cursor.x=0,this.newLine())}},{key:"moveBack",value:function(){for(var e=0--this.cursor.x&&(this.cursor.x=0=this.width&&(this.cursor.x=0,++this.cursor.y>=this.height&&this.scroll())}},{key:"deleteChar",value:function(){this.moveBack(),this.screen.splice((this.cursor.y+1)*this.width,0,[" ",0]),this.screen.splice(this.cursor.y*this.width+this.cursor.x,1)}},{key:"deleteForward",value:function(e){e=t(this.width,e);for(var n=0;nthis.cursor.x&&(this.cursor.x=0),0>this.cursor.y&&(this.cursor.y=0),this.cursor.x>this.width-1&&(this.cursor.x=this.width-1),this.cursor.y>this.height-1&&(this.cursor.y=this.height-1)}},{key:"handleParsed",value:function(e){"write"===e?this.writeChar(1>=arguments.length?void 0:arguments[1]):"delete"===e?this.deleteForward(1>=arguments.length?void 0:arguments[1]):"insert-blanks"===e?this.insertBlanks(1>=arguments.length?void 0:arguments[1]):"clear"===e?this.clear():"bell"===e?this.termScreen.load("B"):"back"===e?this.moveBack():"new-line"===e?this.newLine():"return"===e?this.cursor.x=0:"set-cursor"===e?(this.cursor.x=2>=arguments.length?void 0:arguments[2],this.cursor.y=1>=arguments.length?void 0:arguments[1],this.clampCursor()):"move-cursor-y"===e?(this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):"move-cursor-x"===e?(this.cursor.x+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):"move-cursor-line"===e?(this.cursor.x=0,this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):"set-cursor-x"===e?this.cursor.x=1>=arguments.length?void 0:arguments[1]:"set-cursor-style"===e?this.cursor.style=n(0,t(6,1>=arguments.length?void 0:arguments[1])):"reset-style"===e?this.style=0:"add-attrs"===e?this.style|=(1>=arguments.length?void 0:arguments[1])<<16:"set-color-fg"===e?this.style=16777216|4294967040&this.style|(1>=arguments.length?void 0:arguments[1]):"set-color-bg"===e?this.style=33554432|4294902015&this.style|(1>=arguments.length?void 0:arguments[1])<<8:"reset-color-fg"===e?this.style&=4294901504:"reset-color-bg"===e?this.style&=4294770943:"hide-cursor"===e?this.cursor.visible=!1:"show-cursor"===e&&(this.cursor.visible=!0)}},{key:"write",value:function(e){this.parser.write(e),this.scheduleLoad()}},{key:"serialize",value:function(){var e=String.fromCodePoint,t="S";t+=e(this.height+1)+e(this.width+1),t+=e(this.cursor.y+1)+e(this.cursor.x+1);var n=+this.cursor.visible;n|=96*+this.trackMouse,n|=384,n|=this.cursor.style<<9,t+=e(n+1);var r=null,i=0,o=!0,s=!1,a=void 0;try{for(var c,l=this.screen[Symbol.iterator]();!(o=(c=l.next()).done);o=!0){var u=c.value,h=u[1];if(this.rainbow){var f=i%this.width,d=Math.floor(i/this.width);h=16777216|4294705152&h|m((f+d)/10+Date.now()/1e3),i++}if(h!==r){var v=255&h,p=255&h>>8,w=65535&h>>16,y=v!=(255&r),g=p!=(255&r>>8),b=w!=(65535&r>>16);y&&g?t+=""+e(1+(65535&h)):y?t+=""+e(v+1):g&&(t+=""+e(p+1)),b&&(t+=""+e(w+1)),r=h}t+=u[0]}}catch(e){s=!0,a=e}finally{try{!o&&l.return&&l.return()}finally{if(s)throw a}}return t}},{key:"scheduleLoad",value:function(){var e=this;clearTimeout(this._scheduledLoad),this._lastLoadi;i++)n+=t[r][i]?"[38;5;"+m((i+r)/10)+"m"+t[r][i]:" ";this.emit("write","\r\n[?25l");var o=function(){e.emit("write",n.substr(0,80)),n=n.substr(80),n.length?setTimeout(o,50):(e.emit("write","\r\n[?25h"),e.destroy())};o()}}]),t}(w),"local-echo":function(e){function t(){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),c(t,[{key:"run",value:function(){for(var e=arguments.length,t=Array(e),n=0;nt[i].length&&(t[i]+=" ".repeat(79-t[i].length));this.emit("write","\r\n".repeat(t.length+1)),this.emit("write","".repeat(t.length)),this.emit("write","[?25l");var o=0,s=0,a=function(t,n){var r=Math.abs,i=t-o,a=n-s;e.emit("write","["+r(i)+(0++r?3<=++i?(setTimeout(o,20),i=0):o():(a(0,t.length),e.emit("write","[?25h"),n())};o()})}},{key:"printText",value:function(){var e=0e;e++)this.emit("write","["+(8>e?"3"+e:"9"+(e-8))+"m"),this.emit("write","foreground-color"[e]+" ");this.emit("write","\r\n ");for(var t=0;16>t;t++)this.emit("write","["+(8>t?"4"+t:"10"+(t-8))+"m ");this.emit("write","\r\n");for(var n=0;6>n;n++){this.emit("write"," ");for(var r=0;6>r;r++){for(var i=0;6>i;i++)this.emit("write","[48;5;"+(16+36*n+6*r+i)+"m ");this.emit("write","")}this.emit("write","\r\n")}this.emit("write"," ");for(var o=0;24>o;o++)this.emit("write","[48;5;"+(232+o)+"m ");this.emit("write","\r\n\n"),this.destroy()}}]),t}(w),ls:function(e){function t(){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),c(t,[{key:"run",value:function(){for(var e in this.emit("write","List of demo commands\r\n"),g)"string"!=typeof g[e]&&this.emit("write",e+"\r\n");this.destroy()}}]),t}(w),theme:function(e){function t(e){s(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return n.shell=e,n}return o(t,e),c(t,[{key:"run",value:function(){var e=0|+(0>=arguments.length?void 0:arguments[0]),t=d.length;return!arguments.length||!Number.isFinite(e)||0>e||e>=t?(this.emit("write","Usage: theme [0–"+(t-1)+"]\r\n"),void this.destroy()):(this.shell.terminal.theme=e,this.shell.terminal.termScreen.drawnScreenFG=[],this.emit("write",""),void this.destroy())}}]),t}(w),cursor:function(e){function t(){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),c(t,[{key:"run",value:function(){for(var e=arguments.length,t=Array(e),n=0;nt;t++){for(var n="",r=0;79>r;r++)n+=e[Math.floor(e.length*Math.random())];this.randomData.push(n)}this.scrollOffset=0,this.render()}},{key:"render",value:function(){this.emit("write",""),this.emit("write","Mouse Demo\r\nMouse movement, clicking and scrolling!");for(var e=0;23>e;e++){var t=e+this.scrollOffset;t=(t%this.randomData.length+this.randomData.length)%this.randomData.length;var n=this.randomData[t],r="["+(3+e)+";1H";for(var i in n)this.highlighted[80*(e+2)+ +i]&&(r+=""),r+=n[i],this.highlighted[80*(e+2)+ +i]&&(r+="");this.emit("write",r)}this.mouse&&this.emit("write","["+(this.mouse.y+1)+";"+(this.mouse.x+1)+"H")}},{key:"mouseMove",value:function(e,t){this.mouse={x:e,y:t},this.render()}},{key:"mouseDown",value:function(e,t,n){4===n?this.scrollOffset--:5===n?this.scrollOffset++:this.highlighted[80*t+e]=!this.highlighted[80*t+e],this.render()}},{key:"mouseUp",value:function(){}},{key:"destroy",value:function(){this.shell.terminal.write(""),this.shell.terminal.trackMouse=!1,y.mouseReceiver===this&&(y.mouseReceiver=null),a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"destroy",this).call(this)}}]),t}(w),sudo:function(e){function t(e){s(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return n.shell=e,n}return o(t,e),c(t,[{key:"run",value:function(){for(var e=this,t=arguments.length,n=Array(t),r=0;r\r\n"),this.destroy();else if(4===n.length&&"make me a sandwich"===n.join(" ").toLowerCase()){var i="",o="",s="",a="";this.emit("write"," _.---._\r\n _.-~ ~-._\r\n _.-~ ~-._\r\n _.-~ ~---._\r\n _.-~ ~\\\r\n .-~ _.;\r\n :-._ _.-~ ./\r\n `-._~-._ _..__.-~ _.-~\r\n "+s+"/ "+i+"~-._~-._ / .__..--"+s+"~-"+o+"---._\r\n"+s+" \\_____(_"+i+";-._\\. _.-~_/"+s+" ~)"+o+".. . \\\r\n"+o+" /(_____ "+i+"\\`--...--~_.-~"+s+"______..-+"+o+"_______)\r\n"+o+" .(_________/"+i+"`--...--~/"+o+" _/ "+a+" "+i+"/\\\r\n"+i+" /-._"+a+" \\_ "+o+"(___./_..-~"+a+"__....."+i+"__..-~./\r\n"+i+" `-._~-._"+a+" ~\\--------~ .-~"+i+"_..__.-~ _.-~\r\n"+i+" ~-._~-._ "+a+"~---------` "+i+"/ .__..--~\r\n"+i+" ~-._\\. _.-~_/\r\n"+i+" \\`--...--~_.-~\r\n"+i+" `--...--~\r\n"),this.destroy()}else{var c=n.shift();if(this.shell.index[c]){var l=this.shell.index[c];if(l instanceof Function){var u=new l(this),h=function(t){return e.emit("write",t)};u.on("write",h),u.on("exit",function(){u.removeListener("write",h),e.destroy()}),u.run.apply(u,n)}else this.emit("write",l),this.destroy()}else this.emit("write","sudo: "+c+": command not found\r\n"),this.destroy()}}}]),t}(w),make:function(e){function t(){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),c(t,[{key:"run",value:function(){for(var e=arguments.length,t=Array(e),n=0;n=arguments.length?void 0:arguments[1])+this.history[0].substr(this.cursorPos),this.cursorPos++;else if("back"===e)this.copyFromHistoryIndex(),this.history[0]=this.history[0].substr(0,this.cursorPos-1)+this.history[0].substr(this.cursorPos),0>--this.cursorPos&&(this.cursorPos=0);else if("tab"===e)console.warn("TAB not implemented");else if("move-cursor-x"===e)this.cursorPos=Math.max(0,Math.min(this.history[this.historyIndex].length,this.cursorPos+(1>=arguments.length?void 0:arguments[1])));else if("delete-line"===e)this.copyFromHistoryIndex(),this.history[0]="",this.cursorPos=0;else if("delete-word"===e){this.copyFromHistoryIndex();var t=this.history[0].substr(0,this.cursorPos).split(" ");t.pop(),this.history[0]=t.join(" ")+this.history[0].substr(this.cursorPos),this.cursorPos=t.join(" ").length}else"move-cursor-y"===e&&(this.historyIndex-=1>=arguments.length?void 0:arguments[1],0>this.historyIndex&&(this.historyIndex=0),this.historyIndex>=this.history.length&&(this.historyIndex=this.history.length-1),this.cursorPos=this.history[this.historyIndex].length);this.terminal.write(this.history[this.historyIndex]),this.terminal.write("\b".repeat(this.history[this.historyIndex].length)),this.terminal.moveForward(this.cursorPos),this.terminal.write(""),"return"===e&&(this.terminal.write("\r\n"),this.parse(this.history[this.historyIndex]))}},{key:"parse",value:function(e){"help"===e&&(e="info"),this.run(e)}},{key:"run",value:function(e){var t=[""],n=!1,r=!0,i=!1,o=void 0;try{for(var s,a=e.trim()[Symbol.iterator]();!(r=(s=a.next()).done);r=!0){var c=s.value;n&&c!==n?t[t.length-1]+=c:n?n=!1:'"'===c||"'"===c?n=c:c.match(/\s/)?t[t.length-1]&&t.push(""):t[t.length-1]+=c}}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}var l=t.shift();l in this.index?this.spawn(l,t):(this.terminal.write("demosh: Unknown command: "+l+"\r\n"),this.prompt(!1))}},{key:"spawn",value:function(e){var t=this,n=1c||1114111=c?i.push(c):(c-=65536,e=55296+(c>>10),r=c%1024+56320,i.push(e,r)),(o+1==s||i.length>16384)&&(a+=t.apply(null,i),i.length=0)}return a};e?e(String,"fromCodePoint",{value:r,configurable:!0,writable:!0}):String.fromCodePoint=r}()},function(e,t,n){"use strict";function r(){f=!0,i("#content").addClass("load")}var i=n(1),o=n(0),s=o.mk,a=o.qs,c=o.qsa,l=o.cr,u=n(2),h=n(3);i.ready(function(){function e(){i("#menu").toggleClass("expanded")}i("#brand").on("click",e).on("keypress",l(e)),i(".Row.checkbox").forEach(function(e){var t=e.querySelector("input"),n=e.querySelector(".box");i(n).toggleClass("checked",t.value);var r=function(){t.value=1-t.value,i(n).toggleClass("checked",t.value)};i(e).on("click",r).on("keypress",l(r))}),i(".Box.mobcol,.Box.fold").forEach(function(e){var t=e.querySelector("h2"),n=function(){i(e).toggleClass("expanded")};i(t).on("click",n).on("keypress",l(n))}),i("form").forEach(function(e){i(e).on("keypress",function(t){(10===t.keyCode||13===t.keyCode)&&t.ctrlKey&&e.submit()})}),setInterval(function(){i(".anim-dots").each(function(e){var t=i(e),n=t.html()+".";5===n.length&&(n="."),t.html(n)})},1e3),i("input[type=number]").on("mousewheel",function(e){var t=Number.isFinite,n=i(this),r=+n.val();isNaN(r)&&(r=1);var o=+(n.attr("step")||1),s=+n.attr("min"),a=+n.attr("max");if(0.',a("#screen").appendChild(e),r()}},2e3):setTimeout(function(){r()},1)})},function(e,t,n){"use strict";var r=n(1),i=n(0),o=i.mk,s=i.bool,a=n(11);!function(e){function t(e){return Math.round(e.value/e.max*100)+"%"}function n(e,t,n){r("#sta_ssid").val(e),r("#sta_password").val(t),r("#sta-nw").toggleClass("hidden",0===e.length),r("#sta-nw-nil").toggleClass("hidden",0'+e.rssi_perc+"
").htmlAppend('
'+l+"
").htmlAppend('
'+h[e.enc]+"
"),i.on("click",function(){var e=r(this),t=e.data("ssid"),i="";+e.data("pwd")&&!(i=window.prompt(a("wifi.enter_passwd").replace(":ssid:",t)))||(r("#sta_password").val(i),r("#sta_ssid").val(t),n(t,i,""))}),t.appendChild(s),c[0].appendChild(t)}})}}function c(){window._demo?i(window._demo_aps,200):r.get("http://"+window._root+"/cfg/wifi/scan",i)}function l(e){setTimeout(c,e)}var u,h=["Open","WEP","WPA","WPA2","WPA/WPA2"];e.init=function(e){r(".Row.range").forEach(function(e){var n=e.querySelector("input"),i=e.querySelector(".x-disp1"),o=e.querySelector(".x-disp2"),s=t(n);r(i).html(s),r(o).html(s),r(n).on("input",function(){s=t(n),r(i).html(s),r(o).html(s)})}),r("#forget-sta").on("click",function(){return n("","",""),!1}),n(e.sta_ssid,e.sta_password,e.sta_active_ip),u=e.sta_active_ssid},e.startScanning=function(){r("#ap-loader").removeClass("hidden"),r("#ap-scan").addClass("hidden"),r("#ap-loader .anim-dots").html("."),c()}}(window.WiFi={})},function(e,t,n){"use strict";var r={"wifi.connected_ip_is":"Connected, IP is ","wifi.not_conn":"Not connected.","wifi.enter_passwd":'Enter password for ":ssid:"'};e.exports=function(e){return r[e]||"?"+e+"?"}},function(e,t,n){"use strict";var r=n(0),i=r.qs,o=r.mk,s=n(3),a=n(13),c=n(16),l=n(17),u=n(18),h=n(19),f=n(20);e.exports=function(e){var t=new a,n=new c(t),r=l(n,t),d=u(n,r,t);t.input=r,r.termUpload=d;var v=-1;n.on("open",function(){v=setTimeout(function(){t.window.statusScreen={title:"Connecting",loading:!0}},250)}),n.on("connect",function(){clearTimeout(v),t.window.statusScreen={title:"Waiting for content",loading:!0}}),n.on("load",function(){t.window.statusScreen&&(t.window.statusScreen=null)}),n.on("disconnect",function(){clearTimeout(v),t.window.statusScreen={title:"Disconnected"},t.screen=[],t.screenFG=[],t.screenBG=[],t.screenAttrs=[]}),n.on("silence",function(){t.window.statusScreen={title:"Waiting for server",loading:!0}}),n.on("ping-success",function(){t.window.statusScreen={title:"Re-connecting",loading:!0}}),n.init(),r.init(e),d.init(),s.init(),window.onerror=function(e,t,n,r){return s.show("JS ERROR!
"+e+"
at "+t+":"+n+":"+r,1e4,!0),!1},i("#screen").appendChild(t.canvas),t.load(e.labels,e),h(t,r),f&&f(t);var m=!1,p=!1,w=function(){m?(t.window.fitIntoWidth=window.screen.width,t.window.fitIntoHeight=window.screen.height):(t.window.fitIntoWidth=p?window.innerWidth-20:0,t.window.fitIntoHeight=p?window.innerHeight:0)};w(),window.addEventListener("resize",w);var y=function(){p=!p;var e=i("#resize-button-icon");p?(e.classList.remove("icn-resize-small"),e.classList.add("icn-resize-full")):(e.classList.remove("icn-resize-full"),e.classList.add("icn-resize-small")),w()};if(i("#term-fit-screen").addEventListener("click",function(){return y(),!1}),window.Element.prototype.requestFullscreen||window.Element.prototype.webkitRequestFullscreen){setInterval(function(){m&&(window.innerWidth!==window.screen.width||window.innerHeight!==window.screen.height)&&(m=!1,w())},500);var g=o("a");g.href="#",g.addEventListener("click",function(e){e.preventDefault(),m=!0,w(),t.updateSize(),t.canvas.requestFullscreen?t.canvas.requestFullscreen():t.canvas.webkitRequestFullscreen()});var b=o("i");b.classList.add("icn-resize-full"),g.appendChild(b);var _=o("span");_.textContent="Fullscreen",g.appendChild(_),i("#term-nav").insertBefore(g,i("#term-nav").firstChild)}window.termScreen=t,window.conn=n,window.input=r,window.termUpl=d}},function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);tn[1]||t[1]===n[1]&&t[0]>n[0]){var r=[n,t];t=r[0],n=r[1]}return{start:t,end:n}}},{key:"isInSelection",value:function(e,t){var n=this.getNormalizedSelection(),r=n.start,i=n.end,o=r[0]<=e,s=eDate.now()-50)){if(this._lastBeep=Date.now(),!this._convolver){this._convolver=t.createConvolver();for(var n=.8*t.sampleRate,r=t.createBuffer(2,n,t.sampleRate),i=0;i>9;0>1,y=!(1&p);0==w?this.screen.cursor.style="block":1==w?this.screen.cursor.style="line":2==w&&(this.screen.cursor.style="bar"),this.screen.cursor.blinking!==y&&(this.screen.cursor.blinking=y,this.screen.renderer.resetCursorBlink()),this.screen.input.setMouseMode(v,m),this.screen.selection.selectable=!v&&!m,o(this.screen.canvas).toggleClass("selectable",this.screen.selection.selectable),this.screen.mouseMode={clicks:v,movement:m},o(".x-term-conf-btn").toggleClass("hidden",!(256&d)),o("#action-buttons").toggleClass("hidden",!(128&d)),this.screen.bracketedPaste=!!(8192&d),this.screen.reverseVideo=!!(16384&d);var g=7,b=0,_=0,k=0,C=" ",S=this.screen.window.width*this.screen.window.height;l&&(this.screen.updateSize(),this.screen.blinkingCellCount=0,this.screen.screen=Array(S).fill(" "),this.screen.screenFG=Array(S).fill(" "),this.screen.screenBG=Array(S).fill(" "),this.screen.screenAttrs=Array(S).fill(0));for(var x=function(){var e=_,n=256&_,r=512&_;0!=(16&e)&&(" "==C&&0==(200&e)||g==b&&n&&r)&&(e^=16),(16&t.screen.screenAttrs[k])!=(16&e)&&(16&e?t.screen.blinkingCellCount++:t.screen.blinkingCellCount--),t.screen.screen[k]=C,t.screen.screenFG[k]=g,t.screen.screenBG[k]=b,t.screen.screenAttrs[k]=e};nS));L++);break;case 3:A=r[n++].codePointAt(0)-1,g=255&A,b=255&A>>8;break;case 4:A=r[n++].codePointAt(0)-1,_=65535&A;break;case 5:A=r[n++].codePointAt(0)-1,g=255&A;break;case 6:A=r[n++].codePointAt(0)-1,b=255&A;break;default:32>E&&(T="�"),C=T,x(),k++}}this.screen.window.debug&&console.log("Blinky cells: "+this.screen.blinkingCellCount),this.screen.renderer.scheduleDraw("load",16),this.screen.emit("load")}},{key:"loadLabels",value:function(e){var t=e.split(""),n=t[0];a("#screen-title").textContent=n,0===n.length&&(n="Terminal"),a("title").textContent=n+" :: ESPTerm",o("#action-buttons button").forEach(function(e,n){var r=t[n+1].trim();e.innerHTML=r?o.htmlEscape(r):" ",e.style.opacity=r?1:.2})}},{key:"load",value:function(e){var t=1e&&e in this.palette)return this.palette[e];if(-1===e)return c;if(-2===e)return l;if(15e)return this.colorTable256[e];if(255>16)+", "+(255&e>>8)+", "+(255&e)+")"}return 0==Date.now()/1e3%2?"#f0f":"#0f0"}},{key:"resetCursorBlink",value:function(){var e=this;this.cursorBlinkOn=!0,clearInterval(this.cursorBlinkInterval),this.cursorBlinkInterval=setInterval(function(){e.cursorBlinkOn=!e.screen.cursor.blinking||!e.cursorBlinkOn,e.screen.cursor.blinking&&e.scheduleDraw("cursor-blink")},500)}},{key:"resetBlink",value:function(){var e=this;this.blinkStyleOn=!0,clearInterval(this.blinkInterval);var t=0;this.blinkInterval=setInterval(function(){0>=e.screen.blinkingCellCount||(t++,4<=t&&e.blinkStyleOn?(e.blinkStyleOn=!1,t=0,e.scheduleDraw("blink-style")):1<=t&&!e.blinkStyleOn&&(e.blinkStyleOn=!0,t=0,e.scheduleDraw("blink-style")))},200)}},{key:"drawBackground",value:function(e){var t=e.x,n=e.y,r=e.cellWidth,i=e.cellHeight,o=e.bg,s=this.ctx;s.fillStyle=this.getColor(o),s.clearRect(t*r,n*i,r,i),s.fillRect(t*r,n*i,r,i)}},{key:"drawCharacter",value:function(t){var n=Math.round,r=t.x,i=t.y,o=t.charSize,s=t.cellWidth,a=t.cellHeight,c=t.text,l=t.fg,u=t.attrs;if(c){var h=this.ctx,f=!1,d=!1,v=!1;2&u&&(h.globalAlpha=.5),8&u&&(f=!0),32&u&&(c=e.alphaToFraktur(c)),64&u&&(d=!0),128&u&&(v=!0),h.fillStyle=this.getColor(l);var m=c.codePointAt(0);if(9600<=m&&9631>=m){h.beginPath();var p=r*s,w=i*a,y=s,g=a,b=s/2,_=a/2;if(9600===m)h.rect(p,w,y,_);else if(9608>=m){var k=(1-(m-9600)/8)*g;h.rect(p,w+k,y,g-k)}else if(9615>=m)h.rect(p,w,y-(m-9608)/8*y,g);else if(9616===m)h.rect(p+b,w,b,g);else if(9619>=m){var C,S,x;9617===m?(C=y/4,S=g/10,x=1):9618===m?(C=y/6,S=y/10,x=1):9619===m&&(C=y/4,S=y/7,x=2);for(var T=!1,E=0;E=u+.05},L=!0,F=!1,O=void 0;try{for(var D,B=d.keys()[Symbol.iterator]();!(L=(D=B.next()).done);L=!0){var N=D.value;!function(e){var n=d.get(e)||A.get(e)||!1,r=t.screen.screen[e],i=P(r),o=i?2:1;if(!n){var s=!1,a=!0,c=!1,l=void 0;try{for(var u,h=t.getAdjacentCells(e,o)[Symbol.iterator]();!(a=(u=h.next()).done);a=!0){var f=u.value;if(d.get(f)&&(2>t.screen.window.graphics||i||P(t.screen.screen[f]))){s=!0;break}}}catch(e){c=!0,l=e}finally{try{!a&&h.return&&h.return()}finally{if(c)throw l}}s&&(n=!0)}A.set(e,n)}(N)}}catch(e){F=!0,O=e}finally{try{!L&&B.return&&B.return()}finally{if(F)throw O}}if(1<=this.screen.window.graphics){var M=this.screen.window.debug&&this.screen._debug;n.save(),n.beginPath();for(var I=0;Ih;h++){t.rotate(Math.PI/6);var f=(12*u-h)%12;t.globalAlpha=Math.max(.2,1-f/3),t.beginPath(),t.moveTo(0,15),t.lineTo(0,30),t.stroke()}t.restore()}}},{key:"startDrawLoop",value:function(){if(!this._drawTimerThread){var e=Math.random().toString(36);this._drawTimerThread=e,this.drawTimerLoop(e)}}},{key:"stopDrawLoop",value:function(){this._drawTimerThread=null}},{key:"drawTimerLoop",value:function(e){var t=this;e&&e===this._drawTimerThread&&(window.requestAnimationFrame(function(){return t.drawTimerLoop(e)}),this.draw("draw-loop"))}},{key:"palette",get:function(){return this._palette||s[0]},set:function(e){this._palette!==e&&(this._palette=e,this.resetDrawn(),this.scheduleDraw("palette"))}}],[{key:"alphaToFraktur",value:function(e){var t=String.fromCodePoint;return"a"<=e&&"z">=e?e=t(119997+e.charCodeAt(0)):"A"<=e&&"Z">=e&&(e=u[e]||t(120003+e.charCodeAt(0))),e}}]),e}()},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var s,a=function(){function e(e,t){for(var n=0;ne.code&&console.error("Bad code from socket!"),clearTimeout(this.reconnTimeout),this.reconnTimeout=setTimeout(function(){return t.init()},2e3),void this.emit("disconnect",e.code))}},{key:"onWSMessage",value:function(e){var t=this;try{switch(e.data.charAt(0)){case".":break;case"-":this.xoff=!0,this.autoXoffTimeout=setTimeout(function(){t.xoff=!1},250);break;case"+":this.xoff=!1,clearTimeout(this.autoXoffTimeout);break;default:this.emit("load"),this.screen.load(e.data),this.pageShown||(window.showPage(),this.pageShown=!0)}this.heartbeat()}catch(e){console.error(e)}}},{key:"canSend",value:function(){return!this.xoff}},{key:"send",value:function(e){return window._demo?(void 0===window.demoInterface?console.log("TX: "+JSON.stringify(e)):s.input(e),!0):this.xoff?(console.log("Can't send, flood control."),!1):!!this.ws&&(1===this.ws.readyState?("string"!=typeof e&&(e=JSON.stringify(e)),this.ws.send(e),!0):(console.error("Socket not ready"),!1))}},{key:"closeSocket",value:function(){this.ws&&(this.forceClosing=!0,this.ws.close(),this.ws=null)}},{key:"init",value:function(){var e=this;return window._demo?void(void 0===window.demoInterface?window.alert("Demoing non-demo build!"):s.init(this.screen)):(clearTimeout(this.reconnTimeout),clearTimeout(this.heartbeatTimeout),this.closeSocket(),this.ws=new window.WebSocket("ws://"+window._root+"/term/update.ws"),this.ws.addEventListener("open",function(){return e.onWSOpen.apply(e,arguments)}),this.ws.addEventListener("close",function(){return e.onWSClose.apply(e,arguments)}),this.ws.addEventListener("message",function(){return e.onWSMessage.apply(e,arguments)}),console.log("Opening socket."),this.heartbeat(),void this.emit("open"))}},{key:"heartbeat",value:function(){var e=this;clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(function(){return e.onHeartbeatFail()},2e3)}},{key:"onHeartbeatFail",value:function(){var e=this;this.closeSocket(),this.emit("silence"),console.error("Heartbeat lost, probing server..."),clearInterval(this.pingInterval),this.pingInterval=setInterval(function(){console.log("> ping"),e.emit("ping"),l.get("http://"+window._root+"/system/ping",function(t,n){200===n?(clearInterval(e.pingInterval),console.info("Server ready, opening socket…"),e.emit("ping-success"),e.init()):e.emit("ping-fail",n)},{timeout:100,loader:!1})},1e3)}}]),t}(c)},function(e,t,n){"use strict";var r=n(1),i=n(0),o=i.encode2B;e.exports=function(e,t){function n(t){return e.send("s"+t)}function i(t){e.send("b"+l(t))}function s(e){var r=e.allFn;window.addEventListener("keypress",function(e){if(_()&&!e.ctrlKey&&!e.metaKey){var t="";e.key&&1===e.key.length?t=e.key:e.which&&229!==e.which&&(t=String.fromCodePoint(e.which)),0",63:"?",64:"@",91:"Meta",92:"Meta",93:"ContextMenu",106:"Numpad*",107:"Numpad+",109:"Numpad-",110:"Numpad.",111:"Numpad/",144:"NumLock",145:"ScrollLock",160:"^",161:"!",162:'"',163:"#",164:"$",165:"%",166:"&",167:"_",168:"(",169:")",170:"*",171:"+",172:"|",173:"-",174:"{",175:"}",176:"~",186:";",187:"=",188:"Numpad,",189:"-",190:"Numpad,",192:"`",194:"Numpad,",219:"[",220:"\\",221:"]",222:"'",224:"Meta"},h=48;57>=h;h++)u[h]=l(h);for(var f=65;90>=f;f++)u[f]=l(f);for(var d=112;131>=d;d++)u[d]="F"+(d-112+1);for(var v=96;105>=v;v++)u[v]="Numpad"+(v-96);for(var m={np_alt:!1,cu_alt:!1,fn_alt:!1,mt_click:!1,mt_move:!1,no_keys:!1,crlf_mode:!1,all_fn:!1},p=function(e,t){return m.fn_alt?e:t},w=function(e,t){return m.cu_alt?e:t},y=function(e,t){return m.np_alt?e:t},g={Backspace:"\b",Tab:"\t",Enter:function(){return m.crlf_mode?"\r\n":"\r"},"Control+Enter":"\n",Escape:"",ArrowUp:function(){return w("OA","")},ArrowDown:function(){return w("OB","")},ArrowRight:function(){return w("OC","")},ArrowLeft:function(){return w("OD","")},Home:function(){return w("OH",p("","[1~"))},Insert:"[2~",Delete:"[3~",End:function(){return w("OF",p("","[4~"))},PageUp:"[5~",PageDown:"[6~",F1:function(){return p("OP","[11~")},F2:function(){return p("OQ","[12~")},F3:function(){return p("OR","[13~")},F4:function(){return p("OS","[14~")},F5:"[15~",F6:"[17~",F7:"[18~",F8:"[19~",F9:"[20~",F10:"[21~",F11:"[23~",F12:"[24~","Shift+F1":function(){return p("O1;2P","[25~")},"Shift+F2":function(){return p("O1;2Q","[26~")},"Shift+F3":function(){return p("O1;2R","[28~")},"Shift+F4":function(){return p("O1;2S","[29~")},"Shift+F5":function(){return p("[15;2~","[31~")},"Shift+F6":function(){return p("[17;2~","[32~")},"Shift+F7":function(){return p("[18;2~","[33~")},"Shift+F8":function(){return p("[19;2~","[34~")},"Shift+F9":function(){return p("[20;2~","[35~")},"Shift+F10":function(){return p("[21;2~","[36~")},"Shift+F11":function(){return p("[22;2~","[37~")},"Shift+F12":function(){return p("[23;2~","[38~")},Numpad0:function(){return y("Op","0")},Numpad1:function(){return y("Oq","1")},Numpad2:function(){return y("Or","2")},Numpad3:function(){return y("Os","3")},Numpad4:function(){return y("Ot","4")},Numpad5:function(){return y("Ou","5")},Numpad6:function(){return y("Ov","6")},Numpad7:function(){return y("Ow","7")},Numpad8:function(){return y("Ox","8")},Numpad9:function(){return y("Oy","9")},"Numpad*":function(){return y("OR","*")},"Numpad+":function(){return y("Ol","+")},"Numpad-":function(){return y("OS","-")},"Numpad.":function(){return y("On",".")},"Numpad/":function(){return y("OQ","/")},"Control+]":"","Control+\\":"","Control+[":"","Control+^":"","Control+_":"","Control+ArrowLeft":"[1;5D","Control+ArrowRight":"[1;5C","Control+ArrowUp":"[1;5A","Control+ArrowDown":"[1;5B","Control+Home":"[1;5H","Control+End":"[1;5F","Shift+ArrowLeft":"[1;2D","Shift+ArrowRight":"[1;2C","Shift+ArrowUp":"[1;2A","Shift+ArrowDown":"[1;2B","Shift+Home":"[1;2H","Shift+End":"[1;2F","Alt+ArrowLeft":"b","Alt+ArrowRight":"f","Meta+ArrowLeft":"","Meta+ArrowRight":"","Alt+Backspace":"","Meta+Backspace":"","Control+Shift+C":function(){t.copySelectionToClipboard()},"Control+Insert":function(){t.copySelectionToClipboard()},"Control+F12":function(){t.window.debug^=1}},b=1;26>=b;b++)g["Control+"+l(64+b)]=l(b);var _=function(){return!(m.no_keys||document.activeElement instanceof window.HTMLTextAreaElement)},k=["F5","F11","F12","Shift+F5"],C=function(e){if(_()&&!m.no_keys){var t=[];e.altKey&&t.push("Alt"),e.ctrlKey&&t.push("Control"),e.metaKey&&t.push("Meta"),e.shiftKey&&t.push("Shift");var r=u[e.which]||e.key;if(!e.ctrlKey&&!e.metaKey||"V"!==r){var i=null;for(var o in g){var s=o.split("+");if(s.pop()===r&&s.sort().join()===t.join()){if(k.includes(o)&&!m.all_fn)continue;i=g[o];break}}i&&(i instanceof Function&&(i=i()),e.preventDefault(),"string"==typeof i&&n(i))}}},S=0,x=0,T=0,E=0;return window.addEventListener("keydown",function(e){e.ctrlKey&&(E|=1),e.shiftKey&&(E|=2),e.altKey&&(E|=4),e.metaKey&&(E|=8)}),window.addEventListener("keyup",function(e){E=0,e.ctrlKey&&(E|=1),e.shiftKey&&(E|=2),e.altKey&&(E|=4),e.metaKey&&(E|=8)}),c={init:function(e){s(e),r("#action-buttons button").forEach(function(e){e.addEventListener("click",function(){i(+this.dataset.n)})}),window.addEventListener("mousedown",function(e){0===e.button&&(S=1),1===e.button&&(x=1),2===e.button&&(T=1)}),window.addEventListener("mouseup",function(e){0===e.button&&(S=0),1===e.button&&(x=0),2===e.button&&(T=0)})},sendString:n,setAlts:function(e,t,n,r){(m.cu_alt!==e||m.np_alt!==t||m.fn_alt!==n||m.crlf_mode!==r)&&(m.cu_alt=e,m.np_alt=t,m.fn_alt=n,m.crlf_mode=r)},setMouseMode:function(e,t){m.mt_click=e,m.mt_move=t},onMouseMove:function(t,n){if(m.mt_move){var r=S?1:x?2:T?3:0,i=a();e.send("m"+o(n)+o(t)+o(r)+o(i))}},onMouseDown:function(t,n,r){if(m.mt_click&&!(3r)){var i=a();e.send("p"+o(n)+o(t)+o(r)+o(i))}},onMouseUp:function(t,n,r){if(m.mt_click&&!(3r)){var i=a();e.send("r"+o(n)+o(t)+o(r)+o(i))}},onMouseWheel:function(t,n,r){if(m.mt_click){var i=a(),s=0>r?4:5;e.send("p"+o(n)+o(t)+o(s)+o(i))}},blockKeys:function(e){m.no_keys=e},handleKeyDown:C}}},function(e,t,n){"use strict";var r=n(1),i=n(0),o=i.qs,s=n(2);e.exports=function(e,t,n){function i(){c("Ready..."),s.show("#fu_modal",a),r("#fu_form").toggleClass("busy",!1),t.blockKeys(!0)}function a(){console.log("Upload modal closed."),clearTimeout(m),v=0,t.blockKeys(!1)}function c(e){o("#fu_prog").textContent=e}function l(){var e=o("#fu_text").value;return e.length?(d=e.split("\n"),v=0,g=0,p=o("#fu_delay").value,0>p&&(p=0,o("#fu_delay").value=p),w={CR:"\r",LF:"\n",CRLF:"\r\n"}[o("#fu_crlf").value],r("#fu_form").toggleClass("busy",!0),c("Starting..."),void u()):void f()}function u(){if(r("#fu_modal").hasClass("visible")){if(!e.canSend())return void(m=setTimeout(u,1));0===g&&(y="",0===v&&n.bracketedPaste&&(y="[200~"),y+=d[v++]+w,v===d.length&&n.bracketedPaste&&(y+="[201~"));var i;if(y.length-g<=b?(i=y.substr(g,b),g=0):(i=y.substr(g,b),g+=b),!t.sendString(i))return void c("FAILED!");var o=Math.round(v/d.length*1e3)/10;c(v+" / "+d.length+" ("+o+"%)"),d.length>v||0c.length?e.startsWith(c)?t.sendString(e.substr(c.length)):n=!0:e.lengths.length&&(s=("0000"+s).substr(-4)),s="U+"+s,b.textContent="Cursor cell ("+t+"): "+s+" FG: "+n+" BG: "+r+" Attrs: "+o.toString(2)}})}}]); +//# sourceMappingURL=app.310033b.js.map \ No newline at end of file diff --git a/js/app.310033b.js.map b/js/app.310033b.js.map new file mode 100644 index 0000000..1ef591a --- /dev/null +++ b/js/app.310033b.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///app.310033b.js","webpack:///webpack/bootstrap 21d3956fd434cbda121b","webpack:///./js/utils.js","webpack:///./js/lib/chibi.js","webpack:///./js/modal.js","webpack:///./js/notif.js","webpack:///./js/term/themes.js","webpack:///./node_modules/events/events.js","webpack:///./js/term/demo.js","webpack:///./js/index.js","webpack:///./js/lib/polyfills.js","webpack:///./js/appcommon.js","webpack:///./js/wifi.js","webpack:///./js/lang.js","webpack:///./js/term/index.js","webpack:///./js/term/screen.js","webpack:///./js/term/screen_parser.js","webpack:///./js/term/screen_renderer.js","webpack:///./js/term/connection.js","webpack:///./js/term/input.js","webpack:///./js/term/upload.js","webpack:///./js/term/soft_keyboard.js","webpack:///./js/term/debug_screen.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","mk","a","document","createElement","qs","querySelector","qsa","querySelectorAll","cr","b","which","bool","parse2B","arguments","length","charCodeAt","parse3B","encode2B","String","fromCharCode","encode3B","e","_typeof","Symbol","iterator","constructor","q","replace","charAt","toUpperCase","f","currentStyle","getComputedStyle","getPropertyValue","g","encodeURIComponent","h","style","display","j","Array","nodeName","elements","disabled","type","value","selected","checked","substring","k","split","classList","remove","add","toggle","contains","r","innerHTML","lastChild","parentNode","insertBefore","nextSibling","appendChild","firstChild","nodeType","each","apply","first","shift","last","pop","odd","push","even","hide","show","removeChild","css","getClass","className","setClass","addClass","removeClass","toggleClass","hasClass","html","htmlBefore","htmlAfter","htmlAppend","htmlPrepend","attr","toLowerCase","cssText","setAttribute","getAttribute","data","val","on","addEventListener","attachEvent","off","removeEventListener","detachEvent","window","onload","ajax","assign","method","nocache","timeout","loader","callback","_loader","url","indexOf","XMLHttpRequest","Date","toString","open","setTimeout","console","error","abort","onreadystatechange","readyState","responseText","status","clearTimeout","setRequestHeader","send","post","ready","loaded","t","&","<",">","\"","'","/","`","=","htmlEscape","$","modal","curCloseCb","init","this","stopImmediatePropagation","$balloon","timerHideBegin","timerHideEnd","nt","canCancel","stopTimeouts","themes","fgbgThemes","colorTable256","buildColorTable","fill","SELECTION_FG","SELECTION_BG","themePreview","forEach","dataset","fg","color","bg","backgroundColor","EventEmitter","_events","_maxListeners","undefined","isFunction","arg","isNumber","isObject","isUndefined","defaultMaxListeners","setMaxListeners","isNaN","TypeError","emit","er","handler","len","args","listeners","Error","err","context","slice","addListener","listener","newListener","warned","trace","once","removeListener","fired","list","position","splice","removeAllListeners","key","listenerCount","evlistener","emitter","_toConsumableArray","isArray","from","_possibleConstructorReturn","ReferenceError","_inherits","create","writable","setPrototypeOf","__proto__","_classCallCheck","_get","Function","getOwnPropertyDescriptor","getPrototypeOf","_createClass","_require","_require2","ANSIParser","reset","joinChunks","currentSequence","sequence","map","next","done","codePointAt","match","parseSequence","return","getRainbowColor","Math","PI","floor","sin","ScrollingTerminal","width","height","termScreen","parser","handleParsed","_lastLoad","now","load","serialize","showPage","min","max","cursor","x","y","visible","trackMouse","theme","rainbow","clear","screen","scroll","newLine","moveBack","writeChar","deleteForward","insertBlanks","clampCursor","write","scheduleLoad","fromCodePoint","_scheduledLoad","clearInterval","_rainbowTimer","setInterval","Process","demoData","buttons","1","2","3","4","5","child","destroy","substr","mouseReceiver","demoshIndex","screenfetch","location","hostname","devicePixelRatio","filter","trim","local-echo","includes","info","showSplash","then","printText"," ",".","-","*","#","repeat","abs","Promise","join","colors","ls","shell","Number","isFinite","terminal","drawnScreenFG","rainbowTimer","mouse","randomData","highlighted","random","scrollOffset","render","sudo","index","run","make","pwd","cd","whoami","navigator","userAgent","uname","mkdir","rm","cp","mv","ln","touch","exit","github","DemoShell","history","historyIndex","cursorPos","prompt","unshift","copyFromHistoryIndex","warn","moveForward","parse","spawn","demoInterface","input","mouseMove","mouseDown","mouseUp","didInit","termInit","RangeError","pageShown","notify","keyCode","ctrlKey","submit","wheelDelta","createEvent","initEvent","dispatchEvent","fireEvent","preventDefault","search","childNodes","textContent","innerWidth","removeAttribute","href","noAutoShow","id","tr","round","JSON","log","result","inProgress","APs","sort","rssi","enc","parseInt","essid","rssi_perc","_demo","_demo_aps","_root","sta_ssid","sta_password","sta_active_ip","sta_active_ssid","startScanning","WiFi","_tr","Notify","TermScreen","TermConnection","TermInput","TermUpload","initSoftKeyboard","attachDebugScreen","termUpload","statusScreen","title","loading","screenFG","screenBG","screenAttrs","onerror","canvas","labels","fitIntoWidth","fitIntoHeight","innerHeight","Element","requestFullscreen","webkitRequestFullscreen","updateSize","conn","termUpl","ScreenParser","ScreenRenderer","ctx","getContext","renderer","_debug","audioCtx","AudioContext","webkitAudioContext","Proxy","blinking","hanging","_window","fontFamily","fontSize","gridScaleX","gridScaleY","debug","graphics","_windowScale","windowState","selection","selectable","start","end","mouseMode","clicks","movement","set","scheduleSizeUpdate","scheduleDraw","bracketedPaste","blinkingCellCount","reverseVideo","screenToGrid","getNormalizedSelection","altKey","button","offsetX","offsetY","onMouseDown","concat","getBoundingClientRect","clientX","left","clientY","top","touches","gridToScreen","transform","copySelectionToClipboard","onMouseMove","onMouseUp","onMouseWheel","deltaY","_scheduledSizeUpdate","weight","getCellSize","font","getFont","measureText","ceil","getCharSize","resetDrawn","draw","isInSelection","getSelectedText","body","select","execCommand","Notification","permission","focus","requestPermission","pow","_lastBeep","_convolver","createConvolver","sampleRate","createBuffer","getChannelData","buffer","connect","destination","createOscillator","createGain","gain","frequency","currentTime","stop","requestAnimationFrame","contentLoaded","resetCursorBlink","setAlts","setMouseMode","u","v","w","z","A","B","C","D","E","opacity","defaultFg","defaultBg","setDefaultColors","palette","loadContent","loadLabels","beep","showNotification","stringify","frakturExceptions","_palette","defaultBgNum","defaultFgNum","blinkStyleOn","blinkInterval","cursorBlinkOn","cursorBlinkInterval","resetBlink","drawnScreen","drawnScreenBG","drawnScreenAttrs","drawnCursor","_scheduledDraw","cellWidth","cellHeight","fillStyle","getColor","clearRect","fillRect","charSize","text","attrs","globalAlpha","alphaToFraktur","beginPath","rect","fillText","strokeStyle","lineWidth","lineCap","moveTo","lineTo","F","G","stroke","drawStatus","startDrawLoop","stopDrawLoop","setTransform","drawStart","textAlign","textBaseline","Map","ha","ia","ja","ka","la","ma","na","oa","pa","qa","ra","sa","has","cell","isCursor","inSelection","keys","getAdjacentCells","save","ta","ua","va","wa","xa","clipRect","clip","ya","H","I","J","za","K","L","M","N","O","drawBackground","Aa","setCell","P","Q","R","S","T","Ba","Ca","U","V","W","X","Y","Da","Z","_","aa","ba","ca","da","ea","fa","drawCharacter","ga","restore","drawEnd","translate","rotate","_drawTimerThread","drawTimerLoop","demo","ws","heartbeatTimeout","pingInterval","xoff","autoXoffTimeout","reconnTimeout","forceClosing","hidden","closeSocket","heartbeat","code","close","alert","WebSocket","onWSOpen","onWSClose","onWSMessage","onHeartbeatFail","allFn","metaKey","clipboardData","setData","getData","setContent","all_fn","6","8","9","12","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","58","59","60","61","62","63","64","91","92","93","106","107","109","110","111","144","145","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","186","187","188","189","190","192","194","219","220","221","222","224","np_alt","cu_alt","fn_alt","mt_click","mt_move","no_keys","crlf_mode","Backspace","Tab","Enter","Control+Enter","Escape","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","Home","Insert","Delete","End","PageUp","PageDown","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","Shift+F1","Shift+F2","Shift+F3","Shift+F4","Shift+F5","Shift+F6","Shift+F7","Shift+F8","Shift+F9","Shift+F10","Shift+F11","Shift+F12","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","Numpad*","Numpad+","Numpad-","Numpad.","Numpad/","Control+]","Control+\\","Control+[","Control+^","Control+_","Control+ArrowLeft","Control+ArrowRight","Control+ArrowUp","Control+ArrowDown","Control+Home","Control+End","Shift+ArrowLeft","Shift+ArrowRight","Shift+ArrowUp","Shift+ArrowDown","Shift+Home","Shift+End","Alt+ArrowLeft","Alt+ArrowRight","Meta+ArrowLeft","Meta+ArrowRight","Alt+Backspace","Meta+Backspace","Control+Shift+C","Control+Insert","Control+F12","activeElement","HTMLTextAreaElement","shiftKey","sendString","blockKeys","handleKeyDown","CR","LF","CRLF","canSend","FileReader","target","files","confirm","readAsText","_slicedToArray","startsWith","stopPropagation","isComposing","inputType","←","↓","↑","→","^C","pointerEvents","createPattern","strokeRect"],"mappings":"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","file":"app.310033b.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \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, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\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/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nexports.mk=function(a){return document.createElement(a)},exports.qs=function(a){return document.querySelector(a)},exports.qsa=function(a){return document.querySelectorAll(a)},exports.cr=function(a){return function(b){(10===b.which||13===b.which||32===b.which)&&a()}},exports.bool=function(a){return 1===a||'1'===a||!0===a||'true'===a},exports.parse2B=function(a){var b=1\":'>','\"':'"',\"'\":''',\"/\":'/',\"`\":'`',\"=\":'='};m.htmlEscape=function(a){return(a+'').replace(/[&<>\"'`=\\/]/g,function(a){return t[a]})},module.exports=m})();\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var modal={};var curCloseCb=null;modal.show=function(a,b){var c=$(a);c.removeClass('hidden visible'),setTimeout(function(){c.addClass('visible')},1),curCloseCb=b},modal.hide=function(a){var b=$(a);b.removeClass('visible'),setTimeout(function(){b.addClass('hidden'),curCloseCb&&curCloseCb()},500)},modal.init=function(){$('.Modal').on('click',function(){$(this).hasClass('no-close')||modal.hide(this)}),$('.Dialog').on('click',function(a){a.stopImmediatePropagation()}),$(window).on('keydown',function(a){27===a.which&&modal.hide('.Modal')})},module.exports=modal;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var modal=__webpack_require__(2);var nt={};var sel='#notif';var $balloon;var timerHideBegin;var timerHideEnd;var canCancel=!1;var stopTimeouts=function(){clearTimeout(timerHideBegin),clearTimeout(timerHideEnd)};nt.show=function(a,b,c){$balloon.toggleClass('error',!0===c),$balloon.html(a),modal.show($balloon),stopTimeouts(),(!b||0>=b)&&(b=2500),timerHideBegin=setTimeout(nt.hide,b),canCancel=!1,setTimeout(function(){canCancel=!0},500)},nt.hide=function(){var a=$(sel);a.removeClass('visible'),timerHideEnd=setTimeout(function(){a.addClass('hidden')},250)},nt.init=function(){$balloon=$(sel),$(document).on('click',function(){canCancel&&nt.hide(this)}),$balloon.on('click',function(a){return a.stopImmediatePropagation(),!1}),$balloon.on('mouseenter',function(){stopTimeouts(),$balloon.removeClass('hidden').addClass('visible')})},module.exports=nt;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar themes=exports.themes=[['#111213','#CC0000','#4E9A06','#C4A000','#3465A4','#75507B','#06989A','#D3D7CF','#555753','#EF2929','#8AE234','#FCE94F','#729FCF','#AD7FA8','#34E2E2','#EEEEEC'],['#000000','#aa0000','#00aa00','#aa5500','#0000aa','#aa00aa','#00aaaa','#aaaaaa','#555555','#ff5555','#55ff55','#ffff55','#5555ff','#ff55ff','#55ffff','#ffffff'],['#000000','#cd0000','#00cd00','#cdcd00','#0000ee','#cd00cd','#00cdcd','#e5e5e5','#7f7f7f','#ff0000','#00ff00','#ffff00','#5c5cff','#ff00ff','#00ffff','#ffffff'],['#000000','#cd0000','#00cd00','#cdcd00','#0000cd','#cd00cd','#00cdcd','#faebd7','#404040','#ff0000','#00ff00','#ffff00','#0000ff','#ff00ff','#00ffff','#ffffff'],['#2e3436','#cc0000','#4e9a06','#c4a000','#3465a4','#75507b','#06989a','#d3d7cf','#555753','#ef2929','#8ae234','#fce94f','#729fcf','#ad7fa8','#34e2e2','#eeeeec'],['#073642','#dc322f','#859900','#b58900','#268bd2','#d33682','#2aa198','#eee8d5','#002b36','#cb4b16','#586e75','#657b83','#839496','#6c71c4','#93a1a1','#fdf6e3'],['#073642','#dc322f','#859900','#b58900','#268bd2','#d33682','#2aa198','#eee8d5','#002b36','#cb4b16','#586e75','#657b83','#839496','#6c71c4','#93a1a1','#fdf6e3'],['#000000','#69001A','#117800','#769100','#1A00A6','#8019AB','#289E76','#A4A4A4','#484848','#C54E76','#6DD441','#D2ED46','#765BFF','#DC75FF','#84FAD2','#FFFFFF'],['#000000','#aa0000','#00aa00','#aaaa00','#0000aa','#aa00aa','#00aaaa','#aaaaaa','#000000','#ff0000','#00FF00','#ffff00','#0000ff','#ff00ff','#00ffff','#ffffff'],['#000000','#722640','#0E5940','#808080','#40337F','#E434FE','#1B9AFE','#BFB3FF','#404C00','#E46501','#1BCB01','#BFCC80','#808080','#F1A6BF','#8DD9BF','#ffffff'],['#000000','#8D3E37','#55A049','#AAB95D','#40318D','#80348B','#72C1C8','#D59F74','#8B5429','#B86962','#94E089','#FFFFB2','#8071CC','#AA5FB6','#87D6DD','#ffffff']];exports.fgbgThemes=[['#aaaaaa','#000000'],['#000000','#ffffdd'],['#000000','#ffffff'],['#ffffff','#000000'],['#00ff00','#000000'],['#e53c00','#000000'],['#ffffff','#300a24'],['#657b83','#fdf6e3'],['#839496','#002b36']];var colorTable256=null;exports.buildColorTable=function(){if(null!=colorTable256)return colorTable256;colorTable256=Array(16).fill('rgba(0, 0, 0, 0)');for(var a=0;6>a;a++)for(var b=0;6>b;b++)for(var c=0;6>c;c++){var d=40*a+(a?55:0);var e=40*b+(b?55:0);var f=40*c+(c?55:0);colorTable256.push('rgb('+d+', '+e+', '+f+')')}for(var g=0;24>g;g++){var h=10*g+8;colorTable256.push('rgb('+h+', '+h+', '+h+')')}return colorTable256},exports.SELECTION_FG='#333',exports.SELECTION_BG='#b2d7fe',exports.themePreview=function(a){document.querySelectorAll('[data-fg]').forEach(function(b){var c=+b.dataset.fg;b.style.color=themes[a][c]}),document.querySelectorAll('[data-bg]').forEach(function(b){var c=+b.dataset.bg;b.style.backgroundColor=themes[a][c]})};\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _get=function a(b,c,d){null===b&&(b=Function.prototype);var e=Object.getOwnPropertyDescriptor(b,c);if(e===void 0){var f=Object.getPrototypeOf(b);return null===f?void 0:a(f,c,d)}if('value'in e)return e.value;var g=e.get;return void 0===g?void 0:g.call(d)};var _createClass=function(){function a(a,b){for(var c=0;c=b)this.handler('move-cursor-'+('B'>=b?'y':'x'),('B'===b||'C'===b?1:-1)*e);else if('E'===b||'F'===b)this.handler('move-cursor-line',('E'===b?1:-1)*e);else if('G'===b)this.handler('set-cursor-x',e-1);else if('J'===b){var f=d.length?d[0]:2;2===f&&this.handler('clear')}else if('P'===b)this.handler('delete',e);else if('@'===b)this.handler('insert-blanks',e);else if('q'===b)this.handler('set-cursor-style',e);else if('m'===b){if(!d.length||0===d[0])return void this.handler('reset-style');var g=d[0];if(1===g)this.handler('add-attrs',1);else if(2===g)this.handler('add-attrs',2);else if(3===g)this.handler('add-attrs',4);else if(4===g)this.handler('add-attrs',8);else if(5===g||6===g)this.handler('add-attrs',16);else if(7===g)this.handler('add-attrs',-1);else if(9===g)this.handler('add-attrs',64);else if(20===g)this.handler('add-attrs',32);else if(30<=g&&37>=g)this.handler('set-color-fg',g%10);else if(40<=g&&47>=g)this.handler('set-color-bg',g%10);else if(39===g)this.handler('reset-color-fg');else if(49===g)this.handler('reset-color-bg');else if(90<=g&&98>=g)this.handler('set-color-fg',g%10+8);else if(100<=g&&108>=g)this.handler('set-color-bg',g%10+8);else if((38===g||48===g)&&5===d[1]){var h=255&(0|d[2]);38===g&&this.handler('set-color-fg',h),48===g&&this.handler('set-color-bg',h)}}else('h'===b||'l'===b)&&'?25'===c&&('h'===b?this.handler('show-cursor'):'l'===b&&this.handler('hide-cursor'))}}},{key:'write',value:function write(a){var b=!0;var c=!1;var d=void 0;try{for(var e,f=a.toString()[Symbol.iterator]();!(b=(e=f.next()).done);b=!0){var g=e.value;var h=g.codePointAt(0);27===h?this.currentSequence=1:1===this.currentSequence&&'['===g?(this.currentSequence=2,this.sequence+='['):this.currentSequence&&g.match(/[\\x40-\\x7e]/)?(this.parseSequence(this.sequence+g),this.currentSequence=0,this.sequence=''):1h?this.handler('_null'):3===h?this.handler('sigint'):6>=h?this.handler('_null'):7===h?this.handler('bell'):8===h?this.handler('back'):9===h?this.handler('tab'):10===h?this.handler('new-line'):13===h?this.handler('return'):21===h?this.handler('delete-line'):23===h?this.handler('delete-word'):this.handler('write',g)}}catch(a){c=!0,d=a}finally{try{!b&&f.return&&f.return()}finally{if(c)throw d}}this.joinChunks||this.reset()}}]),a}();var TERM_DEFAULT_STYLE=0;var TERM_MIN_DRAW_DELAY=10;var getRainbowColor=function(a){var c=Math.PI;var d=Math.floor;var e=Math.sin;var f=d(2.5*e(a)+2.5);var h=d(2.5*e(a+2/3*c)+2.5);var g=d(2.5*e(a+4/3*c)+2.5);return 16+36*f+6*h+g};var ScrollingTerminal=function(){function a(b){var c=this;_classCallCheck(this,a),this.width=80,this.height=25,this.termScreen=b,this.parser=new ANSIParser(function(){return c.handleParsed.apply(c,arguments)}),this.reset(),this._lastLoad=Date.now(),this.termScreen.load(this.serialize()),window.showPage()}var b=Math.min;var c=Math.max;return _createClass(a,[{key:'reset',value:function reset(){this.style=TERM_DEFAULT_STYLE,this.cursor={x:0,y:0,style:1,visible:!0},this.trackMouse=!1,this.theme=-1,this.rainbow=!1,this.parser.reset(),this.clear()}},{key:'clear',value:function clear(){this.screen=[];for(var a=0;a=this.height&&this.scroll()}},{key:'writeChar',value:function writeChar(a){this.screen[this.cursor.y*this.width+this.cursor.x]=[a,this.style],this.cursor.x++,this.cursor.x>=this.width&&(this.cursor.x=0,this.newLine())}},{key:'moveBack',value:function moveBack(){var a=0this.cursor.x&&(this.cursor.x=0=this.width&&(this.cursor.x=0,this.cursor.y++,this.cursor.y>=this.height&&this.scroll())}},{key:'deleteChar',value:function deleteChar(){this.moveBack(),this.screen.splice((this.cursor.y+1)*this.width,0,[' ',TERM_DEFAULT_STYLE]),this.screen.splice(this.cursor.y*this.width+this.cursor.x,1)}},{key:'deleteForward',value:function deleteForward(a){a=b(this.width,a);for(var c=0;cthis.cursor.x&&(this.cursor.x=0),0>this.cursor.y&&(this.cursor.y=0),this.cursor.x>this.width-1&&(this.cursor.x=this.width-1),this.cursor.y>this.height-1&&(this.cursor.y=this.height-1)}},{key:'handleParsed',value:function handleParsed(a){'write'===a?this.writeChar(1>=arguments.length?void 0:arguments[1]):'delete'===a?this.deleteForward(1>=arguments.length?void 0:arguments[1]):'insert-blanks'===a?this.insertBlanks(1>=arguments.length?void 0:arguments[1]):'clear'===a?this.clear():'bell'===a?this.termScreen.load('B'):'back'===a?this.moveBack():'new-line'===a?this.newLine():'return'===a?this.cursor.x=0:'set-cursor'===a?(this.cursor.x=2>=arguments.length?void 0:arguments[2],this.cursor.y=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-y'===a?(this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-x'===a?(this.cursor.x+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-line'===a?(this.cursor.x=0,this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'set-cursor-x'===a?this.cursor.x=1>=arguments.length?void 0:arguments[1]:'set-cursor-style'===a?this.cursor.style=c(0,b(6,1>=arguments.length?void 0:arguments[1])):'reset-style'===a?this.style=TERM_DEFAULT_STYLE:'add-attrs'===a?this.style|=(1>=arguments.length?void 0:arguments[1])<<16:'set-color-fg'===a?this.style=16777216|4294967040&this.style|(1>=arguments.length?void 0:arguments[1]):'set-color-bg'===a?this.style=33554432|4294902015&this.style|(1>=arguments.length?void 0:arguments[1])<<8:'reset-color-fg'===a?this.style&=4294901504:'reset-color-bg'===a?this.style&=4294770943:'hide-cursor'===a?this.cursor.visible=!1:'show-cursor'===a&&(this.cursor.visible=!0)}},{key:'write',value:function write(a){this.parser.write(a),this.scheduleLoad()}},{key:'serialize',value:function serialize(){var a=String.fromCodePoint;var b='S';b+=a(this.height+1)+a(this.width+1),b+=a(this.cursor.y+1)+a(this.cursor.x+1);var c=+this.cursor.visible;c|=96*+this.trackMouse,c|=384,c|=this.cursor.style<<9,b+=a(c+1);var d=null;var e=0;var f=!0;var g=!1;var h=void 0;try{for(var i,j=this.screen[Symbol.iterator]();!(f=(i=j.next()).done);f=!0){var k=i.value;var l=k[1];if(this.rainbow){var m=e%this.width;var n=Math.floor(e/this.width);l=16777216|4294705152&l|getRainbowColor((m+n)/10+Date.now()/1e3),e++}if(l!==d){var o=255&l;var p=255&l>>8;var q=65535&l>>16;var r=o!=(255&d);var s=p!=(255&d>>8);var t=q!=(65535&d>>16);r&&s?b+='\\x03'+a((65535&l)+1):r?b+='\\x05'+a(o+1):s&&(b+='\\x06'+a(p+1)),t&&(b+='\\x04'+a(q+1)),d=l}b+=k[0]}}catch(a){g=!0,h=a}finally{try{!f&&j.return&&j.return()}finally{if(g)throw h}}return b}},{key:'scheduleLoad',value:function scheduleLoad(){var a=this;clearTimeout(this._scheduledLoad),this._lastLoadf;f++)c+=b[e][f]?'\\x1B[38;5;'+getRainbowColor((f+e)/10)+'m'+b[e][f]:' ';this.emit('write','\\r\\n\\x1B[?25l');var d=function(){a.emit('write',c.substr(0,80)),c=c.substr(80),c.length?setTimeout(d,50):(a.emit('write','\\r\\n\\x1B[?25h'),a.destroy())};d()}}]),b}(Process),\"local-echo\":function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;cb[j].length&&(b[j]+=' '.repeat(79-b[j].length));this.emit('write','\\r\\n'.repeat(b.length+1)),this.emit('write','\\x1B[A'.repeat(b.length)),this.emit('write','\\x1B[?25l');var e=0;var f=0;var g=function(b,c){var d=Math.abs;var g=b-e;var h=c-f;a.emit('write','\\x1B['+d(g)+(0++d?3<=++e?(setTimeout(f,20),e=0):f():(g(0,b.length),a.emit('write','\\x1B[m\\x1B[?25h'),c())};f()})}},{key:'printText',value:function printText(){var a=0a;a++)this.emit('write','\\x1B['+(8>a?'3'+a:'9'+(a-8))+'m'),this.emit('write','foreground-color'[a]+' ');this.emit('write','\\r\\n ');for(var c=0;16>c;c++)this.emit('write','\\x1B['+(8>c?'4'+c:'10'+(c-8))+'m ');this.emit('write','\\x1B[m\\r\\n');for(var d=0;6>d;d++){this.emit('write',' ');for(var e=0;6>e;e++){for(var f=0;6>f;f++)this.emit('write','\\x1B[48;5;'+(16+36*d+6*e+f)+'m ');this.emit('write','\\x1B[m')}this.emit('write','\\r\\n')}this.emit('write',' ');for(var b=0;24>b;b++)this.emit('write','\\x1B[48;5;'+(232+b)+'m ');this.emit('write','\\x1B[m\\r\\n\\n'),this.destroy()}}]),b}(Process),ls:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a in this.emit('write','\\x1B[92mList of demo commands\\x1B[m\\r\\n'),demoshIndex)'string'!=typeof demoshIndex[a]&&this.emit('write',a+'\\r\\n');this.destroy()}}]),b}(Process),theme:function(a){function b(a){_classCallCheck(this,b);var c=_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).call(this));return c.shell=a,c}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){var a=0|+(0>=arguments.length?void 0:arguments[0]);var b=themes.length;return!arguments.length||!Number.isFinite(a)||0>a||a>=b?(this.emit('write','\\x1B[31mUsage: theme [0\\u2013'+(b-1)+']\\r\\n'),void this.destroy()):void(this.shell.terminal.theme=a,this.shell.terminal.termScreen.drawnScreenFG=[],this.emit('write',''),this.destroy())}}]),b}(Process),cursor:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;cb;b++){var c='';for(var d=0;79>d;d++)c+=a[Math.floor(a.length*Math.random())];this.randomData.push(c)}this.scrollOffset=0,this.render()}},{key:'render',value:function render(){this.emit('write','\\x1B[m\\x1B[2J\\x1B[1;1H'),this.emit('write','\\x1B[97m\\x1B[1mMouse Demo\\r\\n\\x1B[mMouse movement, clicking and scrolling!');for(var a=0;23>a;a++){var b=a+this.scrollOffset;b=(b%this.randomData.length+this.randomData.length)%this.randomData.length;var c=this.randomData[b];var d='\\x1B['+(3+a)+';1H\\x1B[38;5;239m';for(var e in c)this.highlighted[80*(a+2)+ +e]&&(d+='\\x1B[97m'),d+=c[e],this.highlighted[80*(a+2)+ +e]&&(d+='\\x1B[38;5;239m');this.emit('write',d)}this.mouse&&this.emit('write','\\x1B['+(this.mouse.y+1)+';'+(this.mouse.x+1)+'H')}},{key:'mouseMove',value:function mouseMove(a,b){this.mouse={x:a,y:b},this.render()}},{key:'mouseDown',value:function mouseDown(a,b,c){4===c?this.scrollOffset--:5===c?this.scrollOffset++:this.highlighted[80*b+a]=!this.highlighted[80*b+a],this.render()}},{key:'mouseUp',value:function mouseUp(){}},{key:'destroy',value:function destroy(){this.shell.terminal.write('\\x1B[2J\\x1B[1;1H'),this.shell.terminal.trackMouse=!1,demoData.mouseReceiver===this&&(demoData.mouseReceiver=null),_get(b.prototype.__proto__||Object.getPrototypeOf(b.prototype),'destroy',this).call(this)}}]),b}(Process),sudo:function(a){function b(a){_classCallCheck(this,b);var c=_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).call(this));return c.shell=a,c}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){var a=this;for(var d=arguments.length,e=Array(d),f=0;f\\x1B[m\\r\\n'),this.destroy();else if(4===e.length&&'make me a sandwich'===e.join(' ').toLowerCase()){var g='\\x1B[33m';var b='\\x1B[32m';var i='\\x1B[38;5;229m';var c='\\x1B[38;5;225m';this.emit('write',' '+g+'_.---._\\r\\n _.-~ ~-._\\r\\n _.-~ ~-._\\r\\n _.-~ ~---._\\r\\n _.-~ ~\\\\\\r\\n .-~ _.;\\r\\n :-._ _.-~ ./\\r\\n `-._~-._ _..__.-~ _.-~\\r\\n'+(' '+i+'/ '+g+'~-._~-._ / .__..--'+i+'~-'+b+'---._\\r\\n')+(i+' \\\\_____(_'+g+';-._\\\\. _.-~_/'+i+' ~)'+b+'.. . \\\\\\r\\n')+(b+' /(_____ '+g+'\\\\`--...--~_.-~'+i+'______..-+'+b+'_______)\\r\\n')+(b+' .(_________/'+g+'`--...--~/'+b+' _/ '+c+' '+g+'/\\\\\\r\\n')+(g+' /-._'+c+' \\\\_ '+b+'(___./_..-~'+c+'__.....'+g+'__..-~./\\r\\n')+(g+' `-._~-._'+c+' ~\\\\--------~ .-~'+g+'_..__.-~ _.-~\\r\\n')+(g+' ~-._~-._ '+c+'~---------` '+g+'/ .__..--~\\r\\n')+(g+' ~-._\\\\. _.-~_/\\r\\n')+(g+' \\\\`--...--~_.-~\\r\\n')+(g+' `--...--~'+'\\x1B[0m'+'\\r\\n')),this.destroy()}else{var h=e.shift();if(this.shell.index[h]){var j=this.shell.index[h];if(j instanceof Function){var k=new j(this);var l=function(b){return a.emit('write',b)};k.on('write',l),k.on('exit',function(){k.removeListener('write',l),a.destroy()}),k.run.apply(k,e)}else this.emit('write',j),this.destroy()}else this.emit('write','sudo: '+h+': command not found\\r\\n'),this.destroy()}}}]),b}(Process),make:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;c=arguments.length?void 0:arguments[1])+this.history[0].substr(this.cursorPos),this.cursorPos++;else if('back'===a)this.copyFromHistoryIndex(),this.history[0]=this.history[0].substr(0,this.cursorPos-1)+this.history[0].substr(this.cursorPos),this.cursorPos--,0>this.cursorPos&&(this.cursorPos=0);else if('tab'===a)console.warn('TAB not implemented');else if('move-cursor-x'===a)this.cursorPos=Math.max(0,Math.min(this.history[this.historyIndex].length,this.cursorPos+(1>=arguments.length?void 0:arguments[1])));else if('delete-line'===a)this.copyFromHistoryIndex(),this.history[0]='',this.cursorPos=0;else if('delete-word'===a){this.copyFromHistoryIndex();var b=this.history[0].substr(0,this.cursorPos).split(' ');b.pop(),this.history[0]=b.join(' ')+this.history[0].substr(this.cursorPos),this.cursorPos=b.join(' ').length}else'move-cursor-y'===a&&(this.historyIndex-=1>=arguments.length?void 0:arguments[1],0>this.historyIndex&&(this.historyIndex=0),this.historyIndex>=this.history.length&&(this.historyIndex=this.history.length-1),this.cursorPos=this.history[this.historyIndex].length);this.terminal.write(this.history[this.historyIndex]),this.terminal.write('\\b'.repeat(this.history[this.historyIndex].length)),this.terminal.moveForward(this.cursorPos),this.terminal.write(''),'return'===a&&(this.terminal.write('\\r\\n'),this.parse(this.history[this.historyIndex]))}},{key:'parse',value:function parse(a){'help'===a&&(a='info'),this.run(a)}},{key:'run',value:function run(a){var b=[''];var c=!1;var d=!0;var e=!1;var f=void 0;try{for(var g,h=a.trim()[Symbol.iterator]();!(d=(g=h.next()).done);d=!0){var j=g.value;c&&j!==c?b[b.length-1]+=j:c?c=!1:'\"'===j||'\\''===j?c=j:j.match(/\\s/)?b[b.length-1]&&b.push(''):b[b.length-1]+=j}}catch(a){e=!0,f=a}finally{try{!d&&h.return&&h.return()}finally{if(e)throw f}}var i=b.shift();i in this.index?this.spawn(i,b):(this.terminal.write('demosh: Unknown command: '+i+'\\r\\n'),this.prompt(!1))}},{key:'spawn',value:function spawn(a){var b=this;var c=1i||1114111=i?a.push(i):(i-=65536,d=(i>>10)+55296,e=i%1024+56320,a.push(d,e)),(f+1==g||a.length>16384)&&(h+=b.apply(null,a),a.length=0)}return h};a?a(String,'fromCodePoint',{value:d,configurable:!0,writable:!0}):String.fromCodePoint=d}();\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var _require=__webpack_require__(0),mk=_require.mk,qs=_require.qs,qsa=_require.qsa,cr=_require.cr;var modal=__webpack_require__(2);var notify=__webpack_require__(3);$.ready(function(){function a(){$('#menu').toggleClass('expanded')}$('#brand').on('click',a).on('keypress',cr(a)),$('.Row.checkbox').forEach(function(a){var b=a.querySelector('input');var c=a.querySelector('.box');$(c).toggleClass('checked',b.value);var d=function(){b.value=1-b.value,$(c).toggleClass('checked',b.value)};$(a).on('click',d).on('keypress',cr(d))}),$('.Box.mobcol,.Box.fold').forEach(function(a){var b=a.querySelector('h2');var c=function(){$(a).toggleClass('expanded')};$(b).on('click',c).on('keypress',cr(c))}),$('form').forEach(function(a){$(a).on('keypress',function(b){(10===b.keyCode||13===b.keyCode)&&b.ctrlKey&&a.submit()})}),setInterval(function(){$('.anim-dots').each(function(a){var b=$(a);var c=b.html()+'.';5===c.length&&(c='.'),b.html(c)})},1e3),$('input[type=number]').on('mousewheel',function(a){var b=Number.isFinite;var c=$(this);var d=+c.val();isNaN(d)&&(d=1);var e=+(c.attr('step')||1);var f=+c.attr('min');var g=+c.attr('max');if(0.',qs('#screen').appendChild(a),showPage()}},2e3):setTimeout(function(){showPage()},1)});\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var _require=__webpack_require__(0),mk=_require.mk,bool=_require.bool;var tr=__webpack_require__(11);(function(a){function b(a){return Math.round(100*(a.value/a.max))+'%'}function c(a,b,c){$('#sta_ssid').val(a),$('#sta_password').val(b),$('#sta-nw').toggleClass('hidden',0===a.length),$('#sta-nw-nil').toggleClass('hidden',0'+a.rssi_perc+'
').htmlAppend('
'+i+'
').htmlAppend('
'+g[a.enc]+'
'),d.on('click',function(){var a=$(this);var b=a.data('ssid');var d='';+a.data('pwd')&&(d=window.prompt(tr('wifi.enter_passwd').replace(':ssid:',b)),!d)||($('#sta_password').val(d),$('#sta_ssid').val(b),c(b,d,''))}),b.appendChild(f),e[0].appendChild(b)}})}}function e(){window._demo?d(window._demo_aps,200):$.get('http://'+window._root+'/cfg/wifi/scan',d)}function f(a){setTimeout(e,a)}var g=['Open','WEP','WPA','WPA2','WPA/WPA2'];var h;a.init=function(a){$('.Row.range').forEach(function(a){var c=a.querySelector('input');var d=a.querySelector('.x-disp1');var e=a.querySelector('.x-disp2');var f=b(c);$(d).html(f),$(e).html(f),$(c).on('input',function(){f=b(c),$(d).html(f),$(e).html(f)})}),$('#forget-sta').on('click',function(){return c('','',''),!1}),c(a.sta_ssid,a.sta_password,a.sta_active_ip),h=a.sta_active_ssid},a.startScanning=function(){$('#ap-loader').removeClass('hidden'),$('#ap-scan').addClass('hidden'),$('#ap-loader .anim-dots').html('.'),e()}})(window.WiFi={});\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _tr={\"wifi.connected_ip_is\":\"Connected, IP is \",\"wifi.not_conn\":\"Not connected.\",\"wifi.enter_passwd\":\"Enter password for \\\":ssid:\\\"\"};module.exports=function(a){return _tr[a]||\"?\"+a+\"?\"};\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _require=__webpack_require__(0),qs=_require.qs,mk=_require.mk;var Notify=__webpack_require__(3);var TermScreen=__webpack_require__(13);var TermConnection=__webpack_require__(16);var TermInput=__webpack_require__(17);var TermUpload=__webpack_require__(18);var initSoftKeyboard=__webpack_require__(19);var attachDebugScreen=__webpack_require__(20);module.exports=function(a){var b=new TermScreen;var c=new TermConnection(b);var d=TermInput(c,b);var e=TermUpload(c,d,b);b.input=d,d.termUpload=e;var f=-1;c.on('open',function(){f=setTimeout(function(){b.window.statusScreen={title:'Connecting',loading:!0}},250)}),c.on('connect',function(){clearTimeout(f),b.window.statusScreen={title:'Waiting for content',loading:!0}}),c.on('load',function(){b.window.statusScreen&&(b.window.statusScreen=null)}),c.on('disconnect',function(){clearTimeout(f),b.window.statusScreen={title:'Disconnected'},b.screen=[],b.screenFG=[],b.screenBG=[],b.screenAttrs=[]}),c.on('silence',function(){b.window.statusScreen={title:'Waiting for server',loading:!0}}),c.on('ping-success',function(){b.window.statusScreen={title:'Re-connecting',loading:!0}}),c.init(),d.init(a),e.init(),Notify.init(),window.onerror=function(a,b,c,d){return Notify.show('JS ERROR!
'+a+'
at '+b+':'+c+':'+d,1e4,!0),!1},qs('#screen').appendChild(b.canvas),b.load(a.labels,a),initSoftKeyboard(b,d),attachDebugScreen&&attachDebugScreen(b);var g=!1;var h=!1;var i=function(){g?(b.window.fitIntoWidth=window.screen.width,b.window.fitIntoHeight=window.screen.height):(b.window.fitIntoWidth=h?window.innerWidth-20:0,b.window.fitIntoHeight=h?window.innerHeight:0)};i(),window.addEventListener('resize',i);var j=function(){h=!h;var a=qs('#resize-button-icon');h?(a.classList.remove('icn-resize-small'),a.classList.add('icn-resize-full')):(a.classList.remove('icn-resize-full'),a.classList.add('icn-resize-small')),i()};if(qs('#term-fit-screen').addEventListener('click',function(){return j(),!1}),window.Element.prototype.requestFullscreen||window.Element.prototype.webkitRequestFullscreen){setInterval(function checkForFullscreen(){g&&(window.innerWidth!==window.screen.width||window.innerHeight!==window.screen.height)&&(g=!1,i())},500);var k=mk('a');k.href='#',k.addEventListener('click',function(a){a.preventDefault(),g=!0,i(),b.updateSize(),b.canvas.requestFullscreen?b.canvas.requestFullscreen():b.canvas.webkitRequestFullscreen()});var l=mk('i');l.classList.add('icn-resize-full'),k.appendChild(l);var m=mk('span');m.textContent='Fullscreen',k.appendChild(m),qs('#term-nav').insertBefore(k,qs('#term-nav').firstChild)}window.termScreen=b,window.conn=c,window.input=d,window.termUpl=e};\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _createClass=function(){function a(a,b){for(var c=0;cc[1]||b[1]===c[1]&&b[0]>c[0]){var d=[c,b];b=d[0],c=d[1]}return{start:b,end:c}}},{key:'isInSelection',value:function isInSelection(a,b){var c=this.getNormalizedSelection(),d=c.start,e=c.end;var f=d[0]<=a;var g=aDate.now()-50)){if(this._lastBeep=Date.now(),!this._convolver){this._convolver=b.createConvolver();var j=0.8*b.sampleRate;var k=b.createBuffer(2,j,b.sampleRate);for(var l=0;l>9;0>1;var q=!(1&o);0==p?this.screen.cursor.style='block':1==p?this.screen.cursor.style='line':2==p&&(this.screen.cursor.style='bar'),this.screen.cursor.blinking!==q&&(this.screen.cursor.blinking=q,this.screen.renderer.resetCursorBlink()),this.screen.input.setMouseMode(m,n),this.screen.selection.selectable=!m&&!n,$(this.screen.canvas).toggleClass('selectable',this.screen.selection.selectable),this.screen.mouseMode={clicks:m,movement:n};$('.x-term-conf-btn').toggleClass('hidden',!!!(256&l)),$('#action-buttons').toggleClass('hidden',!!!(128&l)),this.screen.bracketedPaste=!!(8192&l),this.screen.reverseVideo=!!(16384&l);var r=7;var s=0;var t=0;var u=0;var v=' ';var w=this.screen.window.width*this.screen.window.height;g&&(this.screen.updateSize(),this.screen.blinkingCellCount=0,this.screen.screen=Array(w).fill(' '),this.screen.screenFG=Array(w).fill(' '),this.screen.screenBG=Array(w).fill(' '),this.screen.screenAttrs=Array(w).fill(0));var x=16;for(var z=function(){var a=t;var c=256&t;var d=512&t;0!=(a&x)&&(' '==v&&0==(a&200)||r==s&&c&&d)&&(a^=x),(b.screen.screenAttrs[u]&x)!=(a&x)&&(a&x?b.screen.blinkingCellCount++:b.screen.blinkingCellCount--),b.screen.screen[u]=v,b.screen.screenFG[u]=r,b.screen.screenBG[u]=s,b.screen.screenAttrs[u]=a};cw));E++);break;case SEQ_SET_COLORS:C=d[c++].codePointAt(0)-1,r=255&C,s=255&C>>8;break;case SEQ_SET_ATTRS:C=d[c++].codePointAt(0)-1,t=65535&C;break;case SEQ_SET_FG:C=d[c++].codePointAt(0)-1,r=255&C;break;case SEQ_SET_BG:C=d[c++].codePointAt(0)-1,s=255&C;break;default:32>B&&(A='\\uFFFD'),v=A,z(),u++;}}this.screen.window.debug&&console.log('Blinky cells: '+this.screen.blinkingCellCount),this.screen.renderer.scheduleDraw('load',16),this.screen.emit('load')}},{key:'loadLabels',value:function loadLabels(a){var b=a.split('\\x01');var c=b[0];qs('#screen-title').textContent=c,0===c.length&&(c='Terminal'),qs('title').textContent=c+' :: ESPTerm',$('#action-buttons button').forEach(function(a,c){var d=b[c+1].trim();a.innerHTML=d?$.htmlEscape(d):' ',a.style.opacity=d?1:0.2})}},{key:'load',value:function load(a){var b=1a&&a in this.palette)return this.palette[a];if(-1===a)return SELECTION_FG;if(-2===a)return SELECTION_BG;if(15a)return this.colorTable256[a];if(255>16;var c=255&a>>8;var d=255&a;return'rgb('+b+', '+c+', '+d+')'}return 0==Date.now()/1e3%2?'#f0f':'#0f0'}},{key:'resetCursorBlink',value:function resetCursorBlink(){var a=this;this.cursorBlinkOn=!0,clearInterval(this.cursorBlinkInterval),this.cursorBlinkInterval=setInterval(function(){a.cursorBlinkOn=!a.screen.cursor.blinking||!a.cursorBlinkOn,a.screen.cursor.blinking&&a.scheduleDraw('cursor-blink')},500)}},{key:'resetBlink',value:function resetBlink(){var a=this;this.blinkStyleOn=!0,clearInterval(this.blinkInterval);var b=0;this.blinkInterval=setInterval(function(){0>=a.screen.blinkingCellCount||(b++,4<=b&&a.blinkStyleOn?(a.blinkStyleOn=!1,b=0,a.scheduleDraw('blink-style')):1<=b&&!a.blinkStyleOn&&(a.blinkStyleOn=!0,b=0,a.scheduleDraw('blink-style')))},200)}},{key:'drawBackground',value:function drawBackground(a){var b=a.x,c=a.y,d=a.cellWidth,e=a.cellHeight,f=a.bg;var g=this.ctx;g.fillStyle=this.getColor(f),g.clearRect(b*d,c*e,d,e),g.fillRect(b*d,c*e,d,e)}},{key:'drawCharacter',value:function drawCharacter(b){var c=Math.round;var d=b.x,e=b.y,f=b.charSize,g=b.cellWidth,h=b.cellHeight,i=b.text,j=b.fg,k=b.attrs;if(i){var l=this.ctx;var m=!1;var n=!1;var o=!1;2&k&&(l.globalAlpha=0.5),8&k&&(m=!0),32&k&&(i=a.alphaToFraktur(i)),64&k&&(n=!0),128&k&&(o=!0),l.fillStyle=this.getColor(j);var p=i.codePointAt(0);if(9600<=p&&9631>=p){l.beginPath();var q=d*g;var r=e*h;var s=g;var t=h;var u=g/2;var v=h/2;if(9600===p)l.rect(q,r,s,v);else if(9608>=p){var w=(1-(p-9600)/8)*t;l.rect(q,r+w,s,t-w)}else if(9615>=p){l.rect(q,r,s-(p-9608)/8*s,t)}else if(9616===p)l.rect(q+u,r,u,t);else if(9619>=p){var x,y,z;9617===p?(x=s/4,y=t/10,z=1):9618===p?(x=s/6,y=s/10,z=1):9619===p&&(x=s/4,y=s/7,z=2);var A=!1;for(var B=0;B=k+0.05};var s=function(a){var c=n.get(a)||q.get(a)||!1;var d=b.screen.screen[a];var e=r(d);var f=e?2:1;if(!c){var l=!1;var g=!0;var h=!1;var i=void 0;try{for(var j,k=b.getAdjacentCells(a,f)[Symbol.iterator]();!(g=(j=k.next()).done);g=!0){var m=j.value;if(n.get(m)&&(2>b.screen.window.graphics||e||r(b.screen.screen[m]))){l=!0;break}}}catch(a){h=!0,i=a}finally{try{!g&&k.return&&k.return()}finally{if(h)throw i}}l&&(c=!0)}q.set(a,c)};var t=!0;var u=!1;var v=void 0;try{for(var w,z=n.keys()[Symbol.iterator]();!(t=(w=z.next()).done);t=!0){var x=w.value;s(x)}}catch(a){u=!0,v=a}finally{try{!t&&z.return&&z.return()}finally{if(u)throw v}}if(1<=this.screen.window.graphics){var y=this.screen.window.debug&&this.screen._debug;c.save(),c.beginPath();for(var ta=0;tam;m++){b.rotate(Math.PI/6);var i=(12*l-m)%12;b.globalAlpha=Math.max(0.2,1-i/3),b.beginPath(),b.moveTo(0,15),b.lineTo(0,30),b.stroke()}b.restore()}}},{key:'startDrawLoop',value:function startDrawLoop(){if(!this._drawTimerThread){var a=Math.random().toString(36);this._drawTimerThread=a,this.drawTimerLoop(a)}}},{key:'stopDrawLoop',value:function stopDrawLoop(){this._drawTimerThread=null}},{key:'drawTimerLoop',value:function drawTimerLoop(a){var b=this;a&&a===this._drawTimerThread&&(window.requestAnimationFrame(function(){return b.drawTimerLoop(a)}),this.draw('draw-loop'))}},{key:'palette',get:function get(){return this._palette||themes[0]},set:function set(a){this._palette!==a&&(this._palette=a,this.resetDrawn(),this.scheduleDraw('palette'))}}],[{key:'alphaToFraktur',value:function alphaToFraktur(a){var b=String.fromCodePoint;return'a'<=a&&'z'>=a?a=b(119997+a.charCodeAt(0)):'A'<=a&&'Z'>=a&&(a=frakturExceptions[a]||b(120003+a.charCodeAt(0))),a}}]),a}();\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _createClass=function(){function a(a,b){for(var c=0;ca.code&&console.error('Bad code from socket!'),clearTimeout(this.reconnTimeout),this.reconnTimeout=setTimeout(function(){return b.init()},2e3),this.emit('disconnect',a.code))}},{key:'onWSMessage',value:function onWSMessage(a){var b=this;try{switch(a.data.charAt(0)){case'.':break;case'-':this.xoff=!0,this.autoXoffTimeout=setTimeout(function(){b.xoff=!1},250);break;case'+':this.xoff=!1,clearTimeout(this.autoXoffTimeout);break;default:this.emit('load'),this.screen.load(a.data),this.pageShown||(window.showPage(),this.pageShown=!0);}this.heartbeat()}catch(a){console.error(a)}}},{key:'canSend',value:function canSend(){return!this.xoff}},{key:'send',value:function send(a){return window._demo?('undefined'==typeof window.demoInterface?console.log('TX: '+JSON.stringify(a)):demo.input(a),!0):this.xoff?(console.log('Can\\'t send, flood control.'),!1):!!this.ws&&(1===this.ws.readyState?('string'!=typeof a&&(a=JSON.stringify(a)),this.ws.send(a),!0):(console.error('Socket not ready'),!1))}},{key:'closeSocket',value:function closeSocket(){this.ws&&(this.forceClosing=!0,this.ws.close(),this.ws=null)}},{key:'init',value:function init(){var a=this;return window._demo?void('undefined'==typeof window.demoInterface?window.alert('Demoing non-demo build!'):demo.init(this.screen)):void(clearTimeout(this.reconnTimeout),clearTimeout(this.heartbeatTimeout),this.closeSocket(),this.ws=new window.WebSocket('ws://'+window._root+'/term/update.ws'),this.ws.addEventListener('open',function(){return a.onWSOpen.apply(a,arguments)}),this.ws.addEventListener('close',function(){return a.onWSClose.apply(a,arguments)}),this.ws.addEventListener('message',function(){return a.onWSMessage.apply(a,arguments)}),console.log('Opening socket.'),this.heartbeat(),this.emit('open'))}},{key:'heartbeat',value:function heartbeat(){var a=this;clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(function(){return a.onHeartbeatFail()},2e3)}},{key:'onHeartbeatFail',value:function onHeartbeatFail(){var a=this;this.closeSocket(),this.emit('silence'),console.error('Heartbeat lost, probing server...'),clearInterval(this.pingInterval),this.pingInterval=setInterval(function(){console.log('> ping'),a.emit('ping'),$.get('http://'+window._root+'/system/ping',function(b,c){200===c?(clearInterval(a.pingInterval),console.info('Server ready, opening socket\\u2026'),a.emit('ping-success'),a.init()):a.emit('ping-fail',c)},{timeout:100,loader:!1})},1e3)}}]),b}(EventEmitter);\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var _require=__webpack_require__(0),encode2B=_require.encode2B;module.exports=function(a,b){function c(b){return a.send('s'+b)}function d(b){a.send('b'+g(b))}function e(a){var d=a.allFn;window.addEventListener('keypress',function(a){if(p()&&!(a.ctrlKey||a.metaKey)){var b='';a.key&&1===a.key.length?b=a.key:a.which&&229!==a.which&&(b=String.fromCodePoint(a.which)),0',63:'?',64:'@',91:'Meta',92:'Meta',93:'ContextMenu',106:'Numpad*',107:'Numpad+',109:'Numpad-',110:'Numpad.',111:'Numpad/',144:'NumLock',145:'ScrollLock',160:'^',161:'!',162:'\"',163:'#',164:'$',165:'%',166:'&',167:'_',168:'(',169:')',170:'*',171:'+',172:'|',173:'-',174:'{',175:'}',176:'~',186:';',187:'=',188:'Numpad,',189:'-',190:'Numpad,',192:'`',194:'Numpad,',219:'[',220:'\\\\',221:']',222:'\\'',224:'Meta'};for(var w=48;57>=w;w++)j[w]=g(w);for(var i=65;90>=i;i++)j[i]=g(i);for(var x=112;131>=x;x++)j[x]='F'+(x-112+1);for(var y=96;105>=y;y++)j[y]='Numpad'+(y-96);var k={np_alt:!1,cu_alt:!1,fn_alt:!1,mt_click:!1,mt_move:!1,no_keys:!1,crlf_mode:!1,all_fn:!1};var l=function(a,b){return k.fn_alt?a:b};var m=function(a,b){return k.cu_alt?a:b};var n=function(a,b){return k.np_alt?a:b};var o={Backspace:'\\b',Tab:'\\t',Enter:function Enter(){return k.crlf_mode?'\\r\\n':'\\r'},\"Control+Enter\":'\\n',Escape:'\\x1B',ArrowUp:function ArrowUp(){return m('\\x1BOA','\\x1B[A')},ArrowDown:function ArrowDown(){return m('\\x1BOB','\\x1B[B')},ArrowRight:function ArrowRight(){return m('\\x1BOC','\\x1B[C')},ArrowLeft:function ArrowLeft(){return m('\\x1BOD','\\x1B[D')},Home:function Home(){return m('\\x1BOH',l('\\x1B[H','\\x1B[1~'))},Insert:'\\x1B[2~',Delete:'\\x1B[3~',End:function End(){return m('\\x1BOF',l('\\x1B[F','\\x1B[4~'))},PageUp:'\\x1B[5~',PageDown:'\\x1B[6~',F1:function F1(){return l('\\x1BOP','\\x1B[11~')},F2:function F2(){return l('\\x1BOQ','\\x1B[12~')},F3:function F3(){return l('\\x1BOR','\\x1B[13~')},F4:function F4(){return l('\\x1BOS','\\x1B[14~')},F5:'\\x1B[15~',F6:'\\x1B[17~',F7:'\\x1B[18~',F8:'\\x1B[19~',F9:'\\x1B[20~',F10:'\\x1B[21~',F11:'\\x1B[23~',F12:'\\x1B[24~',\"Shift+F1\":function ShiftF1(){return l('\\x1BO1;2P','\\x1B[25~')},\"Shift+F2\":function ShiftF2(){return l('\\x1BO1;2Q','\\x1B[26~')},\"Shift+F3\":function ShiftF3(){return l('\\x1BO1;2R','\\x1B[28~')},\"Shift+F4\":function ShiftF4(){return l('\\x1BO1;2S','\\x1B[29~')},\"Shift+F5\":function ShiftF5(){return l('\\x1B[15;2~','\\x1B[31~')},\"Shift+F6\":function ShiftF6(){return l('\\x1B[17;2~','\\x1B[32~')},\"Shift+F7\":function ShiftF7(){return l('\\x1B[18;2~','\\x1B[33~')},\"Shift+F8\":function ShiftF8(){return l('\\x1B[19;2~','\\x1B[34~')},\"Shift+F9\":function ShiftF9(){return l('\\x1B[20;2~','\\x1B[35~')},\"Shift+F10\":function ShiftF10(){return l('\\x1B[21;2~','\\x1B[36~')},\"Shift+F11\":function ShiftF11(){return l('\\x1B[22;2~','\\x1B[37~')},\"Shift+F12\":function ShiftF12(){return l('\\x1B[23;2~','\\x1B[38~')},Numpad0:function Numpad0(){return n('\\x1BOp','0')},Numpad1:function Numpad1(){return n('\\x1BOq','1')},Numpad2:function Numpad2(){return n('\\x1BOr','2')},Numpad3:function Numpad3(){return n('\\x1BOs','3')},Numpad4:function Numpad4(){return n('\\x1BOt','4')},Numpad5:function Numpad5(){return n('\\x1BOu','5')},Numpad6:function Numpad6(){return n('\\x1BOv','6')},Numpad7:function Numpad7(){return n('\\x1BOw','7')},Numpad8:function Numpad8(){return n('\\x1BOx','8')},Numpad9:function Numpad9(){return n('\\x1BOy','9')},\"Numpad*\":function Numpad(){return n('\\x1BOR','*')},\"Numpad+\":function Numpad(){return n('\\x1BOl','+')},\"Numpad-\":function Numpad(){return n('\\x1BOS','-')},\"Numpad.\":function Numpad(){return n('\\x1BOn','.')},\"Numpad/\":function Numpad(){return n('\\x1BOQ','/')},\"Control+]\":'\\x1B',\"Control+\\\\\":'\\x1C',\"Control+[\":'\\x1D',\"Control+^\":'\\x1E',\"Control+_\":'\\x1F',\"Control+ArrowLeft\":'\\x1F[1;5D',\"Control+ArrowRight\":'\\x1F[1;5C',\"Control+ArrowUp\":'\\x1F[1;5A',\"Control+ArrowDown\":'\\x1F[1;5B',\"Control+Home\":'\\x1F[1;5H',\"Control+End\":'\\x1F[1;5F',\"Shift+ArrowLeft\":'\\x1F[1;2D',\"Shift+ArrowRight\":'\\x1F[1;2C',\"Shift+ArrowUp\":'\\x1F[1;2A',\"Shift+ArrowDown\":'\\x1F[1;2B',\"Shift+Home\":'\\x1F[1;2H',\"Shift+End\":'\\x1F[1;2F',\"Alt+ArrowLeft\":'\\x1Bb',\"Alt+ArrowRight\":'\\x1Bf',\"Meta+ArrowLeft\":'\\x01',\"Meta+ArrowRight\":'\\x05',\"Alt+Backspace\":'\\x17',\"Meta+Backspace\":'\\x15',\"Control+Shift+C\":function ControlShiftC(){b.copySelectionToClipboard()},\"Control+Insert\":function ControlInsert(){b.copySelectionToClipboard()},\"Control+F12\":function ControlF12(){b.window.debug^=1}};for(var z=1;26>=z;z++)o['Control+'+g(64+z)]=g(z);var p=function(){return!k.no_keys&&!(document.activeElement instanceof window.HTMLTextAreaElement)};var q=['F5','F11','F12','Shift+F5'];var r=function(a){if(p()&&!k.no_keys){var b=[];a.altKey&&b.push('Alt'),a.ctrlKey&&b.push('Control'),a.metaKey&&b.push('Meta'),a.shiftKey&&b.push('Shift');var d=j[a.which]||a.key;if(!((a.ctrlKey||a.metaKey)&&'V'===d)){var e=null;for(var f in o){var g=f.split('+');var h=g.pop();if(h===d&&g.sort().join()===b.join()){if(q.includes(f)&&!k.all_fn)continue;e=o[f];break}}e&&(e instanceof Function&&(e=e()),a.preventDefault(),'string'==typeof e&&c(e))}}};var s=0;var t=0;var u=0;var v=0;return window.addEventListener('keydown',function(a){a.ctrlKey&&(v|=1),a.shiftKey&&(v|=2),a.altKey&&(v|=4),a.metaKey&&(v|=8)}),window.addEventListener('keyup',function(a){v=0,a.ctrlKey&&(v|=1),a.shiftKey&&(v|=2),a.altKey&&(v|=4),a.metaKey&&(v|=8)}),h={init:function(a){e(a),$('#action-buttons button').forEach(function(a){a.addEventListener('click',function(){d(+this.dataset.n)})}),window.addEventListener('mousedown',function(a){0===a.button&&(s=1),1===a.button&&(t=1),2===a.button&&(u=1)}),window.addEventListener('mouseup',function(a){0===a.button&&(s=0),1===a.button&&(t=0),2===a.button&&(u=0)})},sendString:c,setAlts:function setAlts(a,b,c,d){(k.cu_alt!==a||k.np_alt!==b||k.fn_alt!==c||k.crlf_mode!==d)&&(k.cu_alt=a,k.np_alt=b,k.fn_alt=c,k.crlf_mode=d)},setMouseMode:function setMouseMode(a,b){k.mt_click=a,k.mt_move=b},onMouseMove:function onMouseMove(c,d){if(k.mt_move){var e=s?1:t?2:u?3:0;var b=f();a.send('m'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseDown:function onMouseDown(c,d,e){if(k.mt_click&&!(3e)){var b=f();a.send('p'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseUp:function onMouseUp(c,d,e){if(k.mt_click&&!(3e)){var b=f();a.send('r'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseWheel:function onMouseWheel(c,d,e){if(k.mt_click){var g=f();var h=0>e?4:5;a.send('p'+encode2B(d)+encode2B(c)+encode2B(h)+encode2B(g))}},blockKeys:function blockKeys(a){k.no_keys=a},handleKeyDown:r},h};\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var _require=__webpack_require__(0),qs=_require.qs;var modal=__webpack_require__(2);module.exports=function(a,b,c){function d(){f('Ready...'),modal.show('#fu_modal',e),$('#fu_form').toggleClass('busy',!1),b.blockKeys(!0)}function e(){console.log('Upload modal closed.'),clearTimeout(m),l=0,b.blockKeys(!1)}function f(a){qs('#fu_prog').textContent=a}function g(){var a=qs('#fu_text').value;return a.length?void(k=a.split('\\n'),l=0,q=0,n=qs('#fu_delay').value,0>n&&(n=0,qs('#fu_delay').value=n),o={CR:'\\r',LF:'\\n',CRLF:'\\r\\n'}[qs('#fu_crlf').value],$('#fu_form').toggleClass('busy',!0),f('Starting...'),h()):void j()}function h(){if($('#fu_modal').hasClass('visible')){if(!a.canSend())return void(m=setTimeout(h,1));0===q&&(p='',0===l&&c.bracketedPaste&&(p='\\x1B[200~'),p+=k[l++]+o,l===k.length&&c.bracketedPaste&&(p+='\\x1B[201~'));var d;if(p.length-q<=r?(d=p.substr(q,r),q=0):(d=p.substr(q,r),q+=r),!b.sendString(d))return void f('FAILED!');var e=Math.round(1e3*(l/k.length))/10;f(l+' / '+k.length+' ('+e+'%)'),k.length>l||0g.length?a.startsWith(g)?b.sendString(a.substr(g.length)):c=!0:a.lengthg.length&&(g=('0000'+g).substr(-4)),g='U+'+g,p.textContent='Cursor cell ('+b+'): '+g+' FG: '+c+' BG: '+d+' Attrs: '+f.toString(2)}})};\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// app.310033b.js"," \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, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\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 \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 21d3956fd434cbda121b","/** Make a node */\nexports.mk = function mk (e) {\n return document.createElement(e)\n}\n\n/** Find one by query */\nexports.qs = function qs (s) {\n return document.querySelector(s)\n}\n\n/** Find all by query */\nexports.qsa = function qsa (s) {\n return document.querySelectorAll(s)\n}\n\n/**\n * Filter 'spacebar' and 'return' from keypress handler,\n * and when they're pressed, fire the callback.\n * use $(...).on('keypress', cr(handler))\n */\nexports.cr = function cr (hdl) {\n return function (e) {\n if (e.which === 10 || e.which === 13 || e.which === 32) {\n hdl()\n }\n }\n}\n\n/** Convert any to bool safely */\nexports.bool = function bool (x) {\n return (x === 1 || x === '1' || x === true || x === 'true')\n}\n\n/** Decode number from 2B encoding */\nexports.parse2B = function parse2B (s, i = 0) {\n return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127\n}\n\n/** Decode number from 3B encoding */\nexports.parse3B = function parse3B (s, i = 0) {\n return (s.charCodeAt(i) - 1) + (s.charCodeAt(i + 1) - 1) * 127 + (s.charCodeAt(i + 2) - 1) * 127 * 127\n}\n\n/** Encode using 2B encoding, returns string. */\nexports.encode2B = function encode2B (n) {\n let lsb, msb\n lsb = (n % 127)\n n = ((n - lsb) / 127)\n lsb += 1\n msb = (n + 1)\n return String.fromCharCode(lsb) + String.fromCharCode(msb)\n}\n\n/** Encode using 3B encoding, returns string. */\nexports.encode3B = function encode3B (n) {\n let lsb, msb, xsb\n lsb = (n % 127)\n n = (n - lsb) / 127\n lsb += 1\n msb = (n % 127)\n n = (n - msb) / 127\n msb += 1\n xsb = (n + 1)\n return String.fromCharCode(lsb) + String.fromCharCode(msb) + String.fromCharCode(xsb)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/utils.js","/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */\n\n// MODIFIED VERSION.\n(function () {\n\t'use strict';\n\n\tvar readyfn = [],\n\t\tloadedfn = [],\n\t\tdomready = false,\n\t\tpageloaded = false,\n\t\td = document,\n\t\tw = window;\n\n\t// Fire any function calls on ready event\n\tfunction fireReady() {\n\t\tvar i;\n\t\tdomready = true;\n\t\tfor (i = 0; i < readyfn.length; i += 1) {\n\t\t\treadyfn[i]();\n\t\t}\n\t\treadyfn = [];\n\t}\n\n\t// Fire any function calls on loaded event\n\tfunction fireLoaded() {\n\t\tvar i;\n\t\tpageloaded = true;\n\t\t// For browsers with no DOM loaded support\n\t\tif (!domready) {\n\t\t\tfireReady();\n\t\t}\n\t\tfor (i = 0; i < loadedfn.length; i += 1) {\n\t\t\tloadedfn[i]();\n\t\t}\n\t\tloadedfn = [];\n\t}\n\n\t// Check DOM ready, page loaded\n\tif (d.addEventListener) {\n\t\t// Standards\n\t\td.addEventListener('DOMContentLoaded', fireReady, false);\n\t\tw.addEventListener('load', fireLoaded, false);\n\t} else if (d.attachEvent) {\n\t\t// IE\n\t\td.attachEvent('onreadystatechange', fireReady);\n\t\t// IE < 9\n\t\tw.attachEvent('onload', fireLoaded);\n\t} else {\n\t\t// Anything else\n\t\tw.onload = fireLoaded;\n\t}\n\n\t// Utility functions\n\n\t// Loop through node array\n\tfunction nodeLoop(fn, nodes) {\n\t\tvar i;\n\t\t// Good idea to walk up the DOM\n\t\tfor (i = nodes.length - 1; i >= 0; i -= 1) {\n\t\t\tfn(nodes[i]);\n\t\t}\n\t}\n\n\t// Convert to camel case\n\tfunction cssCamel(property) {\n\t\treturn property.replace(/-\\w/g, function (result) {\n\t\t\treturn result.charAt(1).toUpperCase();\n\t\t});\n\t}\n\n\t// Get computed style\n\tfunction computeStyle(elm, property) {\n\t\t// IE, everything else or null\n\t\treturn (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null;\n\n\t}\n\n\t// Returns URI encoded query string pair\n\tfunction queryPair(name, value) {\n\t\treturn encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+');\n\t}\n\n\t// Set CSS, important to wrap in try to prevent error thown on unsupported property\n\tfunction setCss(elm, property, value) {\n\t\ttry {\n\t\t\telm.style[cssCamel(property)] = value;\n\t\t} catch (e) {\n\t\t}\n\t}\n\n\t// Show CSS\n\tfunction showCss(elm) {\n\t\telm.style.display = '';\n\t\t// For elements still hidden by style block\n\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\telm.style.display = 'block';\n\t\t}\n\t}\n\n\t// Serialize form & JSON values\n\tfunction serializeData(nodes) {\n\t\tvar querystring = '', subelm, i, j;\n\t\tif (nodes.constructor === Object) { // Serialize JSON data\n\t\t\tfor (subelm in nodes) {\n\t\t\t\tif (nodes.hasOwnProperty(subelm)) {\n\t\t\t\t\tif (nodes[subelm].constructor === Array) {\n\t\t\t\t\t\tfor (i = 0; i < nodes[subelm].length; i += 1) {\n\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm][i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else { // Serialize node data\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (elm.nodeName === 'FORM') {\n\t\t\t\t\tfor (i = 0; i < elm.elements.length; i += 1) {\n\t\t\t\t\t\tsubelm = elm.elements[i];\n\n\t\t\t\t\t\tif (!subelm.disabled) {\n\t\t\t\t\t\t\tswitch (subelm.type) {\n\t\t\t\t\t\t\t\t// Ignore buttons, unsupported XHR 1 form fields\n\t\t\t\t\t\t\t\tcase 'button':\n\t\t\t\t\t\t\t\tcase 'image':\n\t\t\t\t\t\t\t\tcase 'file':\n\t\t\t\t\t\t\t\tcase 'submit':\n\t\t\t\t\t\t\t\tcase 'reset':\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-one':\n\t\t\t\t\t\t\t\t\tif (subelm.length > 0) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-multiple':\n\t\t\t\t\t\t\t\t\tfor (j = 0; j < subelm.length; j += 1) {\n\t\t\t\t\t\t\t\t\t\tif (subelm[j].selected) {\n\t\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm[j].value);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'checkbox':\n\t\t\t\t\t\t\t\tcase 'radio':\n\t\t\t\t\t\t\t\t\tif (subelm.checked) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t// Everything else including shinny new HTML5 input types\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\t// Tidy up first &\n\t\treturn (querystring.length > 0) ? querystring.substring(1) : '';\n\t}\n\n\t// Class helper\n\tfunction classHelper(classes, action, nodes) {\n\t\tvar classarray, search, i, replace, has = false;\n\t\tif (classes) {\n\t\t\t// Trim any whitespace\n\t\t\tclassarray = classes.split(/\\s+/);\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tfor (i = 0; i < classarray.length; i += 1) {\n\t\t\t\t\tvar clz = classarray[i];\n\t\t\t\t\tif (action === 'remove') {\n\t\t\t\t\t\telm.classList.remove(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'add') {\n\t\t\t\t\t\telm.classList.add(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'toggle') {\n\t\t\t\t\t\telm.classList.toggle(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'has') {\n\t\t\t\t\t\tif (elm.classList.contains(clz)) {\n\t\t\t\t\t\t\thas = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// search = new RegExp('\\\\b' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// replace = new RegExp(' *' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// if (action === 'remove') {\n\t\t\t\t\t// \telm.className = elm.className.replace(search, '');\n\t\t\t\t\t// } else if (action === 'toggle') {\n\t\t\t\t\t// \telm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i];\n\t\t\t\t\t// } else if (action === 'has') {\n\t\t\t\t\t// \tif (elm.className.match(search)) {\n\t\t\t\t\t// \t\thas = true;\n\t\t\t\t\t// \t\tbreak;\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\treturn has;\n\t}\n\n\t// HTML insertion helper\n\tfunction insertHtml(value, position, nodes) {\n\t\tvar tmpnodes, tmpnode;\n\t\tif (value) {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead\n\t\t\t\t// Convert string to node. We can't innerHTML on a document fragment\n\t\t\t\ttmpnodes = d.createElement('div');\n\t\t\t\ttmpnodes.innerHTML = value;\n\t\t\t\twhile ((tmpnode = tmpnodes.lastChild) !== null) {\n\t\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (position === 'before') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm);\n\t\t\t\t\t\t} else if (position === 'after') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm.nextSibling);\n\t\t\t\t\t\t} else if (position === 'append') {\n\t\t\t\t\t\t\telm.appendChild(tmpnode);\n\t\t\t\t\t\t} else if (position === 'prepend') {\n\t\t\t\t\t\t\telm.insertBefore(tmpnode, elm.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t}\n\n\t// Get nodes and return chibi\n\tfunction chibi(selector) {\n\t\tvar cb, nodes = [], json = false, nodelist, i;\n\n\t\tif (selector) {\n\n\t\t\t// Element node, would prefer to use (selector instanceof HTMLElement) but no IE support\n\t\t\tif (selector.nodeType && selector.nodeType === 1) {\n\t\t\t\tnodes = [selector]; // return element as node list\n\t\t\t} else if (typeof selector === 'object') {\n\t\t\t\t// JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support\n\t\t\t\tjson = (typeof selector.length !== 'number');\n\t\t\t\tnodes = selector;\n\t\t\t} else if (typeof selector === 'string') {\n\t\t\t\tnodelist = d.querySelectorAll(selector);\n\n\t\t\t\t// Convert node list to array so results have full access to array methods\n\t\t\t\t// Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway\n\t\t\t\tfor (i = 0; i < nodelist.length; i += 1) {\n\t\t\t\t\tnodes[i] = nodelist[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Only attach nodes if not JSON\n\t\tcb = json ? {} : nodes;\n\n\t\t// Public functions\n\n\t\t// Executes a function on nodes\n\t\tcb.each = function (fn) {\n\t\t\tif (typeof fn === 'function') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply\n\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Find first\n\t\tcb.first = function () {\n\t\t\treturn chibi(nodes.shift());\n\t\t};\n\t\t// Find last\n\t\tcb.last = function () {\n\t\t\treturn chibi(nodes.pop());\n\t\t};\n\t\t// Find odd\n\t\tcb.odd = function () {\n\t\t\tvar odds = [], i;\n\t\t\tfor (i = 0; i < nodes.length; i += 2) {\n\t\t\t\todds.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(odds);\n\t\t};\n\t\t// Find even\n\t\tcb.even = function () {\n\t\t\tvar evens = [], i;\n\t\t\tfor (i = 1; i < nodes.length; i += 2) {\n\t\t\t\tevens.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(evens);\n\t\t};\n\t\t// Hide node\n\t\tcb.hide = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\telm.style.display = 'none';\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Show node\n\t\tcb.show = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tshowCss(elm);\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle node display\n\t\tcb.toggle = function (state) {\n\t\t\tif (typeof state != 'undefined') { // ADDED\n\t\t\t\tif (state)\n\t\t\t\t\tcb.show();\n\t\t\t\telse\n\t\t\t\t\tcb.hide();\n\t\t\t} else {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// computeStyle instead of style.display == 'none' catches elements that are hidden via style block\n\t\t\t\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\t\t\t\tshowCss(elm);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telm.style.display = 'none';\n\t\t\t\t\t}\n\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove node\n\t\tcb.remove = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\ttry {\n\t\t\t\t\telm.parentNode.removeChild(elm);\n\t\t\t\t} catch (e) {\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn chibi();\n\t\t};\n\t\t// Get/Set CSS\n\t\tcb.css = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tif (value || value === '') {\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tsetCss(elm, property, value);\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (nodes[0].style[cssCamel(property)]) {\n\t\t\t\t\t\treturn nodes[0].style[cssCamel(property)];\n\t\t\t\t\t}\n\t\t\t\t\tif (computeStyle(nodes[0], property)) {\n\t\t\t\t\t\treturn computeStyle(nodes[0], property);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get class(es)\n\t\tcb.getClass = function () {\n\t\t\tif (nodes[0] && nodes[0].className.length > 0) {\n\t\t\t\t// Weak IE trim support\n\t\t\t\treturn nodes[0].className.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '').replace(/\\s+/, ' ');\n\t\t\t}\n\t\t};\n\t\t// Set (replaces) classes\n\t\tcb.setClass = function (classes) {\n\t\t\tif (classes || classes === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.className = classes;\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Add class\n\t\tcb.addClass = function (classes) {\n\t\t\tclassHelper(classes, 'add', nodes);\n\t\t\t// if (classes) {\n\t\t\t// \tnodeLoop(function (elm) {\n\t\t\t// \t\telm.className += ' ' + classes;\n\t\t\t// \t}, nodes);\n\t\t\t// }\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove class\n\t\tcb.removeClass = function (classes) {\n\t\t\tclassHelper(classes, 'remove', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle class\n\t\tcb.toggleClass = function (classes, set) {\n\t\t\tvar method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove'));\n\t\t\tclassHelper(classes, method, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Has class\n\t\tcb.hasClass = function (classes) {\n\t\t\treturn classHelper(classes, 'has', nodes);\n\t\t};\n\t\t// Get/set HTML\n\t\tcb.html = function (value) {\n\t\t\tif (value || value === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.innerHTML = value;\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\treturn nodes[0].innerHTML;\n\t\t\t}\n\t\t};\n\t\t// Insert HTML before selector\n\t\tcb.htmlBefore = function (value) {\n\t\t\tinsertHtml(value, 'before', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector\n\t\tcb.htmlAfter = function (value) {\n\t\t\tinsertHtml(value, 'after', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector innerHTML\n\t\tcb.htmlAppend = function (value) {\n\t\t\tinsertHtml(value, 'append', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML before selector innerHTML\n\t\tcb.htmlPrepend = function (value) {\n\t\t\tinsertHtml(value, 'prepend', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Get/Set HTML attributes\n\t\tcb.attr = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tproperty = property.toLowerCase();\n\t\t\t\t// IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway\n\t\t\t\tif (typeof value !== 'undefined') {//FIXED BUG HERE\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\t\telm.style.cssText = value;\n\t\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\t\telm.className = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telm.setAttribute(property, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\tif (nodes[0].style.cssText) {\n\t\t\t\t\t\t\treturn nodes[0].style.cssText;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\tif (nodes[0].className) {\n\t\t\t\t\t\t\treturn nodes[0].className;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (nodes[0].getAttribute(property)) {\n\t\t\t\t\t\t\treturn nodes[0].getAttribute(property);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get/Set HTML data property\n\t\tcb.data = function (key, value) {\n\t\t\tif (key) {\n\t\t\t\treturn cb.attr('data-' + key, value);\n\t\t\t}\n\t\t};\n\t\t// Get/Set form element values\n\t\tcb.val = function (value) {\n\t\t\tvar values, i, j;\n\t\t\tif (typeof value != 'undefined') { // FIXED A BUG HERE\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tswitch (elm.nodeName) {\n\t\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\t\t\t\tvalue = [value];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (i = 0; i < elm.length; i += 1) {\n\t\t\t\t\t\t\t\t// Multiple select\n\t\t\t\t\t\t\t\tfor (j = 0; j < value.length; j += 1) {\n\t\t\t\t\t\t\t\t\telm[i].selected = '';\n\t\t\t\t\t\t\t\t\tif (elm[i].value === \"\"+value[j]) {\n\t\t\t\t\t\t\t\t\t\telm[i].selected = 'selected';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\t\telm.value = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\tswitch (nodes[0].nodeName) {\n\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\tvalues = [];\n\t\t\t\t\t\tfor (i = 0; i < nodes[0].length; i += 1) {\n\t\t\t\t\t\t\tif (nodes[0][i].selected) {\n\t\t\t\t\t\t\t\tvalues.push(nodes[0][i].value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (values.length > 1) ? values : values[0];\n\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\treturn nodes[0].value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Return matching checked checkbox or radios\n\t\tcb.checked = function (check) {\n\t\t\tif (typeof check === 'boolean') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tif (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) {\n\t\t\t\t\t\telm.checked = check;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) {\n\t\t\t\treturn (!!nodes[0].checked);\n\t\t\t}\n\t\t};\n\t\t// Add event handler\n\t\tcb.on = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.addEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions)\n\t\t\t\t\telm[event + fn] = function () {\n\t\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t\t};\n\t\t\t\t\telm.attachEvent('on' + event, elm[event + fn]);\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove event handler\n\t\tcb.off = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.removeEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\telm.detachEvent('on' + event, elm[event + fn]);\n\t\t\t\t\t// Tidy up\n\t\t\t\t\telm[event + fn] = null;\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\treturn cb;\n\t}\n\n\t// Basic XHR\n\tchibi.ajax = function (options) { // if options is a number, it's timeout in ms\n\t\tvar opts = Object.assign({\n\t\t\tmethod: 'GET',\n\t\t\tnocache: true,\n\t\t\ttimeout: 5000,\n\t\t\tloader: true,\n\t\t\tcallback: null\n\t\t}, options);\n\t\topts.method = opts.method.toUpperCase();\n\n\t\tvar loaderFn = opts.loader ? chibi._loader : function(){};\n\t\tvar url = opts.url;\n\t\tvar method = opts.method;\n\t\tvar query = null;\n\n\t\tif (opts.data) {\n\t\t\tquery = serializeData(opts.data);\n\t\t}\n\n\t\tif (query && (method === 'GET')) {\n\t\t\turl += (url.indexOf('?') === -1) ? '?' + query : '&' + query;\n\t\t\tquery = null;\n\t\t}\n\n\t\tvar xhr = new XMLHttpRequest();\n\n\t\t// prevent caching\n\t\tif (opts.nocache) {\n\t\t\tvar ts = (+(new Date())).toString(36);\n\t\t\turl += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts;\n\t\t}\n\n\t\tloaderFn(true);\n\n\t\txhr.open(method, url, true);\n\t\txhr.timeout = opts.timeout;\n\n\t\t// Abort after given timeout\n\t\tvar abortTmeo = setTimeout(function () {\n\t\t\tconsole.error(\"XHR timed out.\");\n\t\t\txhr.abort();\n\t\t\tloaderFn(false);\n\t\t}, opts.timeout + 10);\n\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tloaderFn(false);\n\n\t\t\t\topts.callback && opts.callback(xhr.responseText, xhr.status);\n\n\t\t\t\tclearTimeout(abortTmeo);\n\t\t\t}\n\t\t};\n\n\t\txhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\tif (method === 'POST') {\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t}\n\n\t\txhr.send(query);\n\t\treturn xhr;\n\t};\n\n\tchibi._loader = function(){};\n\n\t// Alias to cb.ajax(url, 'get', callback)\n\tchibi.get = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'GET';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Alias to cb.ajax(url, 'post', callback)\n\tchibi.post = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'POST';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Fire on DOM ready\n\tchibi.ready = function (fn) {\n\t\tif (fn) {\n\t\t\tif (domready) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\treadyfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\t// Fire on page loaded\n\tchibi.loaded = function (fn) {\n\t\tif (fn) {\n\t\t\tif (pageloaded) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\tloadedfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar entityMap = {\n\t\t'&': '&',\n\t\t'<': '<',\n\t\t'>': '>',\n\t\t'\"': '"',\n\t\t\"'\": ''',\n\t\t'/': '/',\n\t\t'`': '`',\n\t\t'=': '='\n\t};\n\n\tchibi.htmlEscape = function(string) {\n\t\treturn String(string).replace(/[&<>\"'`=\\/]/g, function (s) {\n\t\t\treturn entityMap[s];\n\t\t});\n\t};\n\n\t// Set Chibi's global namespace here ($)\n\tmodule.exports = chibi;\n}());\n\n\n\n// WEBPACK FOOTER //\n// ./js/lib/chibi.js","const $ = require('./lib/chibi')\n\n/** Module for toggling a modal overlay */\nlet modal = {}\nlet curCloseCb = null\n\nmodal.show = function (sel, closeCb) {\n let $m = $(sel)\n $m.removeClass('hidden visible')\n setTimeout(function () {\n $m.addClass('visible')\n }, 1)\n curCloseCb = closeCb\n}\n\nmodal.hide = function (sel) {\n let $m = $(sel)\n $m.removeClass('visible')\n setTimeout(function () {\n $m.addClass('hidden')\n if (curCloseCb) curCloseCb()\n }, 500) // transition time\n}\n\nmodal.init = function () {\n // close modal by click outside the dialog\n $('.Modal').on('click', function () {\n if ($(this).hasClass('no-close')) return // this is a no-close modal\n modal.hide(this)\n })\n\n $('.Dialog').on('click', function (e) {\n e.stopImmediatePropagation()\n })\n\n // Hide all modals on esc\n $(window).on('keydown', function (e) {\n if (e.which === 27) {\n modal.hide('.Modal')\n }\n })\n}\n\nmodule.exports = modal\n\n\n\n// WEBPACK FOOTER //\n// ./js/modal.js","const $ = require('./lib/chibi')\nconst modal = require('./modal')\n\nlet nt = {}\nconst sel = '#notif'\nlet $balloon\n\nlet timerHideBegin // timeout to start hiding (transition)\nlet timerHideEnd // timeout to add the hidden class\nlet canCancel = false\n\nlet stopTimeouts = function () {\n clearTimeout(timerHideBegin)\n clearTimeout(timerHideEnd)\n}\n\nnt.show = function (message, timeout, isError) {\n $balloon.toggleClass('error', isError === true)\n $balloon.html(message)\n modal.show($balloon)\n stopTimeouts()\n\n if (!timeout || timeout <= 0) {\n timeout = 2500\n }\n\n timerHideBegin = setTimeout(nt.hide, timeout)\n\n canCancel = false\n setTimeout(() => {\n canCancel = true\n }, 500)\n}\n\nnt.hide = function () {\n let $m = $(sel)\n $m.removeClass('visible')\n timerHideEnd = setTimeout(function () {\n $m.addClass('hidden')\n }, 250) // transition time\n}\n\nnt.init = function () {\n $balloon = $(sel)\n\n // close by click outside\n $(document).on('click', function () {\n if (!canCancel) return\n nt.hide(this)\n })\n\n // click caused by selecting, prevent it from bubbling\n $balloon.on('click', function (e) {\n e.stopImmediatePropagation()\n return false\n })\n\n // stop fading if moused\n $balloon.on('mouseenter', function () {\n stopTimeouts()\n $balloon.removeClass('hidden').addClass('visible')\n })\n}\n\nmodule.exports = nt\n\n\n\n// WEBPACK FOOTER //\n// ./js/notif.js","\nconst themes = exports.themes = [\n [ // Tango\n '#111213', '#CC0000', '#4E9A06', '#C4A000', '#3465A4', '#75507B', '#06989A', '#D3D7CF',\n '#555753', '#EF2929', '#8AE234', '#FCE94F', '#729FCF', '#AD7FA8', '#34E2E2', '#EEEEEC'\n ],\n [ // Linux (CGA)\n '#000000', '#aa0000', '#00aa00', '#aa5500', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa',\n '#555555', '#ff5555', '#55ff55', '#ffff55', '#5555ff', '#ff55ff', '#55ffff', '#ffffff'\n ],\n [ // xterm\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5',\n '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // rxvt\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000cd', '#cd00cd', '#00cdcd', '#faebd7',\n '#404040', '#ff0000', '#00ff00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // Ambience\n '#2e3436', '#cc0000', '#4e9a06', '#c4a000', '#3465a4', '#75507b', '#06989a', '#d3d7cf',\n '#555753', '#ef2929', '#8ae234', '#fce94f', '#729fcf', '#ad7fa8', '#34e2e2', '#eeeeec'\n ],\n [ // Solarized light\n '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5',\n '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3'\n ],\n [ // Solarized dark\n '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5',\n '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3'\n ],\n [ // CGA NTSC\n '#000000', '#69001A', '#117800', '#769100', '#1A00A6', '#8019AB', '#289E76', '#A4A4A4',\n '#484848', '#C54E76', '#6DD441', '#D2ED46', '#765BFF', '#DC75FF', '#84FAD2', '#FFFFFF'\n ],\n [ // ZX Spectrum\n '#000000', '#aa0000', '#00aa00', '#aaaa00', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa',\n '#000000', '#ff0000', '#00FF00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // Apple II\n '#000000', '#722640', '#0E5940', '#808080', '#40337F', '#E434FE', '#1B9AFE', '#BFB3FF',\n '#404C00', '#E46501', '#1BCB01', '#BFCC80', '#808080', '#F1A6BF', '#8DD9BF', '#ffffff'\n ],\n [ // Commodore\n '#000000', '#8D3E37', '#55A049', '#AAB95D', '#40318D', '#80348B', '#72C1C8', '#D59F74',\n '#8B5429', '#B86962', '#94E089', '#FFFFB2', '#8071CC', '#AA5FB6', '#87D6DD', '#ffffff'\n ]\n]\n\nexports.fgbgThemes = [\n ['#aaaaaa', '#000000'], // grey_on_black\n ['#000000', '#ffffdd'], // black_on_yellow\n ['#000000', '#ffffff'], // black_on_white\n ['#ffffff', '#000000'], // white_on_black\n ['#00ff00', '#000000'], // green_on_black\n ['#e53c00', '#000000'], // orange_on_black\n ['#ffffff', '#300a24'], // ambience\n ['#657b83', '#fdf6e3'], // solarized_light\n ['#839496', '#002b36'] // solarized_dark\n]\n\nlet colorTable256 = null\n\nexports.buildColorTable = function () {\n if (colorTable256 !== null) return colorTable256\n\n // 256color lookup table\n // should not be used to look up 0-15 (will return transparent)\n colorTable256 = new Array(16).fill('rgba(0, 0, 0, 0)')\n\n // fill color table\n // colors 16-231 are a 6x6x6 color cube\n for (let red = 0; red < 6; red++) {\n for (let green = 0; green < 6; green++) {\n for (let blue = 0; blue < 6; blue++) {\n let redValue = red * 40 + (red ? 55 : 0)\n let greenValue = green * 40 + (green ? 55 : 0)\n let blueValue = blue * 40 + (blue ? 55 : 0)\n colorTable256.push(`rgb(${redValue}, ${greenValue}, ${blueValue})`)\n }\n }\n }\n // colors 232-255 are a grayscale ramp, sans black and white\n for (let gray = 0; gray < 24; gray++) {\n let value = gray * 10 + 8\n colorTable256.push(`rgb(${value}, ${value}, ${value})`)\n }\n\n return colorTable256\n}\n\nexports.SELECTION_FG = '#333'\nexports.SELECTION_BG = '#b2d7fe'\n\nexports.themePreview = function (n) {\n document.querySelectorAll('[data-fg]').forEach((elem) => {\n let shade = +elem.dataset.fg\n elem.style.color = themes[n][shade]\n })\n document.querySelectorAll('[data-bg]').forEach((elem) => {\n let shade = +elem.dataset.bg\n elem.style.backgroundColor = themes[n][shade]\n })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/themes.js","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/events/events.js\n// module id = 5\n// module chunks = 0","const EventEmitter = require('events')\nconst { parse2B } = require('../utils')\nconst { themes } = require('./themes')\n\nclass ANSIParser {\n constructor (handler) {\n this.reset()\n this.handler = handler\n this.joinChunks = true\n }\n reset () {\n this.currentSequence = 0\n this.sequence = ''\n }\n parseSequence (sequence) {\n if (sequence[0] === '[') {\n let type = sequence[sequence.length - 1]\n let content = sequence.substring(1, sequence.length - 1)\n\n let numbers = content ? content.split(';').map(i => +i.replace(/\\D/g, '')) : []\n let numOr1 = numbers.length ? numbers[0] : 1\n if (type === 'H') {\n this.handler('set-cursor', (numbers[0] | 0) - 1, (numbers[1] | 0) - 1)\n } else if (type >= 'A' && type <= 'D') {\n this.handler(`move-cursor-${type <= 'B' ? 'y' : 'x'}`, ((type === 'B' || type === 'C') ? 1 : -1) * numOr1)\n } else if (type === 'E' || type === 'F') {\n this.handler('move-cursor-line', (type === 'E' ? 1 : -1) * numOr1)\n } else if (type === 'G') {\n this.handler('set-cursor-x', numOr1 - 1)\n } else if (type === 'J') {\n let number = numbers.length ? numbers[0] : 2\n if (number === 2) this.handler('clear')\n } else if (type === 'P') {\n this.handler('delete', numOr1)\n } else if (type === '@') {\n this.handler('insert-blanks', numOr1)\n } else if (type === 'q') this.handler('set-cursor-style', numOr1)\n else if (type === 'm') {\n if (!numbers.length || numbers[0] === 0) {\n this.handler('reset-style')\n return\n }\n let type = numbers[0]\n if (type === 1) this.handler('add-attrs', 1) // bold\n else if (type === 2) this.handler('add-attrs', 1 << 1) // faint\n else if (type === 3) this.handler('add-attrs', 1 << 2) // italic\n else if (type === 4) this.handler('add-attrs', 1 << 3) // underline\n else if (type === 5 || type === 6) this.handler('add-attrs', 1 << 4) // blink\n else if (type === 7) this.handler('add-attrs', -1) // invert\n else if (type === 9) this.handler('add-attrs', 1 << 6) // strike\n else if (type === 20) this.handler('add-attrs', 1 << 5) // fraktur\n else if (type >= 30 && type <= 37) this.handler('set-color-fg', type % 10)\n else if (type >= 40 && type <= 47) this.handler('set-color-bg', type % 10)\n else if (type === 39) this.handler('reset-color-fg')\n else if (type === 49) this.handler('reset-color-bg')\n else if (type >= 90 && type <= 98) this.handler('set-color-fg', (type % 10) + 8)\n else if (type >= 100 && type <= 108) this.handler('set-color-bg', (type % 10) + 8)\n else if (type === 38 || type === 48) {\n if (numbers[1] === 5) {\n let color = (numbers[2] | 0) & 0xFF\n if (type === 38) this.handler('set-color-fg', color)\n if (type === 48) this.handler('set-color-bg', color)\n }\n }\n } else if (type === 'h' || type === 'l') {\n if (content === '?25') {\n if (type === 'h') this.handler('show-cursor')\n else if (type === 'l') this.handler('hide-cursor')\n }\n }\n }\n }\n write (text) {\n for (let character of text.toString()) {\n let code = character.codePointAt(0)\n if (code === 0x1b) this.currentSequence = 1\n else if (this.currentSequence === 1 && character === '[') {\n this.currentSequence = 2\n this.sequence += '['\n } else if (this.currentSequence && character.match(/[\\x40-\\x7e]/)) {\n this.parseSequence(this.sequence + character)\n this.currentSequence = 0\n this.sequence = ''\n } else if (this.currentSequence > 1) this.sequence += character\n else if (this.currentSequence === 1) {\n // something something nothing\n this.currentSequence = 0\n this.handler('write', character)\n } else if (code < 0x03) this.handler('_null')\n else if (code === 0x03) this.handler('sigint')\n else if (code <= 0x06) this.handler('_null')\n else if (code === 0x07) this.handler('bell')\n else if (code === 0x08) this.handler('back')\n else if (code === 0x09) this.handler('tab')\n else if (code === 0x0a) this.handler('new-line')\n else if (code === 0x0d) this.handler('return')\n else if (code === 0x15) this.handler('delete-line')\n else if (code === 0x17) this.handler('delete-word')\n else this.handler('write', character)\n }\n if (!this.joinChunks) this.reset()\n }\n}\nconst TERM_DEFAULT_STYLE = 0\nconst TERM_MIN_DRAW_DELAY = 10\n\nlet getRainbowColor = t => {\n let r = Math.floor(Math.sin(t) * 2.5 + 2.5)\n let g = Math.floor(Math.sin(t + 2 / 3 * Math.PI) * 2.5 + 2.5)\n let b = Math.floor(Math.sin(t + 4 / 3 * Math.PI) * 2.5 + 2.5)\n return 16 + 36 * r + 6 * g + b\n}\n\nclass ScrollingTerminal {\n constructor (screen) {\n this.width = 80\n this.height = 25\n this.termScreen = screen\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n\n this.reset()\n\n this._lastLoad = Date.now()\n this.termScreen.load(this.serialize())\n\n window.showPage()\n }\n reset () {\n this.style = TERM_DEFAULT_STYLE\n this.cursor = { x: 0, y: 0, style: 1, visible: true }\n this.trackMouse = false\n this.theme = -1\n this.rainbow = false\n this.parser.reset()\n this.clear()\n }\n clear () {\n this.screen = []\n for (let i = 0; i < this.width * this.height; i++) {\n this.screen.push([' ', this.style])\n }\n }\n scroll () {\n this.screen.splice(0, this.width)\n for (let i = 0; i < this.width; i++) {\n this.screen.push([' ', TERM_DEFAULT_STYLE])\n }\n this.cursor.y--\n }\n newLine () {\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n writeChar (character) {\n this.screen[this.cursor.y * this.width + this.cursor.x] = [character, this.style]\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.newLine()\n }\n }\n moveBack (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x--\n if (this.cursor.x < 0) {\n if (this.cursor.y > 0) this.cursor.x = this.width - 1\n else this.cursor.x = 0\n this.cursor.y = Math.max(0, this.cursor.y - 1)\n }\n }\n }\n moveForward (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n }\n }\n deleteChar () { // FIXME unused?\n this.moveBack()\n this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, 1)\n }\n deleteForward (n) {\n n = Math.min(this.width, n)\n for (let i = 0; i < n; i++) this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, n)\n }\n clampCursor () {\n if (this.cursor.x < 0) this.cursor.x = 0\n if (this.cursor.y < 0) this.cursor.y = 0\n if (this.cursor.x > this.width - 1) this.cursor.x = this.width - 1\n if (this.cursor.y > this.height - 1) this.cursor.y = this.height - 1\n }\n handleParsed (action, ...args) {\n if (action === 'write') {\n this.writeChar(args[0])\n } else if (action === 'delete') {\n this.deleteForward(args[0])\n } else if (action === 'insert-blanks') {\n this.insertBlanks(args[0]) // FIXME undefined?\n } else if (action === 'clear') {\n this.clear()\n } else if (action === 'bell') {\n this.termScreen.load('B')\n } else if (action === 'back') {\n this.moveBack()\n } else if (action === 'new-line') {\n this.newLine()\n } else if (action === 'return') {\n this.cursor.x = 0\n } else if (action === 'set-cursor') {\n this.cursor.x = args[1]\n this.cursor.y = args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-y') {\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-x') {\n this.cursor.x += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-line') {\n this.cursor.x = 0\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'set-cursor-x') {\n this.cursor.x = args[0]\n } else if (action === 'set-cursor-style') {\n this.cursor.style = Math.max(0, Math.min(6, args[0]))\n } else if (action === 'reset-style') {\n this.style = TERM_DEFAULT_STYLE\n } else if (action === 'add-attrs') {\n this.style |= (args[0] << 16)\n } else if (action === 'set-color-fg') {\n this.style = (this.style & 0xFFFFFF00) | (1 << 8 << 16) | args[0]\n } else if (action === 'set-color-bg') {\n this.style = (this.style & 0xFFFF00FF) | (1 << 9 << 16) | (args[0] << 8)\n } else if (action === 'reset-color-fg') {\n this.style = this.style & 0xFFFEFF00\n } else if (action === 'reset-color-bg') {\n this.style = this.style & 0xFFFD00FF\n } else if (action === 'hide-cursor') {\n this.cursor.visible = false\n } else if (action === 'show-cursor') {\n this.cursor.visible = true\n }\n }\n write (text) {\n this.parser.write(text)\n this.scheduleLoad()\n }\n serialize () {\n let serialized = 'S'\n serialized += String.fromCodePoint(this.height + 1) + String.fromCodePoint(this.width + 1)\n serialized += String.fromCodePoint(this.cursor.y + 1) + String.fromCodePoint(this.cursor.x + 1)\n\n let attributes = +this.cursor.visible\n attributes |= (3 << 5) * +this.trackMouse // track mouse controls both\n attributes |= 3 << 7 // buttons/links always visible\n attributes |= (this.cursor.style << 9)\n serialized += String.fromCodePoint(attributes + 1)\n\n let lastStyle = null\n let index = 0\n for (let cell of this.screen) {\n let style = cell[1]\n if (this.rainbow) {\n let x = index % this.width\n let y = Math.floor(index / this.width)\n // C instead of F in mask and 1 << 8 in attrs to change attr bits 8 and 9\n style = (style & 0xFFFC0000) | (1 << 8 << 16) | getRainbowColor((x + y) / 10 + Date.now() / 1000)\n index++\n }\n if (style !== lastStyle) {\n let foreground = style & 0xFF\n let background = (style >> 8) & 0xFF\n let attributes = (style >> 16) & 0xFFFF\n let setForeground = foreground !== (lastStyle & 0xFF)\n let setBackground = background !== ((lastStyle >> 8) & 0xFF)\n let setAttributes = attributes !== ((lastStyle >> 16) & 0xFFFF)\n\n if (setForeground && setBackground) serialized += '\\x03' + String.fromCodePoint((style & 0xFFFF) + 1)\n else if (setForeground) serialized += '\\x05' + String.fromCodePoint(foreground + 1)\n else if (setBackground) serialized += '\\x06' + String.fromCodePoint(background + 1)\n if (setAttributes) serialized += '\\x04' + String.fromCodePoint(attributes + 1)\n lastStyle = style\n }\n serialized += cell[0]\n }\n return serialized\n }\n scheduleLoad () {\n clearTimeout(this._scheduledLoad)\n if (this._lastLoad < Date.now() - TERM_MIN_DRAW_DELAY) {\n this.termScreen.load(this.serialize(), { theme: this.theme })\n this.theme = -1 // prevent useless theme setting next time\n } else {\n this._scheduledLoad = setTimeout(() => {\n this.termScreen.load(this.serialize())\n }, TERM_MIN_DRAW_DELAY - this._lastLoad)\n }\n }\n rainbowTimer () {\n if (!this.rainbow) return\n clearInterval(this._rainbowTimer)\n this._rainbowTimer = setInterval(() => {\n if (this.rainbow) this.scheduleLoad()\n }, 50)\n }\n}\n\nclass Process extends EventEmitter {\n write (data) {\n this.emit('in', data)\n }\n destroy () {\n // death.\n this.emit('exit', 0)\n }\n run () {\n // noop\n }\n}\n\nlet demoData = {\n buttons: {\n 1: '',\n 2: '',\n 3: '',\n 4: '',\n 5: function (terminal, shell) {\n if (shell.child) shell.child.destroy()\n let chars = 'info\\r'\n let loop = function () {\n shell.write(chars[0])\n chars = chars.substr(1)\n if (chars) setTimeout(loop, 100)\n }\n setTimeout(loop, 200)\n }\n },\n mouseReceiver: null\n}\n\nlet demoshIndex = {\n clear: class Clear extends Process {\n run () {\n this.emit('write', '\\x1b[2J\\x1b[1;1H')\n this.destroy()\n }\n },\n screenfetch: class Screenfetch extends Process {\n run () {\n let image = `\n ###. ESPTerm Demo\n '###. Hostname: ${window.location.hostname}\n '###. Shell: ESPTerm Demo Shell\n '###. Resolution: 80x25@${window.devicePixelRatio}x\n :###-\n .###'\n .###'\n .###' ###############\n ###' ###############\n `.split('\\n').filter(line => line.trim())\n\n let chars = ''\n for (let y = 0; y < image.length; y++) {\n for (let x = 0; x < 80; x++) {\n if (image[y][x]) {\n chars += `\\x1b[38;5;${getRainbowColor((x + y) / 10)}m${image[y][x]}`\n } else chars += ' '\n }\n }\n\n this.emit('write', '\\r\\n\\x1b[?25l')\n let loop = () => {\n this.emit('write', chars.substr(0, 80))\n chars = chars.substr(80)\n if (chars.length) setTimeout(loop, 50)\n else {\n this.emit('write', '\\r\\n\\x1b[?25h')\n this.destroy()\n }\n }\n loop()\n }\n },\n 'local-echo': class LocalEcho extends Process {\n run (...args) {\n if (!args.includes('--suppress-note')) {\n this.emit('write', '\\x1b[38;5;239mNote: not all terminal features are supported or and may not work as expected in this demo\\x1b[0m\\r\\n')\n }\n }\n write (data) {\n this.emit('write', data)\n }\n },\n 'info': class Info extends Process {\n run (...args) {\n let fast = args.includes('--fast')\n this.showSplash().then(() => {\n this.printText(fast)\n })\n }\n showSplash () {\n let splash = `\n -#####- -###*..#####- ######-\n -#* -#- .## .##. *#-\n -##### .-###*..#####- *#- -*##*- #*-#--#**#-*##-\n -#* -#-.##. *#- *##@#* ##. -#* *# .#*\n -#####--####- .##. *#- -*#@@- ##. -#* *# .#*\n `.split('\\n').filter(line => line.trim())\n let levels = {\n ' ': -231,\n '.': 4,\n '-': 8,\n '*': 17,\n '#': 24\n }\n let characters = {\n ' ': ' ',\n '.': '░',\n '-': '▒',\n '*': '▓',\n '#': '█'\n }\n for (let i in splash) {\n if (splash[i].length < 79) splash[i] += ' '.repeat(79 - splash[i].length)\n }\n this.emit('write', '\\r\\n'.repeat(splash.length + 1))\n this.emit('write', '\\x1b[A'.repeat(splash.length))\n this.emit('write', '\\x1b[?25l')\n\n let cursorX = 0\n let cursorY = 0\n let moveTo = (x, y) => {\n let moveX = x - cursorX\n let moveY = y - cursorY\n this.emit('write', `\\x1b[${Math.abs(moveX)}${moveX > 0 ? 'C' : 'D'}`)\n this.emit('write', `\\x1b[${Math.abs(moveY)}${moveY > 0 ? 'B' : 'A'}`)\n cursorX = x\n cursorY = y\n }\n let drawCell = (x, y) => {\n moveTo(x, y)\n if (splash[y][x] === '@') {\n this.emit('write', '\\x1b[48;5;238m\\x1b[38;5;255m▄\\b')\n } else {\n let level = 231 + levels[splash[y][x]]\n let character = characters[splash[y][x]]\n this.emit('write', `\\x1b[48;5;${level}m\\x1b[38;5;${level}m${character}\\b`)\n }\n }\n return new Promise((resolve, reject) => {\n const self = this\n let x = 14\n let cycles = 0\n let loop = function () {\n for (let y = 0; y < splash.length; y++) {\n let dx = x - y\n if (dx > 0) drawCell(dx, y)\n }\n\n if (++x < 69) {\n if (++cycles >= 3) {\n setTimeout(loop, 20)\n cycles = 0\n } else loop()\n } else {\n moveTo(0, splash.length)\n self.emit('write', '\\x1b[m\\x1b[?25h')\n resolve()\n }\n }\n loop()\n })\n }\n printText (fast = false) {\n // lots of printing\n let parts = [\n '',\n ' ESPTerm is a VT100-like terminal emulator running on the ESP8266 WiFi chip.',\n '',\n ' \\x1b[93mThis is an online demo of the web user interface, simulating a simple ',\n ' terminal in your browser.\\x1b[m',\n '',\n ' Type \\x1b[92mls\\x1b[m to list available commands.',\n ' Use the \\x1b[94mlinks\\x1b[m below this screen for a demo of the options and more info.',\n ''\n ]\n\n if (fast) {\n this.emit('write', parts.join('\\r\\n') + '\\r\\n')\n this.destroy()\n } else {\n const self = this\n let loop = function () {\n self.emit('write', parts.shift() + '\\r\\n')\n if (parts.length) setTimeout(loop, 17)\n else self.destroy()\n }\n loop()\n }\n }\n },\n colors: class PrintColors extends Process {\n run () {\n this.emit('write', '\\r\\n')\n let fgtext = 'foreground-color'\n this.emit('write', ' ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `3${i}` : `9${i - 8}`) + 'm')\n this.emit('write', fgtext[i] + ' ')\n }\n this.emit('write', '\\r\\n ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `4${i}` : `10${i - 8}`) + 'm ')\n }\n this.emit('write', '\\x1b[m\\r\\n')\n for (let r = 0; r < 6; r++) {\n this.emit('write', ' ')\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n this.emit('write', `\\x1b[48;5;${16 + r * 36 + g * 6 + b}m `)\n }\n this.emit('write', '\\x1b[m')\n }\n this.emit('write', '\\r\\n')\n }\n this.emit('write', ' ')\n for (let g = 0; g < 24; g++) {\n this.emit('write', `\\x1b[48;5;${232 + g}m `)\n }\n this.emit('write', '\\x1b[m\\r\\n\\n')\n this.destroy()\n }\n },\n ls: class ListCommands extends Process {\n run () {\n this.emit('write', '\\x1b[92mList of demo commands\\x1b[m\\r\\n')\n for (let i in demoshIndex) {\n if (typeof demoshIndex[i] === 'string') continue\n this.emit('write', i + '\\r\\n')\n }\n this.destroy()\n }\n },\n theme: class SetTheme extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run (...args) {\n let theme = +args[0] | 0\n const maxnum = themes.length\n if (!args.length || !Number.isFinite(theme) || theme < 0 || theme >= maxnum) {\n this.emit('write', `\\x1b[31mUsage: theme [0–${maxnum - 1}]\\r\\n`)\n this.destroy()\n return\n }\n this.shell.terminal.theme = theme\n // HACK: reset drawn screen to prevent only partly redrawn screen\n this.shell.terminal.termScreen.drawnScreenFG = []\n this.emit('write', '')\n this.destroy()\n }\n },\n cursor: class SetCursor extends Process {\n run (...args) {\n let steady = args.includes('--steady')\n if (args.includes('block')) {\n this.emit('write', `\\x1b[${2 * steady} q`)\n } else if (args.includes('line')) {\n this.emit('write', `\\x1b[${3 + steady} q`)\n } else if (args.includes('bar') || args.includes('beam')) {\n this.emit('write', `\\x1b[${5 + steady} q`)\n } else {\n this.emit('write', '\\x1b[31mUsage: cursor [block|line|bar] [--steady]\\r\\n')\n }\n this.destroy()\n }\n },\n rainbow: class ToggleRainbow extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.rainbow = !this.shell.terminal.rainbow\n this.shell.terminal.rainbowTimer()\n this.emit('write', '')\n this.destroy()\n }\n },\n mouse: class ShowMouse extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.trackMouse = true\n demoData.mouseReceiver = this\n this.randomData = []\n this.highlighted = {}\n let characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\n for (let i = 0; i < 23; i++) {\n let line = ''\n for (let j = 0; j < 79; j++) {\n line += characters[Math.floor(characters.length * Math.random())]\n }\n this.randomData.push(line)\n }\n this.scrollOffset = 0\n this.render()\n }\n render () {\n this.emit('write', '\\x1b[m\\x1b[2J\\x1b[1;1H')\n this.emit('write', '\\x1b[97m\\x1b[1mMouse Demo\\r\\n\\x1b[mMouse movement, clicking and scrolling!')\n\n // render random data for scrolling\n for (let y = 0; y < 23; y++) {\n let index = y + this.scrollOffset\n // proper modulo:\n index = ((index % this.randomData.length) + this.randomData.length) % this.randomData.length\n let line = this.randomData[index]\n let lineData = `\\x1b[${3 + y};1H\\x1b[38;5;239m`\n for (let x in line) {\n if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\\x1b[97m'\n lineData += line[x]\n if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\\x1b[38;5;239m'\n }\n this.emit('write', lineData)\n }\n\n // move cursor to mouse\n if (this.mouse) {\n this.emit('write', `\\x1b[${this.mouse.y + 1};${this.mouse.x + 1}H`)\n }\n }\n mouseMove (x, y) {\n this.mouse = { x, y }\n this.render()\n }\n mouseDown (x, y, button) {\n if (button === 4) this.scrollOffset--\n else if (button === 5) this.scrollOffset++\n else this.highlighted[y * 80 + x] = !this.highlighted[y * 80 + x]\n this.render()\n }\n mouseUp (x, y, button) {}\n destroy () {\n this.shell.terminal.write('\\x1b[2J\\x1b[1;1H')\n this.shell.terminal.trackMouse = false\n if (demoData.mouseReceiver === this) demoData.mouseReceiver = null\n super.destroy()\n }\n },\n sudo: class Sudo extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run (...args) {\n if (args.length === 0) {\n this.emit('write', '\\x1b[31mUsage: sudo \\x1b[m\\r\\n')\n this.destroy()\n } else if (args.length === 4 && args.join(' ').toLowerCase() === 'make me a sandwich') {\n const b = '\\x1b[33m'\n const r = '\\x1b[0m'\n const l = '\\x1b[32m'\n const c = '\\x1b[38;5;229m'\n const h = '\\x1b[38;5;225m'\n this.emit('write',\n ` ${b}_.---._\\r\\n` +\n ` _.-~ ~-._\\r\\n` +\n ` _.-~ ~-._\\r\\n` +\n ` _.-~ ~---._\\r\\n` +\n ` _.-~ ~\\\\\\r\\n` +\n ` .-~ _.;\\r\\n` +\n ` :-._ _.-~ ./\\r\\n` +\n ` \\`-._~-._ _..__.-~ _.-~\\r\\n` +\n ` ${c}/ ${b}~-._~-._ / .__..--${c}~-${l}---._\\r\\n` +\n `${c} \\\\_____(_${b};-._\\\\. _.-~_/${c} ~)${l}.. . \\\\\\r\\n` +\n `${l} /(_____ ${b}\\\\\\`--...--~_.-~${c}______..-+${l}_______)\\r\\n` +\n `${l} .(_________/${b}\\`--...--~/${l} _/ ${h} ${b}/\\\\\\r\\n` +\n `${b} /-._${h} \\\\_ ${l}(___./_..-~${h}__.....${b}__..-~./\\r\\n` +\n `${b} \\`-._~-._${h} ~\\\\--------~ .-~${b}_..__.-~ _.-~\\r\\n` +\n `${b} ~-._~-._ ${h}~---------\\` ${b}/ .__..--~\\r\\n` +\n `${b} ~-._\\\\. _.-~_/\\r\\n` +\n `${b} \\\\\\`--...--~_.-~\\r\\n` +\n `${b} \\`--...--~${r}\\r\\n`)\n this.destroy()\n } else {\n let name = args.shift()\n if (this.shell.index[name]) {\n let Process = this.shell.index[name]\n if (Process instanceof Function) {\n let child = new Process(this)\n let write = data => this.emit('write', data)\n child.on('write', write)\n child.on('exit', code => {\n child.removeListener('write', write)\n this.destroy()\n })\n child.run(...args)\n } else {\n this.emit('write', Process)\n this.destroy()\n }\n } else {\n this.emit('write', `sudo: ${name}: command not found\\r\\n`)\n this.destroy()\n }\n }\n }\n },\n make: class Make extends Process {\n run (...args) {\n if (args.length === 0) this.emit('write', '\\x1b[31mmake: *** No targets specified. Stop.\\x1b[0m\\r\\n')\n else if (args.length === 3 && args.join(' ').toLowerCase() === 'me a sandwich') {\n this.emit('write', '\\x1b[31mmake: me a sandwich : Permission denied\\x1b[0m\\r\\n')\n } else {\n this.emit('write', `\\x1b[31mmake: *** No rule to make target '${args.join(' ').toLowerCase()}'. Stop.\\x1b[0m\\r\\n`)\n }\n this.destroy()\n }\n },\n pwd: '/this/is/a/demo\\r\\n',\n cd: '\\x1b[38;5;239mNo directories to change to\\r\\n',\n whoami: `${window.navigator.userAgent}\\r\\n`,\n hostname: `${window.location.hostname}`,\n uname: 'ESPTerm Demo\\r\\n',\n mkdir: '\\x1b[38;5;239mDid not create a directory because this is a demo.\\r\\n',\n rm: '\\x1b[38;5;239mDid not delete anything because this is a demo.\\r\\n',\n cp: '\\x1b[38;5;239mNothing to copy because this is a demo.\\r\\n',\n mv: '\\x1b[38;5;239mNothing to move because this is a demo.\\r\\n',\n ln: '\\x1b[38;5;239mNothing to link because this is a demo.\\r\\n',\n touch: '\\x1b[38;5;239mNothing to touch\\r\\n',\n exit: '\\x1b[38;5;239mNowhere to go\\r\\n',\n github: class GoToGithub extends Process {\n run () {\n window.open('https://github.com/espterm/espterm-firmware')\n this.destroy()\n }\n }\n}\n\nclass DemoShell {\n constructor (terminal, printInfo) {\n this.terminal = terminal\n this.terminal.reset()\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n this.history = []\n this.historyIndex = 0\n this.cursorPos = 0\n this.child = null\n this.index = demoshIndex\n\n if (printInfo) this.run('info')\n else this.prompt()\n }\n write (text) {\n if (this.child) {\n if (text.codePointAt(0) === 3) this.child.destroy()\n else this.child.write(text)\n } else this.parser.write(text)\n }\n prompt (success = true) {\n if (this.terminal.cursor.x !== 0) this.terminal.write('\\x1b[m\\x1b[38;5;238m⏎\\r\\n')\n this.terminal.write('\\x1b[34;1mdemosh \\x1b[m')\n if (!success) this.terminal.write('\\x1b[31m')\n this.terminal.write('$ \\x1b[m')\n this.history.unshift('')\n this.cursorPos = 0\n }\n copyFromHistoryIndex () {\n if (!this.historyIndex) return\n let current = this.history[this.historyIndex]\n this.history[0] = current\n this.historyIndex = 0\n }\n handleParsed (action, ...args) {\n this.terminal.write('\\b\\x1b[P'.repeat(this.cursorPos))\n if (action === 'write') {\n this.copyFromHistoryIndex()\n this.history[0] = this.history[0].substr(0, this.cursorPos) + args[0] + this.history[0].substr(this.cursorPos)\n this.cursorPos++\n } else if (action === 'back') {\n this.copyFromHistoryIndex()\n this.history[0] = this.history[0].substr(0, this.cursorPos - 1) + this.history[0].substr(this.cursorPos)\n this.cursorPos--\n if (this.cursorPos < 0) this.cursorPos = 0\n } else if (action === 'tab') {\n console.warn('TAB not implemented') // TODO completion\n } else if (action === 'move-cursor-x') {\n this.cursorPos = Math.max(0, Math.min(this.history[this.historyIndex].length, this.cursorPos + args[0]))\n } else if (action === 'delete-line') {\n this.copyFromHistoryIndex()\n this.history[0] = ''\n this.cursorPos = 0\n } else if (action === 'delete-word') {\n this.copyFromHistoryIndex()\n let words = this.history[0].substr(0, this.cursorPos).split(' ')\n words.pop()\n this.history[0] = words.join(' ') + this.history[0].substr(this.cursorPos)\n this.cursorPos = words.join(' ').length\n } else if (action === 'move-cursor-y') {\n this.historyIndex -= args[0]\n if (this.historyIndex < 0) this.historyIndex = 0\n if (this.historyIndex >= this.history.length) this.historyIndex = this.history.length - 1\n this.cursorPos = this.history[this.historyIndex].length\n }\n\n this.terminal.write(this.history[this.historyIndex])\n this.terminal.write('\\b'.repeat(this.history[this.historyIndex].length))\n this.terminal.moveForward(this.cursorPos)\n this.terminal.write('') // dummy. Apply the moveFoward\n\n if (action === 'return') {\n this.terminal.write('\\r\\n')\n this.parse(this.history[this.historyIndex])\n }\n }\n parse (input) {\n if (input === 'help') input = 'info'\n // TODO: basic chaining (i.e. semicolon)\n this.run(input)\n }\n run (command) {\n let parts = ['']\n\n let inQuote = false\n for (let character of command.trim()) {\n if (inQuote && character !== inQuote) {\n parts[parts.length - 1] += character\n } else if (inQuote) {\n inQuote = false\n } else if (character === '\"' || character === \"'\") {\n inQuote = character\n } else if (character.match(/\\s/)) {\n if (parts[parts.length - 1]) parts.push('')\n } else parts[parts.length - 1] += character\n }\n\n let name = parts.shift()\n\n if (name in this.index) {\n this.spawn(name, parts)\n } else {\n this.terminal.write(`demosh: Unknown command: ${name}\\r\\n`)\n this.prompt(false)\n }\n }\n spawn (name, args = []) {\n let Process = this.index[name]\n if (Process instanceof Function) {\n this.child = new Process(this)\n let write = data => this.terminal.write(data)\n this.child.on('write', write)\n this.child.on('exit', code => {\n if (this.child) this.child.removeListener('write', write)\n this.child = null\n this.prompt(!code)\n })\n this.child.run(...args)\n } else {\n this.terminal.write(Process)\n this.prompt()\n }\n }\n}\n\nwindow.demoInterface = module.exports = {\n input (data) {\n let type = data[0]\n let content = data.substr(1)\n\n if (type === 's') {\n this.shell.write(content)\n } else if (type === 'b') {\n let button = content.charCodeAt(0)\n let action = demoData.buttons[button]\n if (action) {\n if (typeof action === 'string') this.shell.write(action)\n else if (action instanceof Function) action(this.terminal, this.shell)\n }\n } else if (type === 'm' || type === 'p' || type === 'r') {\n let row = parse2B(content, 0)\n let column = parse2B(content, 2)\n let button = parse2B(content, 4)\n let modifiers = parse2B(content, 6)\n\n if (demoData.mouseReceiver) {\n if (type === 'm') demoData.mouseReceiver.mouseMove(column, row, button, modifiers)\n else if (type === 'p') demoData.mouseReceiver.mouseDown(column, row, button, modifiers)\n else if (type === 'r') demoData.mouseReceiver.mouseUp(column, row, button, modifiers)\n }\n }\n },\n didInit: false,\n init (screen) {\n if (this.didInit) return\n this.didInit = true\n this.terminal = new ScrollingTerminal(screen)\n this.shell = new DemoShell(this.terminal, true)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/demo.js","require('./lib/polyfills')\nrequire('./modal')\nrequire('./notif')\nrequire('./appcommon')\ntry { require('./term/demo') } catch (err) {}\nrequire('./wifi')\n\nconst $ = require('./lib/chibi')\nconst { qs } = require('./utils')\n\n/* Export stuff to the global scope for inline scripts */\nwindow.termInit = require('./term')\nwindow.$ = $\nwindow.qs = qs\n\nwindow.themes = require('./term/themes')\n\n\n\n// WEBPACK FOOTER //\n// ./js/index.js","/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\nif (!String.fromCodePoint) {\n (function () {\n var defineProperty = (function () {\n // IE 8 only supports `Object.defineProperty` on DOM elements\n try {\n var object = {};\n var $defineProperty = Object.defineProperty;\n var result = $defineProperty(object, object, object) && $defineProperty;\n } catch (error) {\n }\n return result;\n }());\n var stringFromCharCode = String.fromCharCode;\n var floor = Math.floor;\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000;\n var codeUnits = [];\n var highSurrogate;\n var lowSurrogate;\n var index = -1;\n var length = arguments.length;\n if (!length) {\n return '';\n }\n var result = '';\n while (++index < length) {\n var codePoint = Number(arguments[index]);\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) != codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint);\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint);\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n highSurrogate = (codePoint >> 10) + 0xD800;\n lowSurrogate = (codePoint % 0x400) + 0xDC00;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 == length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n if (defineProperty) {\n defineProperty(String, 'fromCodePoint', {\n 'value': fromCodePoint,\n 'configurable': true,\n 'writable': true\n });\n } else {\n String.fromCodePoint = fromCodePoint;\n }\n }());\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/lib/polyfills.js","const $ = require('./lib/chibi')\nconst { mk, qs, qsa, cr } = require('./utils')\nconst modal = require('./modal')\nconst notify = require('./notif')\n\n/** Global generic init */\n$.ready(function () {\n // Opening menu on mobile / narrow screen\n function menuOpen () {\n $('#menu').toggleClass('expanded')\n }\n $('#brand')\n .on('click', menuOpen)\n .on('keypress', cr(menuOpen))\n\n // Checkbox UI (checkbox CSS and hidden input with int value)\n $('.Row.checkbox').forEach(function (x) {\n let inp = x.querySelector('input')\n let box = x.querySelector('.box')\n\n $(box).toggleClass('checked', inp.value)\n\n let hdl = function () {\n inp.value = 1 - inp.value\n $(box).toggleClass('checked', inp.value)\n }\n\n $(x).on('click', hdl).on('keypress', cr(hdl))\n })\n\n // Expanding boxes on mobile\n $('.Box.mobcol,.Box.fold').forEach(function (x) {\n let h = x.querySelector('h2')\n\n let hdl = function () {\n $(x).toggleClass('expanded')\n }\n $(h).on('click', hdl).on('keypress', cr(hdl))\n })\n\n $('form').forEach(function (x) {\n $(x).on('keypress', function (e) {\n if ((e.keyCode === 10 || e.keyCode === 13) && e.ctrlKey) {\n x.submit()\n }\n })\n })\n\n // loader dots...\n setInterval(function () {\n $('.anim-dots').each(function (x) {\n let $x = $(x)\n let dots = $x.html() + '.'\n if (dots.length === 5) dots = '.'\n $x.html(dots)\n })\n }, 1000)\n\n // flipping number boxes with the mouse wheel\n $('input[type=number]').on('mousewheel', function (e) {\n let $this = $(this)\n let val = +$this.val()\n if (isNaN(val)) val = 1\n\n const step = +($this.attr('step') || 1)\n const min = +$this.attr('min')\n const max = +$this.attr('max')\n if (e.wheelDelta > 0) {\n val += step\n } else {\n val -= step\n }\n\n if (!Number.isFinite(min)) val = Math.max(val, +min)\n if (!Number.isFinite(max)) val = Math.min(val, +max)\n $this.val(val)\n\n if ('createEvent' in document) {\n let evt = document.createEvent('HTMLEvents')\n evt.initEvent('change', false, true)\n $this[0].dispatchEvent(evt)\n } else {\n $this[0].fireEvent('onchange')\n }\n\n e.preventDefault()\n })\n\n // populate the form errors box from GET arg ?err=...\n // (a way to pass errors back from server via redirect)\n let errAt = window.location.search.indexOf('err=')\n if (errAt !== -1 && qs('.Box.errors')) {\n let errs = window.location.search.substr(errAt + 4).split(',')\n let humanReadableErrors = []\n errs.forEach(function (er) {\n let lbls = qsa('label[for=\"' + er + '\"]')\n for (let i = 0; i < lbls.length; i++) {\n let lbl = lbls[i]\n lbl.classList.add('error')\n if (i === 0) humanReadableErrors.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, ''))\n }\n // else {\n // hres.push(er)\n // }\n })\n\n qs('.Box.errors .list').innerHTML = humanReadableErrors.join(', ')\n qs('.Box.errors').classList.remove('hidden')\n }\n\n modal.init()\n notify.init()\n\n // remove tabindices from h2 if wide\n if (window.innerWidth > 550) {\n $('.Box h2').forEach(function (x) {\n x.removeAttribute('tabindex')\n })\n\n // brand works as a link back to term in widescreen mode\n let br = qs('#brand')\n br && br.addEventListener('click', function () {\n window.location.href = '/' // go to terminal\n })\n }\n})\n\n// setup the ajax loader\n$._loader = function (vis) {\n $('#loader').toggleClass('show', vis)\n}\n\nlet pageShown = false\n// reveal content on load\nfunction showPage () {\n pageShown = true\n $('#content').addClass('load')\n}\n// HACKITY HACK: fix this later\nwindow.showPage = showPage\n\n// Auto reveal pages other than the terminal (sets window.noAutoShow)\n$.ready(function () {\n if (window.noAutoShow === true) {\n setTimeout(function () {\n if (!pageShown) {\n let bnr = mk('P')\n bnr.id = 'load-failed'\n bnr.innerHTML =\n 'Server connection failed! Trying again' +\n '.'\n qs('#screen').appendChild(bnr)\n showPage()\n }\n }, 2000)\n } else {\n setTimeout(function () {\n showPage()\n }, 1)\n }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./js/appcommon.js","const $ = require('./lib/chibi')\nconst { mk, bool } = require('./utils')\nconst tr = require('./lang')\n\n;(function (w) {\n const authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']\n let curSSID\n\n // Get XX % for a slider input\n function rangePt (inp) {\n return Math.round(((inp.value / inp.max) * 100)) + '%'\n }\n\n // Display selected STA SSID etc\n function selectSta (name, password, ip) {\n $('#sta_ssid').val(name)\n $('#sta_password').val(password)\n\n $('#sta-nw').toggleClass('hidden', name.length === 0)\n $('#sta-nw-nil').toggleClass('hidden', name.length > 0)\n\n $('#sta-nw .essid').html($.htmlEscape(name))\n const nopw = !password || password.length === 0\n $('#sta-nw .passwd').toggleClass('hidden', nopw)\n $('#sta-nw .nopasswd').toggleClass('hidden', !nopw)\n $('#sta-nw .ip').html(ip.length > 0 ? tr('wifi.connected_ip_is') + ip : tr('wifi.not_conn'))\n }\n\n /** Update display for received response */\n function onScan (resp, status) {\n // var ap_json = {\n // \"result\": {\n // \"inProgress\": \"0\",\n // \"APs\": [\n // {\"essid\": \"Chlivek\", \"bssid\": \"88:f7:c7:52:b3:99\", \"rssi\": \"204\", \"enc\": \"4\", \"channel\": \"1\"},\n // {\"essid\": \"TyNikdy\", \"bssid\": \"5c:f4:ab:0d:f1:1b\", \"rssi\": \"164\", \"enc\": \"3\", \"channel\": \"1\"},\n // ]\n // }\n // };\n\n if (status !== 200) {\n // bad response\n rescan(5000) // wait 5sm then retry\n return\n }\n\n try {\n resp = JSON.parse(resp)\n } catch (e) {\n console.log(e)\n rescan(5000)\n return\n }\n\n const done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0)\n rescan(done ? 15000 : 1000)\n if (!done) return // no redraw yet\n\n // clear the AP list\n let $list = $('#ap-list')\n // remove old APs\n $('#ap-list .AP').remove()\n\n $list.toggleClass('hidden', !done)\n $('#ap-loader').toggleClass('hidden', done)\n\n // scan done\n resp.result.APs.sort(function (a, b) {\n return b.rssi - a.rssi\n }).forEach(function (ap) {\n ap.enc = parseInt(ap.enc)\n\n if (ap.enc > 4) return // hide unsupported auths\n\n let item = mk('div')\n\n let $item = $(item)\n .data('ssid', ap.essid)\n .data('pwd', ap.enc)\n .attr('tabindex', 0)\n .addClass('AP')\n\n // mark current SSID\n if (ap.essid === curSSID) {\n $item.addClass('selected')\n }\n\n let inner = mk('div')\n let escapedSSID = $.htmlEscape(ap.essid)\n $(inner).addClass('inner')\n .htmlAppend(`
${ap.rssi_perc}
`)\n .htmlAppend(`
${escapedSSID}
`)\n .htmlAppend(`
${authStr[ap.enc]}
`)\n\n $item.on('click', function () {\n let $th = $(this)\n\n const conn_ssid = $th.data('ssid')\n let conn_pass = ''\n\n if (+$th.data('pwd')) {\n // this AP needs a password\n conn_pass = window.prompt(tr('wifi.enter_passwd').replace(':ssid:', conn_ssid))\n if (!conn_pass) return\n }\n\n $('#sta_password').val(conn_pass)\n $('#sta_ssid').val(conn_ssid)\n selectSta(conn_ssid, conn_pass, '')\n })\n\n item.appendChild(inner)\n $list[0].appendChild(item)\n })\n }\n\n function startScanning () {\n $('#ap-loader').removeClass('hidden')\n $('#ap-scan').addClass('hidden')\n $('#ap-loader .anim-dots').html('.')\n\n scanAPs()\n }\n\n /** Ask the CGI what APs are visible (async) */\n function scanAPs () {\n if (window._demo) {\n onScan(window._demo_aps, 200)\n } else {\n $.get('http://' + window._root + '/cfg/wifi/scan', onScan)\n }\n }\n\n function rescan (time) {\n setTimeout(scanAPs, time)\n }\n\n /** Set up the WiFi page */\n function wifiInit (cfg) {\n // Update slider value displays\n $('.Row.range').forEach(function (x) {\n let inp = x.querySelector('input')\n let disp1 = x.querySelector('.x-disp1')\n let disp2 = x.querySelector('.x-disp2')\n let t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n $(inp).on('input', function () {\n t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n })\n })\n\n // Forget STA credentials\n $('#forget-sta').on('click', () => {\n selectSta('', '', '')\n return false\n })\n\n selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip)\n curSSID = cfg.sta_active_ssid\n }\n\n w.init = wifiInit\n w.startScanning = startScanning\n})(window.WiFi = {})\n\n\n\n// WEBPACK FOOTER //\n// ./js/wifi.js","// Generated from PHP locale file\nlet _tr = {\n \"wifi.connected_ip_is\": \"Connected, IP is \",\n \"wifi.not_conn\": \"Not connected.\",\n \"wifi.enter_passwd\": \"Enter password for \\\":ssid:\\\"\"\n};\n\nmodule.exports = function tr (key) { return _tr[key] || '?' + key + '?' }\n\n\n\n// WEBPACK FOOTER //\n// ./js/lang.js","const { qs, mk } = require('../utils')\nconst Notify = require('../notif')\nconst TermScreen = require('./screen')\nconst TermConnection = require('./connection')\nconst TermInput = require('./input')\nconst TermUpload = require('./upload')\nconst initSoftKeyboard = require('./soft_keyboard')\nconst attachDebugScreen = require('./debug_screen')\n\n/** Init the terminal sub-module - called from HTML */\nmodule.exports = function (opts) {\n const screen = new TermScreen()\n const conn = new TermConnection(screen)\n const input = TermInput(conn, screen)\n const termUpload = TermUpload(conn, input, screen)\n screen.input = input\n input.termUpload = termUpload\n\n // we delay the display of \"connecting\" to avoid flash when changing tabs with the terminal open\n let showConnectingTimeout = -1\n conn.on('open', () => {\n showConnectingTimeout = setTimeout(() => {\n screen.window.statusScreen = { title: 'Connecting', loading: true }\n }, 250)\n })\n conn.on('connect', () => {\n clearTimeout(showConnectingTimeout)\n screen.window.statusScreen = { title: 'Waiting for content', loading: true }\n })\n conn.on('load', () => {\n if (screen.window.statusScreen) screen.window.statusScreen = null\n })\n conn.on('disconnect', () => {\n clearTimeout(showConnectingTimeout)\n screen.window.statusScreen = { title: 'Disconnected' }\n screen.screen = []\n screen.screenFG = []\n screen.screenBG = []\n screen.screenAttrs = []\n })\n conn.on('silence', () => { screen.window.statusScreen = { title: 'Waiting for server', loading: true } })\n // conn.on('ping-fail', () => { screen.window.statusScreen = { title: 'Disconnected' } })\n conn.on('ping-success', () => { screen.window.statusScreen = { title: 'Re-connecting', loading: true } })\n\n conn.init()\n input.init(opts)\n termUpload.init()\n Notify.init()\n\n window.onerror = function (errorMsg, file, line, col) {\n Notify.show(`JS ERROR!
${errorMsg}
at ${file}:${line}:${col}`, 10000, true)\n return false\n }\n\n qs('#screen').appendChild(screen.canvas)\n screen.load(opts.labels, opts) // load labels and theme\n\n initSoftKeyboard(screen, input)\n if (attachDebugScreen) attachDebugScreen(screen)\n\n let isFullscreen = false\n let fitScreen = false\n let fitScreenIfNeeded = function fitScreenIfNeeded () {\n if (isFullscreen) {\n screen.window.fitIntoWidth = window.screen.width\n screen.window.fitIntoHeight = window.screen.height\n } else {\n screen.window.fitIntoWidth = fitScreen ? window.innerWidth - 20 : 0\n screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0\n }\n }\n fitScreenIfNeeded()\n window.addEventListener('resize', fitScreenIfNeeded)\n\n let toggleFitScreen = function () {\n fitScreen = !fitScreen\n const resizeButtonIcon = qs('#resize-button-icon')\n if (fitScreen) {\n resizeButtonIcon.classList.remove('icn-resize-small')\n resizeButtonIcon.classList.add('icn-resize-full')\n } else {\n resizeButtonIcon.classList.remove('icn-resize-full')\n resizeButtonIcon.classList.add('icn-resize-small')\n }\n fitScreenIfNeeded()\n }\n\n qs('#term-fit-screen').addEventListener('click', function () {\n toggleFitScreen()\n return false\n })\n\n // add fullscreen mode & button\n if (window.Element.prototype.requestFullscreen || window.Element.prototype.webkitRequestFullscreen) {\n let checkForFullscreen = function () {\n // document.fullscreenElement is not really supported yet, so here's a hack\n if (isFullscreen && (window.innerWidth !== window.screen.width || window.innerHeight !== window.screen.height)) {\n isFullscreen = false\n fitScreenIfNeeded()\n }\n }\n setInterval(checkForFullscreen, 500)\n\n // (why are the buttons anchors?)\n let button = mk('a')\n button.href = '#'\n button.addEventListener('click', e => {\n e.preventDefault()\n\n isFullscreen = true\n fitScreenIfNeeded()\n screen.updateSize()\n\n if (screen.canvas.requestFullscreen) screen.canvas.requestFullscreen()\n else screen.canvas.webkitRequestFullscreen()\n })\n let icon = mk('i')\n icon.classList.add('icn-resize-full') // TODO: less confusing icons\n button.appendChild(icon)\n let span = mk('span')\n span.textContent = 'Fullscreen'\n button.appendChild(span)\n qs('#term-nav').insertBefore(button, qs('#term-nav').firstChild)\n }\n\n // for debugging\n window.termScreen = screen\n window.conn = conn\n window.input = input\n window.termUpl = termUpload\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/index.js","const EventEmitter = require('events')\nconst $ = require('../lib/chibi')\nconst { mk, qs } = require('../utils')\nconst notify = require('../notif')\nconst ScreenParser = require('./screen_parser')\nconst ScreenRenderer = require('./screen_renderer')\n\nmodule.exports = class TermScreen extends EventEmitter {\n constructor () {\n super()\n\n this.canvas = mk('canvas')\n this.ctx = this.canvas.getContext('2d')\n\n this.parser = new ScreenParser(this)\n this.renderer = new ScreenRenderer(this)\n\n // debug screen handle\n this._debug = null\n\n if ('AudioContext' in window || 'webkitAudioContext' in window) {\n this.audioCtx = new (window.AudioContext || window.webkitAudioContext)()\n } else {\n console.warn('No AudioContext!')\n }\n\n // dummy. Handle for Input\n this.input = new Proxy({}, {\n get () {\n return () => console.warn('TermScreen#input not set!')\n }\n })\n\n this.cursor = {\n x: 0,\n y: 0,\n blinking: true,\n visible: true,\n hanging: false,\n style: 'block'\n }\n\n this._window = {\n width: 0,\n height: 0,\n devicePixelRatio: 1,\n fontFamily: '\"DejaVu Sans Mono\", \"Liberation Mono\", \"Inconsolata\", \"Menlo\", monospace',\n fontSize: 20,\n gridScaleX: 1.0,\n gridScaleY: 1.2,\n fitIntoWidth: 0,\n fitIntoHeight: 0,\n debug: false,\n graphics: 0,\n statusScreen: null\n }\n\n // scaling caused by fitIntoWidth/fitIntoHeight\n this._windowScale = 1\n\n // properties of this.window that require updating size and redrawing\n this.windowState = {\n width: 0,\n height: 0,\n devicePixelRatio: 0,\n gridScaleX: 0,\n gridScaleY: 0,\n fontFamily: '',\n fontSize: 0,\n fitIntoWidth: 0,\n fitIntoHeight: 0\n }\n\n // current selection\n this.selection = {\n // when false, this will prevent selection in favor of mouse events,\n // though alt can be held to override it\n selectable: true,\n\n // selection start and end (x, y) tuples\n start: [0, 0],\n end: [0, 0]\n }\n\n // mouse features\n this.mouseMode = { clicks: false, movement: false }\n\n // make writing to window update size and draw\n const self = this\n this.window = new Proxy(this._window, {\n set (target, key, value, receiver) {\n target[key] = value\n self.scheduleSizeUpdate()\n self.renderer.scheduleDraw(`window:${key}=${value}`)\n self.emit(`update-window:${key}`, value)\n return true\n }\n })\n\n this.bracketedPaste = false\n this.blinkingCellCount = 0\n this.reverseVideo = false\n\n this.screen = []\n this.screenFG = []\n this.screenBG = []\n this.screenAttrs = []\n\n let selecting = false\n\n let selectStart = (x, y) => {\n if (selecting) return\n selecting = true\n this.selection.start = this.selection.end = this.screenToGrid(x, y, true)\n this.renderer.scheduleDraw('select-start')\n }\n\n let selectMove = (x, y) => {\n if (!selecting) return\n this.selection.end = this.screenToGrid(x, y, true)\n this.renderer.scheduleDraw('select-move')\n }\n\n let selectEnd = (x, y) => {\n if (!selecting) return\n selecting = false\n this.selection.end = this.screenToGrid(x, y, true)\n this.renderer.scheduleDraw('select-end')\n Object.assign(this.selection, this.getNormalizedSelection())\n }\n\n // bind event listeners\n\n this.canvas.addEventListener('mousedown', e => {\n if ((this.selection.selectable || e.altKey) && e.button === 0) {\n selectStart(e.offsetX, e.offsetY)\n } else {\n this.input.onMouseDown(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n window.addEventListener('mousemove', e => {\n selectMove(e.offsetX, e.offsetY)\n })\n\n window.addEventListener('mouseup', e => {\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // touch event listeners\n\n let touchPosition = null\n let touchDownTime = 0\n let touchSelectMinTime = 500\n let touchDidMove = false\n\n let getTouchPositionOffset = touch => {\n let rect = this.canvas.getBoundingClientRect()\n return [touch.clientX - rect.left, touch.clientY - rect.top]\n }\n\n this.canvas.addEventListener('touchstart', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n touchDidMove = false\n touchDownTime = Date.now()\n })\n\n this.canvas.addEventListener('touchmove', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n\n if (!selecting && touchDidMove === false) {\n if (touchDownTime < Date.now() - touchSelectMinTime) {\n selectStart(...touchPosition)\n }\n } else if (selecting) {\n e.preventDefault()\n selectMove(...touchPosition)\n }\n\n touchDidMove = true\n })\n\n this.canvas.addEventListener('touchend', e => {\n if (e.touches[0]) {\n touchPosition = getTouchPositionOffset(e.touches[0])\n }\n\n if (selecting) {\n e.preventDefault()\n selectEnd(...touchPosition)\n\n // selection ended; show touch select menu\n let touchSelectMenu = qs('#touch-select-menu')\n touchSelectMenu.classList.add('open')\n let rect = touchSelectMenu.getBoundingClientRect()\n\n // use middle position for x and one line above for y\n let selectionPos = this.gridToScreen(\n (this.selection.start[0] + this.selection.end[0]) / 2,\n this.selection.start[1] - 1\n )\n selectionPos[0] -= rect.width / 2\n selectionPos[1] -= rect.height / 2\n touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${\n selectionPos[1]}px)`\n }\n\n if (!touchDidMove) {\n this.emit('tap', Object.assign(e, {\n x: touchPosition[0],\n y: touchPosition[1]\n }))\n }\n\n touchPosition = null\n })\n\n this.on('tap', e => {\n if (this.selection.start[0] !== this.selection.end[0] ||\n this.selection.start[1] !== this.selection.end[1]) {\n // selection is not empty\n // reset selection\n this.selection.start = this.selection.end = [0, 0]\n qs('#touch-select-menu').classList.remove('open')\n this.renderer.scheduleDraw('select-reset')\n } else {\n e.preventDefault()\n this.emit('open-soft-keyboard')\n }\n })\n\n $.ready(() => {\n let copyButton = qs('#touch-select-copy-btn')\n if (copyButton) {\n copyButton.addEventListener('click', () => {\n this.copySelectionToClipboard()\n })\n }\n })\n\n this.canvas.addEventListener('mousemove', e => {\n if (!selecting) {\n this.input.onMouseMove(...this.screenToGrid(e.offsetX, e.offsetY))\n }\n })\n\n this.canvas.addEventListener('mouseup', e => {\n if (!selecting) {\n this.input.onMouseUp(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n this.canvas.addEventListener('wheel', e => {\n if (this.mouseMode.clicks) {\n this.input.onMouseWheel(...this.screenToGrid(e.offsetX, e.offsetY),\n e.deltaY > 0 ? 1 : -1)\n\n // prevent page scrolling\n e.preventDefault()\n }\n })\n\n this.canvas.addEventListener('contextmenu', e => {\n if (this.mouseMode.clicks) {\n // prevent mouse keys getting stuck\n e.preventDefault()\n }\n selectEnd(e.offsetX, e.offsetY)\n })\n }\n\n /**\n * Schedule a size update in the next millisecond\n */\n scheduleSizeUpdate () {\n clearTimeout(this._scheduledSizeUpdate)\n this._scheduledSizeUpdate = setTimeout(() => this.updateSize(), 1)\n }\n\n /**\n * Returns a CSS font string with this TermScreen's font settings and the\n * font modifiers.\n * @param {Object} modifiers\n * @param {string} [modifiers.style] - the font style\n * @param {string} [modifiers.weight] - the font weight\n * @returns {string} a CSS font string\n */\n getFont (modifiers = {}) {\n let fontStyle = modifiers.style || 'normal'\n let fontWeight = modifiers.weight || 'normal'\n return `${fontStyle} normal ${fontWeight} ${this.window.fontSize}px ${this.window.fontFamily}`\n }\n\n /**\n * Converts screen coordinates to grid coordinates.\n * @param {number} x - x in pixels\n * @param {number} y - y in pixels\n * @param {boolean} rounded - whether to round the coord, used for select highlighting\n * @returns {number[]} a tuple of (x, y) in cells\n */\n screenToGrid (x, y, rounded = false) {\n let cellSize = this.getCellSize()\n\n return [\n Math.floor((x + (rounded ? cellSize.width / 2 : 0)) / cellSize.width),\n Math.floor(y / cellSize.height)\n ]\n }\n\n /**\n * Converts grid coordinates to screen coordinates.\n * @param {number} x - x in cells\n * @param {number} y - y in cells\n * @param {boolean} [withScale] - when true, will apply window scale\n * @returns {number[]} a tuple of (x, y) in pixels\n */\n gridToScreen (x, y, withScale = false) {\n let cellSize = this.getCellSize()\n\n return [x * cellSize.width, y * cellSize.height].map(v => withScale ? v * this._windowScale : v)\n }\n\n /**\n * The character size, used for calculating the cell size. The space character\n * is used for measuring.\n * @returns {Object} the character size with `width` and `height` in pixels\n */\n getCharSize () {\n this.ctx.font = this.getFont()\n\n return {\n width: Math.floor(this.ctx.measureText(' ').width),\n height: this.window.fontSize\n }\n }\n\n /**\n * The cell size, which is the character size multiplied by the grid scale.\n * @returns {Object} the cell size with `width` and `height` in pixels\n */\n getCellSize () {\n let charSize = this.getCharSize()\n\n return {\n width: Math.ceil(charSize.width * this.window.gridScaleX),\n height: Math.ceil(charSize.height * this.window.gridScaleY)\n }\n }\n\n /**\n * Updates the canvas size if it changed\n */\n updateSize () {\n // see below (this is just updating it)\n this._window.devicePixelRatio = Math.round(this._windowScale * (window.devicePixelRatio || 1) * 2) / 2\n\n let didChange = false\n for (let key in this.windowState) {\n if (this.windowState.hasOwnProperty(key) && this.windowState[key] !== this.window[key]) {\n didChange = true\n this.windowState[key] = this.window[key]\n }\n }\n\n if (didChange) {\n const {\n width,\n height,\n fitIntoWidth,\n fitIntoHeight\n } = this.window\n const cellSize = this.getCellSize()\n\n // real height of the canvas element in pixels\n let realWidth = width * cellSize.width\n let realHeight = height * cellSize.height\n\n if (fitIntoWidth && fitIntoHeight) {\n let terminalAspect = realWidth / realHeight\n let fitAspect = fitIntoWidth / fitIntoHeight\n\n if (terminalAspect < fitAspect) {\n // align heights\n realHeight = fitIntoHeight\n realWidth = realHeight * terminalAspect\n } else {\n // align widths\n realWidth = fitIntoWidth\n realHeight = realWidth / terminalAspect\n }\n } else if (fitIntoWidth) {\n realHeight = fitIntoWidth / (realWidth / realHeight)\n realWidth = fitIntoWidth\n } else if (fitIntoHeight) {\n realWidth = fitIntoHeight * (realWidth / realHeight)\n realHeight = fitIntoHeight\n }\n\n // store new window scale\n this._windowScale = realWidth / (width * cellSize.width)\n\n // the DPR must be rounded to a very nice value to prevent gaps between cells\n let devicePixelRatio = this._window.devicePixelRatio = Math.round(this._windowScale * (window.devicePixelRatio || 1) * 2) / 2\n\n this.canvas.width = width * devicePixelRatio * cellSize.width\n this.canvas.style.width = `${realWidth}px`\n this.canvas.height = height * devicePixelRatio * cellSize.height\n this.canvas.style.height = `${realHeight}px`\n\n // the screen has been cleared (by changing canvas width)\n this.renderer.resetDrawn()\n\n // draw immediately; the canvas shouldn't flash\n this.renderer.draw('update-size')\n }\n }\n\n /**\n * Returns a normalized version of the current selection, such that `start`\n * is always before `end`.\n * @returns {Object} the normalized selection, with `start` and `end`\n */\n getNormalizedSelection () {\n let { start, end } = this.selection\n // if the start line is after the end line, or if they're both on the same\n // line but the start column comes after the end column, swap\n if (start[1] > end[1] || (start[1] === end[1] && start[0] > end[0])) {\n [start, end] = [end, start]\n }\n return { start, end }\n }\n\n /**\n * Returns whether or not a given cell is in the current selection.\n * @param {number} col - the column (x)\n * @param {number} line - the line (y)\n * @returns {boolean}\n */\n isInSelection (col, line) {\n let { start, end } = this.getNormalizedSelection()\n let colAfterStart = start[0] <= col\n let colBeforeEnd = col < end[0]\n let onStartLine = line === start[1]\n let onEndLine = line === end[1]\n\n if (onStartLine && onEndLine) return colAfterStart && colBeforeEnd\n else if (onStartLine) return colAfterStart\n else if (onEndLine) return colBeforeEnd\n else return start[1] < line && line < end[1]\n }\n\n /**\n * Sweeps for selected cells and joins them in a multiline string.\n * @returns {string} the selection\n */\n getSelectedText () {\n const screenLength = this.window.width * this.window.height\n let lines = []\n let previousLineIndex = -1\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % this.window.width\n let y = Math.floor(cell / this.window.width)\n\n if (this.isInSelection(x, y)) {\n if (previousLineIndex !== y) {\n previousLineIndex = y\n lines.push('')\n }\n lines[lines.length - 1] += this.screen[cell]\n }\n }\n\n return lines.join('\\n')\n }\n\n /**\n * Copies the selection to clipboard and creates a notification balloon.\n */\n copySelectionToClipboard () {\n let selectedText = this.getSelectedText()\n // don't copy anything if nothing is selected\n if (!selectedText) return\n let textarea = mk('textarea')\n document.body.appendChild(textarea)\n textarea.value = selectedText\n textarea.select()\n if (document.execCommand('copy')) {\n notify.show('Copied to clipboard')\n } else {\n notify.show('Failed to copy')\n }\n document.body.removeChild(textarea)\n }\n\n /**\n * Shows an actual notification (if possible) or a notification balloon.\n * @param {string} text - the notification content\n */\n showNotification (text) {\n console.info(`Notification: ${text}`)\n if (window.Notification && window.Notification.permission === 'granted') {\n let notification = new window.Notification('ESPTerm', {\n body: text\n })\n notification.addEventListener('click', () => window.focus())\n } else {\n if (window.Notification && window.Notification.permission !== 'denied') {\n window.Notification.requestPermission()\n } else {\n // Fallback using the built-in notification balloon\n notify.show(text)\n }\n }\n }\n\n /**\n * Creates a beep sound.\n */\n beep () {\n const audioCtx = this.audioCtx\n if (!audioCtx) return\n\n // prevent screeching\n if (this._lastBeep && this._lastBeep > Date.now() - 50) return\n this._lastBeep = Date.now()\n\n if (!this._convolver) {\n this._convolver = audioCtx.createConvolver()\n let impulseLength = audioCtx.sampleRate * 0.8\n let impulse = audioCtx.createBuffer(2, impulseLength, audioCtx.sampleRate)\n for (let i = 0; i < impulseLength; i++) {\n impulse.getChannelData(0)[i] = (1 - i / impulseLength) ** (7 + Math.random())\n impulse.getChannelData(1)[i] = (1 - i / impulseLength) ** (7 + Math.random())\n }\n this._convolver.buffer = impulse\n this._convolver.connect(audioCtx.destination)\n }\n\n // main beep\n const mainOsc = audioCtx.createOscillator()\n const mainGain = audioCtx.createGain()\n mainOsc.connect(mainGain)\n mainGain.gain.value = 6\n mainOsc.frequency.value = 750\n mainOsc.type = 'sine'\n\n // surrogate beep (making it sound like 'oops')\n const surrOsc = audioCtx.createOscillator()\n const surrGain = audioCtx.createGain()\n surrOsc.connect(surrGain)\n surrGain.gain.value = 4\n surrOsc.frequency.value = 400\n surrOsc.type = 'sine'\n\n mainGain.connect(this._convolver)\n surrGain.connect(this._convolver)\n\n let startTime = audioCtx.currentTime\n mainOsc.start()\n mainOsc.stop(startTime + 0.5)\n surrOsc.start(startTime + 0.05)\n surrOsc.stop(startTime + 0.8)\n\n let loop = function () {\n if (audioCtx.currentTime < startTime + 0.8) window.requestAnimationFrame(loop)\n mainGain.gain.value *= 0.8\n surrGain.gain.value *= 0.8\n }\n loop()\n }\n\n load (...args) {\n this.parser.load(...args)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/screen.js","const $ = require('../lib/chibi')\nconst { qs } = require('../utils')\nconst { themes } = require('./themes')\n\n// constants for decoding the update blob\nconst SEQ_REPEAT = 2\nconst SEQ_SET_COLORS = 3\nconst SEQ_SET_ATTRS = 4\nconst SEQ_SET_FG = 5\nconst SEQ_SET_BG = 6\n\nmodule.exports = class ScreenParser {\n constructor (screen) {\n this.screen = screen\n\n // true if TermScreen#load was called at least once\n this.contentLoaded = false\n }\n /**\n * Parses the content of an `S` message and schedules a draw\n * @param {string} str - the message content\n */\n loadContent (str) {\n // current index\n let i = 0\n let strArray = Array.from ? Array.from(str) : str.split('')\n\n // Uncomment to capture screen content for the demo page\n // console.log(JSON.stringify(`S${str}`))\n\n if (!this.contentLoaded) {\n let errmsg = qs('#load-failed')\n if (errmsg) errmsg.parentNode.removeChild(errmsg)\n this.contentLoaded = true\n }\n\n // window size\n const newHeight = strArray[i++].codePointAt(0) - 1\n const newWidth = strArray[i++].codePointAt(0) - 1\n const resized = (this.screen.window.height !== newHeight) || (this.screen.window.width !== newWidth)\n this.screen.window.height = newHeight\n this.screen.window.width = newWidth\n\n // cursor position\n let [cursorY, cursorX] = [\n strArray[i++].codePointAt(0) - 1,\n strArray[i++].codePointAt(0) - 1\n ]\n let cursorMoved = (cursorX !== this.screen.cursor.x || cursorY !== this.screen.cursor.y)\n this.screen.cursor.x = cursorX\n this.screen.cursor.y = cursorY\n\n if (cursorMoved) {\n this.screen.renderer.resetCursorBlink()\n this.screen.emit('cursor-moved')\n }\n\n // attributes\n let attributes = strArray[i++].codePointAt(0) - 1\n\n this.screen.cursor.visible = !!(attributes & 1)\n this.screen.cursor.hanging = !!(attributes & (1 << 1))\n\n this.screen.input.setAlts(\n !!(attributes & (1 << 2)), // cursors alt\n !!(attributes & (1 << 3)), // numpad alt\n !!(attributes & (1 << 4)), // fn keys alt\n !!(attributes & (1 << 12)) // crlf mode\n )\n\n let trackMouseClicks = !!(attributes & (1 << 5))\n let trackMouseMovement = !!(attributes & (1 << 6))\n\n // 0 - Block blink 2 - Block steady (1 is unused)\n // 3 - Underline blink 4 - Underline steady\n // 5 - I-bar blink 6 - I-bar steady\n let cursorShape = (attributes >> 9) & 0x07\n\n // if it's not zero, decrement such that the two most significant bits\n // are the type and the least significant bit is the blink state\n if (cursorShape > 0) cursorShape--\n\n let cursorStyle = cursorShape >> 1\n let cursorBlinking = !(cursorShape & 1)\n\n if (cursorStyle === 0) this.screen.cursor.style = 'block'\n else if (cursorStyle === 1) this.screen.cursor.style = 'line'\n else if (cursorStyle === 2) this.screen.cursor.style = 'bar'\n\n if (this.screen.cursor.blinking !== cursorBlinking) {\n this.screen.cursor.blinking = cursorBlinking\n this.screen.renderer.resetCursorBlink()\n }\n\n this.screen.input.setMouseMode(trackMouseClicks, trackMouseMovement)\n this.screen.selection.selectable = !trackMouseClicks && !trackMouseMovement\n $(this.screen.canvas).toggleClass('selectable', this.screen.selection.selectable)\n this.screen.mouseMode = {\n clicks: trackMouseClicks,\n movement: trackMouseMovement\n }\n\n let showButtons = !!(attributes & (1 << 7))\n let showConfigLinks = !!(attributes & (1 << 8))\n\n $('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks)\n $('#action-buttons').toggleClass('hidden', !showButtons)\n\n this.screen.bracketedPaste = !!(attributes & (1 << 13))\n this.screen.reverseVideo = !!(attributes & (1 << 14))\n\n // content\n let fg = 7\n let bg = 0\n let attrs = 0\n let cell = 0 // cell index\n let lastChar = ' '\n let screenLength = this.screen.window.width * this.screen.window.height\n\n if (resized) {\n this.screen.updateSize()\n this.screen.blinkingCellCount = 0\n this.screen.screen = new Array(screenLength).fill(' ')\n this.screen.screenFG = new Array(screenLength).fill(' ')\n this.screen.screenBG = new Array(screenLength).fill(' ')\n this.screen.screenAttrs = new Array(screenLength).fill(0)\n }\n\n const MASK_LINE_ATTR = 0xC8\n const MASK_BLINK = 1 << 4\n\n let setCellContent = () => {\n // Remove blink attribute if it wouldn't have any effect\n let myAttrs = attrs\n let hasFG = attrs & (1 << 8)\n let hasBG = attrs & (1 << 9)\n if ((myAttrs & MASK_BLINK) !== 0 &&\n ((lastChar === ' ' && ((myAttrs & MASK_LINE_ATTR) === 0)) || // no line styles\n (fg === bg && hasFG && hasBG) // invisible text\n )\n ) {\n myAttrs ^= MASK_BLINK\n }\n // update blinking cells counter if blink state changed\n if ((this.screen.screenAttrs[cell] & MASK_BLINK) !== (myAttrs & MASK_BLINK)) {\n if (myAttrs & MASK_BLINK) this.screen.blinkingCellCount++\n else this.screen.blinkingCellCount--\n }\n\n this.screen.screen[cell] = lastChar\n this.screen.screenFG[cell] = fg\n this.screen.screenBG[cell] = bg\n this.screen.screenAttrs[cell] = myAttrs\n }\n\n while (i < strArray.length && cell < screenLength) {\n let character = strArray[i++]\n let charCode = character.codePointAt(0)\n\n let data\n switch (charCode) {\n case SEQ_REPEAT:\n let count = strArray[i++].codePointAt(0) - 1\n for (let j = 0; j < count; j++) {\n setCellContent()\n if (++cell > screenLength) break\n }\n break\n\n case SEQ_SET_COLORS:\n data = strArray[i++].codePointAt(0) - 1\n fg = data & 0xFF\n bg = (data >> 8) & 0xFF\n break\n\n case SEQ_SET_ATTRS:\n data = strArray[i++].codePointAt(0) - 1\n attrs = data & 0xFFFF\n break\n\n case SEQ_SET_FG:\n data = strArray[i++].codePointAt(0) - 1\n fg = data & 0xFF\n break\n\n case SEQ_SET_BG:\n data = strArray[i++].codePointAt(0) - 1\n bg = data & 0xFF\n break\n\n default:\n if (charCode < 32) character = '\\ufffd'\n lastChar = character\n setCellContent()\n cell++\n }\n }\n\n if (this.screen.window.debug) console.log(`Blinky cells: ${this.screen.blinkingCellCount}`)\n\n this.screen.renderer.scheduleDraw('load', 16)\n this.screen.emit('load')\n }\n\n /**\n * Parses the content of a `T` message and updates the screen title and button\n * labels.\n * @param {string} str - the message content\n */\n loadLabels (str) {\n let pieces = str.split('\\x01')\n let screenTitle = pieces[0]\n qs('#screen-title').textContent = screenTitle\n if (screenTitle.length === 0) screenTitle = 'Terminal'\n qs('title').textContent = `${screenTitle} :: ESPTerm`\n $('#action-buttons button').forEach((button, i) => {\n let label = pieces[i + 1].trim()\n // if empty string, use the \"dim\" effect and put nbsp instead to\n // stretch the button vertically\n button.innerHTML = label ? $.htmlEscape(label) : ' '\n button.style.opacity = label ? 1 : 0.2\n })\n }\n\n /**\n * Loads a message from the server, and optionally a theme.\n * @param {string} str - the message\n * @param {object} [opts] - options\n * @param {number} [opts.theme] - theme\n * @param {number} [opts.defaultFg] - default foreground\n * @param {number} [opts.defaultBg] - default background\n */\n load (str, opts = null) {\n const content = str.substr(1)\n\n if (opts) {\n if (typeof opts.defaultFg !== 'undefined' && typeof opts.defaultBg !== 'undefined') {\n this.screen.renderer.setDefaultColors(opts.defaultFg, opts.defaultBg)\n }\n\n if (typeof opts.theme !== 'undefined') {\n if (opts.theme >= 0 && opts.theme < themes.length) {\n this.screen.renderer.palette = themes[opts.theme]\n }\n }\n }\n\n switch (str[0]) {\n case 'S':\n this.loadContent(content)\n break\n\n case 'T':\n this.loadLabels(content)\n break\n\n case 'B':\n this.screen.beep()\n break\n\n case 'G':\n this.screen.showNotification(content)\n break\n\n default:\n console.warn(`Bad data message type; ignoring.\\n${JSON.stringify(str)}`)\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/screen_parser.js","const { themes, buildColorTable, SELECTION_FG, SELECTION_BG } = require('./themes')\n\n// Some non-bold Fraktur symbols are outside the contiguous block\nconst frakturExceptions = {\n 'C': '\\u212d',\n 'H': '\\u210c',\n 'I': '\\u2111',\n 'R': '\\u211c',\n 'Z': '\\u2128'\n}\n\nmodule.exports = class ScreenRenderer {\n constructor (screen) {\n this.screen = screen\n this.ctx = screen.ctx\n\n this._palette = null // colors 0-15\n this.defaultBgNum = 0\n this.defaultFgNum = 7\n\n // 256color lookup table\n // should not be used to look up 0-15 (will return transparent)\n this.colorTable256 = buildColorTable()\n\n this.resetDrawn()\n\n this.blinkStyleOn = false\n this.blinkInterval = null\n this.cursorBlinkOn = false\n this.cursorBlinkInterval = null\n\n // start blink timers\n this.resetBlink()\n this.resetCursorBlink()\n }\n\n resetDrawn () {\n // used to determine if a cell should be redrawn; storing the current state\n // as it is on screen\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n this.drawnCursor = [-1, -1, '']\n }\n\n /**\n * The color palette. Should define 16 colors in an array.\n * @type {string[]}\n */\n get palette () {\n return this._palette || themes[0]\n }\n\n /** @type {string[]} */\n set palette (palette) {\n if (this._palette !== palette) {\n this._palette = palette\n this.resetDrawn()\n this.scheduleDraw('palette')\n }\n }\n\n setDefaultColors (fg, bg) {\n this.defaultFgNum = fg\n this.defaultBgNum = bg\n this.resetDrawn()\n this.scheduleDraw('defaultColors')\n }\n\n /**\n * Schedule a draw in the next millisecond\n * @param {string} why - the reason why the draw occured (for debugging)\n * @param {number} [aggregateTime] - time to wait for more scheduleDraw calls\n * to occur. 1 ms by default.\n */\n scheduleDraw (why, aggregateTime = 1) {\n clearTimeout(this._scheduledDraw)\n this._scheduledDraw = setTimeout(() => this.draw(why), aggregateTime)\n }\n\n /**\n * Returns the specified color. If `i` is in the palette, it will return the\n * palette color. If `i` is between 16 and 255, it will return the 256color\n * value. If `i` is larger than 255, it will return an RGB color value. If `i`\n * is -1 (foreground) or -2 (background), it will return the selection colors.\n * @param {number} i - the color\n * @returns {string} the CSS color\n */\n getColor (i) {\n // return palette color if it exists\n if (i < 16 && i in this.palette) return this.palette[i]\n\n // -1 for selection foreground, -2 for selection background\n if (i === -1) return SELECTION_FG\n if (i === -2) return SELECTION_BG\n\n // 256 color\n if (i > 15 && i < 256) return this.colorTable256[i]\n\n // true color, encoded as (hex) + 256 (such that #000 == 256)\n if (i > 255) {\n i -= 256\n let red = (i >> 16) & 0xFF\n let green = (i >> 8) & 0xFF\n let blue = i & 0xFF\n return `rgb(${red}, ${green}, ${blue})`\n }\n\n // return error color\n return (Date.now() / 1000) % 2 === 0 ? '#f0f' : '#0f0'\n }\n\n /**\n * Resets the cursor blink to on and restarts the timer\n */\n resetCursorBlink () {\n this.cursorBlinkOn = true\n clearInterval(this.cursorBlinkInterval)\n this.cursorBlinkInterval = setInterval(() => {\n this.cursorBlinkOn = this.screen.cursor.blinking\n ? !this.cursorBlinkOn\n : true\n if (this.screen.cursor.blinking) this.scheduleDraw('cursor-blink')\n }, 500)\n }\n\n /**\n * Resets the blink style to on and restarts the timer\n */\n resetBlink () {\n this.blinkStyleOn = true\n clearInterval(this.blinkInterval)\n let intervals = 0\n this.blinkInterval = setInterval(() => {\n if (this.screen.blinkingCellCount <= 0) return\n\n intervals++\n if (intervals >= 4 && this.blinkStyleOn) {\n this.blinkStyleOn = false\n intervals = 0\n this.scheduleDraw('blink-style')\n } else if (intervals >= 1 && !this.blinkStyleOn) {\n this.blinkStyleOn = true\n intervals = 0\n this.scheduleDraw('blink-style')\n }\n }, 200)\n }\n\n /**\n * Draws a cell's background with the given parameters.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {number} options.bg - the background color\n */\n drawBackground ({ x, y, cellWidth, cellHeight, bg }) {\n const ctx = this.ctx\n ctx.fillStyle = this.getColor(bg)\n ctx.clearRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n\n /**\n * Draws a cell's character with the given parameters. Won't do anything if\n * text is an empty string.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {Object} options.charSize - the character size, an object with\n * `width` and `height` in pixels\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {string} options.text - the cell content\n * @param {number} options.fg - the foreground color\n * @param {number} options.attrs - the cell's attributes\n */\n drawCharacter ({ x, y, charSize, cellWidth, cellHeight, text, fg, attrs }) {\n if (!text) return\n\n const ctx = this.ctx\n\n let underline = false\n let strike = false\n let overline = false\n if (attrs & (1 << 1)) ctx.globalAlpha = 0.5\n if (attrs & (1 << 3)) underline = true\n if (attrs & (1 << 5)) text = ScreenRenderer.alphaToFraktur(text)\n if (attrs & (1 << 6)) strike = true\n if (attrs & (1 << 7)) overline = true\n\n ctx.fillStyle = this.getColor(fg)\n\n let codePoint = text.codePointAt(0)\n if (codePoint >= 0x2580 && codePoint <= 0x259F) {\n // block elements\n ctx.beginPath()\n const left = x * cellWidth\n const top = y * cellHeight\n const cw = cellWidth\n const ch = cellHeight\n const c2w = cellWidth / 2\n const c2h = cellHeight / 2\n\n // http://www.fileformat.info/info/unicode/block/block_elements/utf8test.htm\n // 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F\n // 0x2580 ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏\n // 0x2590 ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟\n\n if (codePoint === 0x2580) {\n // upper half block >▀<\n ctx.rect(left, top, cw, c2h)\n } else if (codePoint <= 0x2588) {\n // lower n eighth block (increasing) >▁< to >█<\n let offset = (1 - (codePoint - 0x2580) / 8) * ch\n ctx.rect(left, top + offset, cw, ch - offset)\n } else if (codePoint <= 0x258F) {\n // left n eighth block (decreasing) >▉< to >▏<\n let offset = (codePoint - 0x2588) / 8 * cw\n ctx.rect(left, top, cw - offset, ch)\n } else if (codePoint === 0x2590) {\n // right half block >▐<\n ctx.rect(left + c2w, top, c2w, ch)\n } else if (codePoint <= 0x2593) {\n // shading >░< >▒< >▓<\n\n // dot spacing by dividing cell size by a constant. This could be\n // reworked to always return a whole number, but that would require\n // prime factorization, and doing that without a loop would let you\n // take over the world, which is not within the scope of this project.\n let dotSpacingX, dotSpacingY, dotSize\n if (codePoint === 0x2591) {\n dotSpacingX = cw / 4\n dotSpacingY = ch / 10\n dotSize = 1\n } else if (codePoint === 0x2592) {\n dotSpacingX = cw / 6\n dotSpacingY = cw / 10\n dotSize = 1\n } else if (codePoint === 0x2593) {\n dotSpacingX = cw / 4\n dotSpacingY = cw / 7\n dotSize = 2\n }\n\n let alignRight = false\n for (let dy = 0; dy < ch; dy += dotSpacingY) {\n for (let dx = 0; dx < cw; dx += dotSpacingX) {\n // prevent overflow\n let dotSizeY = Math.min(dotSize, ch - dy)\n ctx.rect(x * cw + (alignRight ? cw - dx - dotSize : dx), y * ch + dy, dotSize, dotSizeY)\n }\n alignRight = !alignRight\n }\n } else if (codePoint === 0x2594) {\n // upper one eighth block >▔<\n ctx.rect(x * cw, y * ch, cw, ch / 8)\n } else if (codePoint === 0x2595) {\n // right one eighth block >▕<\n ctx.rect((x + 7 / 8) * cw, y * ch, cw / 8, ch)\n } else if (codePoint === 0x2596) {\n // left bottom quadrant >▖<\n ctx.rect(left, top + c2h, c2w, c2h)\n } else if (codePoint === 0x2597) {\n // right bottom quadrant >▗<\n ctx.rect(left + c2w, top + c2h, c2w, c2h)\n } else if (codePoint === 0x2598) {\n // left top quadrant >▘<\n ctx.rect(left, top, c2w, c2h)\n } else if (codePoint === 0x2599) {\n // left chair >▙<\n ctx.rect(left, top, c2w, ch)\n ctx.rect(left + c2w, top + c2h, c2w, c2h)\n } else if (codePoint === 0x259A) {\n // quadrants lt rb >▚<\n ctx.rect(left, top, c2w, c2h)\n ctx.rect(left + c2w, top + c2h, c2w, c2h)\n } else if (codePoint === 0x259B) {\n // left chair upside down >▛<\n ctx.rect(left, top, c2w, ch)\n ctx.rect(left + c2w, top, c2w, c2h)\n } else if (codePoint === 0x259C) {\n // right chair upside down >▜<\n ctx.rect(left, top, cw, c2h)\n ctx.rect(left + c2w, top + c2h, c2w, c2h)\n } else if (codePoint === 0x259D) {\n // right top quadrant >▝<\n ctx.rect(left + c2w, top, c2w, c2h)\n } else if (codePoint === 0x259E) {\n // quadrants lb rt >▞<\n ctx.rect(left, top + c2h, c2w, c2h)\n ctx.rect(left + c2w, top, c2w, c2h)\n } else if (codePoint === 0x259F) {\n // right chair upside down >▟<\n ctx.rect(left, top + c2h, c2w, c2h)\n ctx.rect(left + c2w, top, c2w, ch)\n }\n\n ctx.fill()\n } else {\n // Draw other characters using the text renderer\n ctx.fillText(text, (x + 0.5) * cellWidth, (y + 0.5) * cellHeight)\n }\n\n // -- line drawing - a reference for a possible future rect/line implementation ---\n // http://www.fileformat.info/info/unicode/block/box_drawing/utf8test.htm\n // 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F\n // 0x2500 ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏\n // 0x2510 ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟\n // 0x2520 ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯\n // 0x2530 ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿\n // 0x2540 ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏\n // 0x2550 ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟\n // 0x2560 ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯\n // 0x2570 ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿\n\n if (underline || strike || overline) {\n ctx.strokeStyle = this.getColor(fg)\n ctx.lineWidth = 1\n ctx.lineCap = 'round'\n ctx.beginPath()\n\n if (underline) {\n let lineY = Math.round(y * cellHeight + charSize.height) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (strike) {\n let lineY = Math.round((y + 0.5) * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (overline) {\n let lineY = Math.round(y * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n ctx.stroke()\n }\n\n ctx.globalAlpha = 1\n }\n\n /**\n * Returns all adjacent cell indices given a radius.\n * @param {number} cell - the center cell index\n * @param {number} [radius] - the radius. 1 by default\n * @returns {number[]} an array of cell indices\n */\n getAdjacentCells (cell, radius = 1) {\n const { width, height } = this.screen.window\n const screenLength = width * height\n\n let cells = []\n\n for (let x = -radius; x <= radius; x++) {\n for (let y = -radius; y <= radius; y++) {\n if (x === 0 && y === 0) continue\n cells.push(cell + x + y * width)\n }\n }\n\n return cells.filter(cell => cell >= 0 && cell < screenLength)\n }\n\n /**\n * Updates the screen.\n * @param {string} why - the draw reason (for debugging)\n */\n draw (why) {\n const ctx = this.ctx\n const {\n width,\n height,\n devicePixelRatio,\n statusScreen\n } = this.screen.window\n\n if (statusScreen) {\n // draw status screen instead\n this.drawStatus(statusScreen)\n this.startDrawLoop()\n return\n } else this.stopDrawLoop()\n\n const charSize = this.screen.getCharSize()\n const { width: cellWidth, height: cellHeight } = this.screen.getCellSize()\n const screenLength = width * height\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n\n if (this.screen.window.debug && this.screen._debug) this.screen._debug.drawStart(why)\n\n ctx.font = this.screen.getFont()\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n\n // bits in the attr value that affect the font\n const FONT_MASK = 0b101\n\n // Map of (attrs & FONT_MASK) -> Array of cell indices\n let fontGroups = new Map()\n\n // Map of (cell index) -> boolean, whether or not a cell has updated\n let updateMap = new Map()\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % width\n let y = Math.floor(cell / width)\n let isCursor = !this.screen.cursor.hanging &&\n this.screen.cursor.x === x &&\n this.screen.cursor.y === y &&\n this.screen.cursor.visible &&\n this.cursorBlinkOn\n\n let wasCursor = x === this.drawnCursor[0] && y === this.drawnCursor[1]\n\n let inSelection = this.screen.isInSelection(x, y)\n\n let text = this.screen.screen[cell]\n let fg = this.screen.screenFG[cell] | 0\n let bg = this.screen.screenBG[cell] | 0\n let attrs = this.screen.screenAttrs[cell] | 0\n\n if (!(attrs & (1 << 8))) fg = this.defaultFgNum\n if (!(attrs & (1 << 9))) bg = this.defaultBgNum\n\n if (attrs & (1 << 10)) [fg, bg] = [bg, fg] // swap - reversed character colors\n if (this.screen.reverseVideo) [fg, bg] = [bg, fg] // swap - reversed all screen\n\n if (attrs & (1 << 4) && !this.blinkStyleOn) {\n // blinking is enabled and blink style is off\n // set text to nothing so drawCharacter doesn't draw anything\n text = ''\n }\n\n if (inSelection) {\n fg = -1\n bg = -2\n }\n\n let didUpdate = text !== this.drawnScreen[cell] || // text updated\n fg !== this.drawnScreenFG[cell] || // foreground updated, and this cell has text\n bg !== this.drawnScreenBG[cell] || // background updated\n attrs !== this.drawnScreenAttrs[cell] || // attributes updated\n isCursor !== wasCursor || // cursor blink/position updated\n (isCursor && this.screen.cursor.style !== this.drawnCursor[2]) // cursor style updated\n\n let font = attrs & FONT_MASK\n if (!fontGroups.has(font)) fontGroups.set(font, [])\n\n fontGroups.get(font).push({ cell, x, y, text, fg, bg, attrs, isCursor, inSelection })\n updateMap.set(cell, didUpdate)\n }\n\n // Map of (cell index) -> boolean, whether or not a cell should be redrawn\n const redrawMap = new Map()\n\n let isTextWide = text =>\n text !== ' ' && ctx.measureText(text).width >= (cellWidth + 0.05)\n\n // decide for each cell if it should be redrawn\n let updateRedrawMapAt = cell => {\n let shouldUpdate = updateMap.get(cell) || redrawMap.get(cell) || false\n\n // TODO: fonts (necessary?)\n let text = this.screen.screen[cell]\n let isWideCell = isTextWide(text)\n let checkRadius = isWideCell ? 2 : 1\n\n if (!shouldUpdate) {\n // check adjacent cells\n let adjacentDidUpdate = false\n\n for (let adjacentCell of this.getAdjacentCells(cell, checkRadius)) {\n // update this cell if:\n // - the adjacent cell updated (For now, this'll always be true because characters can be slightly larger than they say they are)\n // - the adjacent cell updated and this cell or the adjacent cell is wide\n if (updateMap.get(adjacentCell) && (this.screen.window.graphics < 2 || isWideCell || isTextWide(this.screen.screen[adjacentCell]))) {\n adjacentDidUpdate = true\n break\n }\n }\n\n if (adjacentDidUpdate) shouldUpdate = true\n }\n\n redrawMap.set(cell, shouldUpdate)\n }\n\n for (let cell of updateMap.keys()) updateRedrawMapAt(cell)\n\n // mask to redrawing regions only\n if (this.screen.window.graphics >= 1) {\n let debug = this.screen.window.debug && this.screen._debug\n ctx.save()\n ctx.beginPath()\n for (let y = 0; y < height; y++) {\n let regionStart = null\n for (let x = 0; x < width; x++) {\n let cell = y * width + x\n let redrawing = redrawMap.get(cell)\n if (redrawing && regionStart === null) regionStart = x\n if (!redrawing && regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (x - regionStart) * cellWidth, cellHeight)\n if (debug) this.screen._debug.clipRect(regionStart * cellWidth, y * cellHeight, (x - regionStart) * cellWidth, cellHeight)\n regionStart = null\n }\n }\n if (regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (width - regionStart) * cellWidth, cellHeight)\n if (debug) this.screen._debug.clipRect(regionStart * cellWidth, y * cellHeight, (width - regionStart) * cellWidth, cellHeight)\n }\n }\n ctx.clip()\n }\n\n // pass 1: backgrounds\n for (let font of fontGroups.keys()) {\n for (let data of fontGroups.get(font)) {\n let { cell, x, y, text, bg } = data\n\n if (redrawMap.get(cell)) {\n this.drawBackground({ x, y, cellWidth, cellHeight, bg })\n\n if (this.screen.window.debug && this.screen._debug) {\n // set cell flags\n let flags = (+redrawMap.get(cell))\n flags |= (+updateMap.get(cell)) << 1\n flags |= (+isTextWide(text)) << 2\n this.screen._debug.setCell(cell, flags)\n }\n }\n }\n }\n\n // reset drawn cursor\n this.drawnCursor = [-1, -1, -1]\n\n // pass 2: characters\n for (let font of fontGroups.keys()) {\n // set font once because in Firefox, this is a really slow action for some\n // reason\n let modifiers = {}\n if (font & 1) modifiers.weight = 'bold'\n if (font & 1 << 2) modifiers.style = 'italic'\n ctx.font = this.screen.getFont(modifiers)\n\n for (let data of fontGroups.get(font)) {\n let { cell, x, y, text, fg, bg, attrs, isCursor, inSelection } = data\n\n if (redrawMap.get(cell)) {\n this.drawCharacter({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n\n this.drawnScreen[cell] = text\n this.drawnScreenFG[cell] = fg\n this.drawnScreenBG[cell] = bg\n this.drawnScreenAttrs[cell] = attrs\n\n if (isCursor) this.drawnCursor = [x, y, this.screen.cursor.style]\n\n if (isCursor && !inSelection) {\n ctx.save()\n ctx.beginPath()\n if (this.screen.cursor.style === 'block') {\n // block\n ctx.rect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n } else if (this.screen.cursor.style === 'bar') {\n // vertical bar\n let barWidth = 2\n ctx.rect(x * cellWidth, y * cellHeight, barWidth, cellHeight)\n } else if (this.screen.cursor.style === 'line') {\n // underline\n let lineHeight = 2\n ctx.rect(x * cellWidth, y * cellHeight + charSize.height, cellWidth, lineHeight)\n }\n ctx.clip()\n\n // swap foreground/background\n ;[fg, bg] = [bg, fg]\n\n // HACK: ensure cursor is visible\n if (fg === bg) bg = fg === 0 ? 7 : 0\n\n this.drawBackground({ x, y, cellWidth, cellHeight, bg })\n this.drawCharacter({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n ctx.restore()\n }\n }\n }\n }\n\n if (this.screen.window.graphics >= 1) ctx.restore()\n\n if (this.screen.window.debug && this.screen._debug) this.screen._debug.drawEnd()\n\n this.screen.emit('draw')\n }\n\n drawStatus (statusScreen) {\n const ctx = this.ctx\n const {\n fontFamily,\n width,\n height,\n devicePixelRatio\n } = this.screen.window\n\n // reset drawnScreen to force redraw when statusScreen is disabled\n this.drawnScreen = []\n\n const cellSize = this.screen.getCellSize()\n const screenWidth = width * cellSize.width\n const screenHeight = height * cellSize.height\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n ctx.clearRect(0, 0, screenWidth, screenHeight)\n\n ctx.font = `24px ${fontFamily}`\n ctx.fillStyle = '#fff'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(statusScreen.title || '', screenWidth / 2, screenHeight / 2 - 50)\n\n if (statusScreen.loading) {\n // show loading spinner\n ctx.save()\n ctx.translate(screenWidth / 2, screenHeight / 2 + 20)\n\n ctx.strokeStyle = '#fff'\n ctx.lineWidth = 5\n ctx.lineCap = 'round'\n\n let t = Date.now() / 1000\n\n for (let i = 0; i < 12; i++) {\n ctx.rotate(Math.PI / 6)\n let offset = ((t * 12) - i) % 12\n ctx.globalAlpha = Math.max(0.2, 1 - offset / 3)\n ctx.beginPath()\n ctx.moveTo(0, 15)\n ctx.lineTo(0, 30)\n ctx.stroke()\n }\n\n ctx.restore()\n }\n }\n\n startDrawLoop () {\n if (this._drawTimerThread) return\n let threadID = Math.random().toString(36)\n this._drawTimerThread = threadID\n this.drawTimerLoop(threadID)\n }\n\n stopDrawLoop () {\n this._drawTimerThread = null\n }\n\n drawTimerLoop (threadID) {\n if (!threadID || threadID !== this._drawTimerThread) return\n window.requestAnimationFrame(() => this.drawTimerLoop(threadID))\n this.draw('draw-loop')\n }\n\n /**\n * Converts an alphabetic character to its fraktur variant.\n * @param {string} character - the character\n * @returns {string} the converted character\n */\n static alphaToFraktur (character) {\n if (character >= 'a' && character <= 'z') {\n character = String.fromCodePoint(0x1d51e - 0x61 + character.charCodeAt(0))\n } else if (character >= 'A' && character <= 'Z') {\n character = frakturExceptions[character] || String.fromCodePoint(0x1d504 - 0x41 + character.charCodeAt(0))\n }\n return character\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/screen_renderer.js","const EventEmitter = require('events')\nconst $ = require('../lib/chibi')\nlet demo\ntry { demo = require('./demo') } catch (err) {}\n\n/** Handle connections */\nmodule.exports = class TermConnection extends EventEmitter {\n constructor (screen) {\n super()\n\n this.screen = screen\n this.ws = null\n this.heartbeatTimeout = null\n this.pingInterval = null\n this.xoff = false\n this.autoXoffTimeout = null\n this.reconnTimeout = null\n this.forceClosing = false\n\n this.pageShown = false\n\n document.addEventListener('visibilitychange', () => {\n if (document.hidden === true) {\n console.info('Window lost focus, freeing socket')\n this.closeSocket()\n clearTimeout(this.heartbeatTimeout)\n } else {\n console.info('Window got focus, re-connecting')\n this.init()\n }\n }, false)\n }\n\n onWSOpen (evt) {\n console.log('CONNECTED')\n this.heartbeat()\n this.send('i')\n this.forceClosing = false\n\n this.emit('connect')\n }\n\n onWSClose (evt) {\n if (this.forceClosing) {\n this.forceClosing = false\n return\n }\n console.warn('SOCKET CLOSED, code ' + evt.code + '. Reconnecting...')\n if (evt.code < 1000) {\n console.error('Bad code from socket!')\n // this sometimes happens for unknown reasons, code < 1000 is invalid\n // location.reload()\n }\n\n clearTimeout(this.reconnTimeout)\n this.reconnTimeout = setTimeout(() => this.init(), 2000)\n\n this.emit('disconnect', evt.code)\n }\n\n onWSMessage (evt) {\n try {\n switch (evt.data.charAt(0)) {\n case '.':\n // heartbeat, no-op message\n break\n\n case '-':\n // console.log('xoff');\n this.xoff = true\n this.autoXoffTimeout = setTimeout(() => {\n this.xoff = false\n }, 250)\n break\n\n case '+':\n // console.log('xon');\n this.xoff = false\n clearTimeout(this.autoXoffTimeout)\n break\n\n default:\n this.emit('load')\n this.screen.load(evt.data)\n if (!this.pageShown) {\n window.showPage()\n this.pageShown = true\n }\n break\n }\n this.heartbeat()\n } catch (e) {\n console.error(e)\n }\n }\n\n canSend () {\n return !this.xoff\n }\n\n send (message) {\n if (window._demo) {\n if (typeof window.demoInterface !== 'undefined') {\n demo.input(message)\n } else {\n console.log(`TX: ${JSON.stringify(message)}`)\n }\n return true // Simulate success\n }\n if (this.xoff) {\n // TODO queue\n console.log(\"Can't send, flood control.\")\n return false\n }\n\n if (!this.ws) return false // for dry testing\n if (this.ws.readyState !== 1) {\n console.error('Socket not ready')\n return false\n }\n if (typeof message != 'string') {\n message = JSON.stringify(message)\n }\n this.ws.send(message)\n return true\n }\n\n /** Safely close the socket */\n closeSocket () {\n if (this.ws) {\n this.forceClosing = true\n this.ws.close()\n this.ws = null\n }\n }\n\n init () {\n if (window._demo) {\n if (typeof window.demoInterface === 'undefined') {\n window.alert('Demoing non-demo build!') // this will catch mistakes when deploying to the website\n } else {\n demo.init(this.screen)\n }\n return\n }\n\n clearTimeout(this.reconnTimeout)\n clearTimeout(this.heartbeatTimeout)\n\n this.closeSocket()\n\n this.ws = new window.WebSocket('ws://' + window._root + '/term/update.ws')\n this.ws.addEventListener('open', (...args) => this.onWSOpen(...args))\n this.ws.addEventListener('close', (...args) => this.onWSClose(...args))\n this.ws.addEventListener('message', (...args) => this.onWSMessage(...args))\n console.log('Opening socket.')\n this.heartbeat()\n\n this.emit('open')\n }\n\n heartbeat () {\n clearTimeout(this.heartbeatTimeout)\n this.heartbeatTimeout = setTimeout(() => this.onHeartbeatFail(), 2000)\n }\n\n onHeartbeatFail () {\n this.closeSocket()\n this.emit('silence')\n console.error('Heartbeat lost, probing server...')\n clearInterval(this.pingInterval)\n\n this.pingInterval = setInterval(() => {\n console.log('> ping')\n this.emit('ping')\n $.get('http://' + window._root + '/system/ping', (resp, status) => {\n if (status === 200) {\n clearInterval(this.pingInterval)\n console.info('Server ready, opening socket…')\n this.emit('ping-success')\n this.init()\n // location.reload()\n } else this.emit('ping-fail', status)\n }, {\n timeout: 100,\n loader: false // we have loader on-screen\n })\n }, 1000)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/connection.js","const $ = require('../lib/chibi')\nconst { encode2B } = require('../utils')\n\n/**\n * User input\n *\n * --- Rx messages: ---\n * S - screen content (binary encoding of the entire screen with simple compression)\n * T - text labels - Title and buttons, \\0x01-separated\n * B - beep\n * . - heartbeat\n *\n * --- Tx messages ---\n * s - string\n * b - action button\n * p - mb press\n * r - mb release\n * m - mouse move\n */\nmodule.exports = function (conn, screen) {\n // handle for input object\n let input\n\n const KEY_NAMES = {\n 0x03: 'Cancel',\n 0x06: 'Help',\n 0x08: 'Backspace',\n 0x09: 'Tab',\n 0x0C: 'Clear',\n 0x0D: 'Enter',\n 0x10: 'Shift',\n 0x11: 'Control',\n 0x12: 'Alt',\n 0x13: 'Pause',\n 0x14: 'CapsLock',\n 0x1B: 'Escape',\n 0x20: ' ',\n 0x21: 'PageUp',\n 0x22: 'PageDown',\n 0x23: 'End',\n 0x24: 'Home',\n 0x25: 'ArrowLeft',\n 0x26: 'ArrowUp',\n 0x27: 'ArrowRight',\n 0x28: 'ArrowDown',\n 0x29: 'Select',\n 0x2A: 'Print',\n 0x2B: 'Execute',\n 0x2C: 'PrintScreen',\n 0x2D: 'Insert',\n 0x2E: 'Delete',\n 0x3A: ':',\n 0x3B: ';',\n 0x3C: '<',\n 0x3D: '=',\n 0x3E: '>',\n 0x3F: '?',\n 0x40: '@',\n 0x5B: 'Meta',\n 0x5C: 'Meta',\n 0x5D: 'ContextMenu',\n 0x6A: 'Numpad*',\n 0x6B: 'Numpad+',\n 0x6D: 'Numpad-',\n 0x6E: 'Numpad.',\n 0x6F: 'Numpad/',\n 0x90: 'NumLock',\n 0x91: 'ScrollLock',\n 0xA0: '^',\n 0xA1: '!',\n 0xA2: '\"',\n 0xA3: '#',\n 0xA4: '$',\n 0xA5: '%',\n 0xA6: '&',\n 0xA7: '_',\n 0xA8: '(',\n 0xA9: ')',\n 0xAA: '*',\n 0xAB: '+',\n 0xAC: '|',\n 0xAD: '-',\n 0xAE: '{',\n 0xAF: '}',\n 0xB0: '~',\n 0xBA: ';',\n 0xBB: '=',\n 0xBC: 'Numpad,',\n 0xBD: '-',\n 0xBE: 'Numpad,',\n 0xC0: '`',\n 0xC2: 'Numpad,',\n 0xDB: '[',\n 0xDC: '\\\\',\n 0xDD: ']',\n 0xDE: \"'\",\n 0xE0: 'Meta'\n }\n // numbers 0-9\n for (let i = 0x30; i <= 0x39; i++) KEY_NAMES[i] = String.fromCharCode(i)\n // characters A-Z\n for (let i = 0x41; i <= 0x5A; i++) KEY_NAMES[i] = String.fromCharCode(i)\n // function F1-F20\n for (let i = 0x70; i <= 0x83; i++) KEY_NAMES[i] = `F${i - 0x70 + 1}`\n // numpad 0-9\n for (let i = 0x60; i <= 0x69; i++) KEY_NAMES[i] = `Numpad${i - 0x60}`\n\n let cfg = {\n np_alt: false,\n cu_alt: false,\n fn_alt: false,\n mt_click: false,\n mt_move: false,\n no_keys: false,\n crlf_mode: false,\n all_fn: false\n }\n\n /** Fn alt choice for key message */\n const fa = (alt, normal) => cfg.fn_alt ? alt : normal\n\n /** Cursor alt choice for key message */\n const ca = (alt, normal) => cfg.cu_alt ? alt : normal\n\n /** Numpad alt choice for key message */\n const na = (alt, normal) => cfg.np_alt ? alt : normal\n\n const keymap = {\n /* eslint-disable key-spacing */\n 'Backspace': '\\x08',\n 'Tab': '\\x09',\n 'Enter': () => cfg.crlf_mode ? '\\x0d\\x0a' : '\\x0d',\n 'Control+Enter': '\\x0a',\n 'Escape': '\\x1b',\n 'ArrowUp': () => ca('\\x1bOA', '\\x1b[A'),\n 'ArrowDown': () => ca('\\x1bOB', '\\x1b[B'),\n 'ArrowRight': () => ca('\\x1bOC', '\\x1b[C'),\n 'ArrowLeft': () => ca('\\x1bOD', '\\x1b[D'),\n 'Home': () => ca('\\x1bOH', fa('\\x1b[H', '\\x1b[1~')),\n 'Insert': '\\x1b[2~',\n 'Delete': '\\x1b[3~',\n 'End': () => ca('\\x1bOF', fa('\\x1b[F', '\\x1b[4~')),\n 'PageUp': '\\x1b[5~',\n 'PageDown': '\\x1b[6~',\n 'F1': () => fa('\\x1bOP', '\\x1b[11~'),\n 'F2': () => fa('\\x1bOQ', '\\x1b[12~'),\n 'F3': () => fa('\\x1bOR', '\\x1b[13~'),\n 'F4': () => fa('\\x1bOS', '\\x1b[14~'),\n 'F5': '\\x1b[15~', // note the disconnect\n 'F6': '\\x1b[17~',\n 'F7': '\\x1b[18~',\n 'F8': '\\x1b[19~',\n 'F9': '\\x1b[20~',\n 'F10': '\\x1b[21~', // note the disconnect\n 'F11': '\\x1b[23~',\n 'F12': '\\x1b[24~',\n 'Shift+F1': () => fa('\\x1bO1;2P', '\\x1b[25~'),\n 'Shift+F2': () => fa('\\x1bO1;2Q', '\\x1b[26~'), // note the disconnect\n 'Shift+F3': () => fa('\\x1bO1;2R', '\\x1b[28~'),\n 'Shift+F4': () => fa('\\x1bO1;2S', '\\x1b[29~'), // note the disconnect\n 'Shift+F5': () => fa('\\x1b[15;2~', '\\x1b[31~'),\n 'Shift+F6': () => fa('\\x1b[17;2~', '\\x1b[32~'),\n 'Shift+F7': () => fa('\\x1b[18;2~', '\\x1b[33~'),\n 'Shift+F8': () => fa('\\x1b[19;2~', '\\x1b[34~'),\n 'Shift+F9': () => fa('\\x1b[20;2~', '\\x1b[35~'), // 35-38 are not standard - but what is?\n 'Shift+F10': () => fa('\\x1b[21;2~', '\\x1b[36~'),\n 'Shift+F11': () => fa('\\x1b[22;2~', '\\x1b[37~'),\n 'Shift+F12': () => fa('\\x1b[23;2~', '\\x1b[38~'),\n 'Numpad0': () => na('\\x1bOp', '0'),\n 'Numpad1': () => na('\\x1bOq', '1'),\n 'Numpad2': () => na('\\x1bOr', '2'),\n 'Numpad3': () => na('\\x1bOs', '3'),\n 'Numpad4': () => na('\\x1bOt', '4'),\n 'Numpad5': () => na('\\x1bOu', '5'),\n 'Numpad6': () => na('\\x1bOv', '6'),\n 'Numpad7': () => na('\\x1bOw', '7'),\n 'Numpad8': () => na('\\x1bOx', '8'),\n 'Numpad9': () => na('\\x1bOy', '9'),\n 'Numpad*': () => na('\\x1bOR', '*'),\n 'Numpad+': () => na('\\x1bOl', '+'),\n 'Numpad-': () => na('\\x1bOS', '-'),\n 'Numpad.': () => na('\\x1bOn', '.'),\n 'Numpad/': () => na('\\x1bOQ', '/'),\n // we don't implement numlock key (should change in numpad_alt mode,\n // but it's even more useless than the rest and also has the side\n // effect of changing the user's numlock state)\n\n // shortcuts\n 'Control+]': '\\x1b', // alternate way to enter ESC\n 'Control+\\\\': '\\x1c',\n 'Control+[': '\\x1d',\n 'Control+^': '\\x1e',\n 'Control+_': '\\x1f',\n\n // extra controls\n 'Control+ArrowLeft': '\\x1f[1;5D',\n 'Control+ArrowRight': '\\x1f[1;5C',\n 'Control+ArrowUp': '\\x1f[1;5A',\n 'Control+ArrowDown': '\\x1f[1;5B',\n 'Control+Home': '\\x1f[1;5H',\n 'Control+End': '\\x1f[1;5F',\n\n // extra shift controls\n 'Shift+ArrowLeft': '\\x1f[1;2D',\n 'Shift+ArrowRight': '\\x1f[1;2C',\n 'Shift+ArrowUp': '\\x1f[1;2A',\n 'Shift+ArrowDown': '\\x1f[1;2B',\n 'Shift+Home': '\\x1f[1;2H',\n 'Shift+End': '\\x1f[1;2F',\n\n // macOS text editing commands\n 'Alt+ArrowLeft': '\\x1bb', // ⌥← to go back a word (^[b)\n 'Alt+ArrowRight': '\\x1bf', // ⌥→ to go forward one word (^[f)\n 'Meta+ArrowLeft': '\\x01', // ⌘← to go to the beginning of a line (^A)\n 'Meta+ArrowRight': '\\x05', // ⌘→ to go to the end of a line (^E)\n 'Alt+Backspace': '\\x17', // ⌥⌫ to delete a word (^W)\n 'Meta+Backspace': '\\x15', // ⌘⌫ to delete to the beginning of a line (^U)\n\n // copy to clipboard\n 'Control+Shift+C' () {\n screen.copySelectionToClipboard()\n },\n 'Control+Insert' () {\n screen.copySelectionToClipboard()\n },\n\n // toggle debug mode\n 'Control+F12' () {\n screen.window.debug ^= 1\n }\n /* eslint-enable key-spacing */\n }\n\n // ctrl+[A-Z] sent as simple low ASCII codes\n for (let i = 1; i <= 26; i++) {\n keymap[`Control+${String.fromCharCode(0x40 + i)}`] = String.fromCharCode(i)\n }\n\n /** Send a literal message */\n function sendString (str) {\n return conn.send('s' + str)\n }\n\n /** Send a button event */\n function sendButton (n) {\n conn.send('b' + String.fromCharCode(n))\n }\n\n const shouldAcceptEvent = function () {\n if (cfg.no_keys) return false\n if (document.activeElement instanceof window.HTMLTextAreaElement) return false\n return true\n }\n\n const keyBlacklist = [\n 'F5', 'F11', 'F12', 'Shift+F5'\n ]\n\n const handleKeyDown = function (e) {\n if (!shouldAcceptEvent()) return\n if (cfg.no_keys) return\n\n let modifiers = []\n // sorted alphabetically\n if (e.altKey) modifiers.push('Alt')\n if (e.ctrlKey) modifiers.push('Control')\n if (e.metaKey) modifiers.push('Meta')\n if (e.shiftKey) modifiers.push('Shift')\n\n let key = KEY_NAMES[e.which] || e.key\n\n // ignore clipboard events\n if ((e.ctrlKey || e.metaKey) && key === 'V') return\n\n let binding = null\n\n for (let name in keymap) {\n let itemModifiers = name.split('+')\n let itemKey = itemModifiers.pop()\n\n if (itemKey === key && itemModifiers.sort().join() === modifiers.join()) {\n if (keyBlacklist.includes(name) && !cfg.all_fn) continue\n binding = keymap[name]\n break\n }\n }\n\n if (binding) {\n if (binding instanceof Function) binding = binding()\n e.preventDefault()\n if (typeof binding === 'string') {\n sendString(binding)\n }\n }\n }\n\n /** Bind/rebind key messages */\n function initKeys ({ allFn }) {\n // This takes care of text characters typed\n window.addEventListener('keypress', function (evt) {\n if (!shouldAcceptEvent()) return\n if (evt.ctrlKey || evt.metaKey) return\n\n let str = ''\n if (evt.key && evt.key.length === 1) str = evt.key\n else if (evt.which && evt.which !== 229) str = String.fromCodePoint(evt.which)\n\n if (str.length > 0 && str.charCodeAt(0) >= 32) {\n // prevent space from scrolling\n if (evt.which === 32) evt.preventDefault()\n sendString(str)\n }\n })\n\n window.addEventListener('keydown', handleKeyDown)\n window.addEventListener('copy', e => {\n if (!shouldAcceptEvent()) return\n let selectedText = screen.getSelectedText()\n if (selectedText) {\n e.preventDefault()\n e.clipboardData.setData('text/plain', selectedText)\n }\n })\n window.addEventListener('paste', e => {\n if (!shouldAcceptEvent()) return\n e.preventDefault()\n let string = e.clipboardData.getData('text/plain')\n if (string.includes('\\n') || string.length > 90) {\n if (!input.termUpload) console.error('input.termUpload is undefined')\n input.termUpload.setContent(string)\n input.termUpload.open()\n } else {\n // simple string, just paste it\n if (screen.bracketedPaste) string = `\\x1b[200~${string}\\x1b[201~`\n sendString(string)\n }\n })\n\n cfg.all_fn = allFn\n }\n\n // mouse button states\n let mb1 = 0\n let mb2 = 0\n let mb3 = 0\n\n /** Init the Input module */\n function init (opts) {\n initKeys(opts)\n\n // Button presses\n $('#action-buttons button').forEach(s => {\n s.addEventListener('click', function (evt) {\n sendButton(+this.dataset['n'])\n })\n })\n\n // global mouse state tracking - for motion reporting\n window.addEventListener('mousedown', evt => {\n if (evt.button === 0) mb1 = 1\n if (evt.button === 1) mb2 = 1\n if (evt.button === 2) mb3 = 1\n })\n\n window.addEventListener('mouseup', evt => {\n if (evt.button === 0) mb1 = 0\n if (evt.button === 1) mb2 = 0\n if (evt.button === 2) mb3 = 0\n })\n }\n\n // record modifier keys\n // bits: Meta, Alt, Shift, Ctrl\n let modifiers = 0b0000\n\n window.addEventListener('keydown', e => {\n if (e.ctrlKey) modifiers |= 1\n if (e.shiftKey) modifiers |= 2\n if (e.altKey) modifiers |= 4\n if (e.metaKey) modifiers |= 8\n })\n window.addEventListener('keyup', e => {\n modifiers = 0\n if (e.ctrlKey) modifiers |= 1\n if (e.shiftKey) modifiers |= 2\n if (e.altKey) modifiers |= 4\n if (e.metaKey) modifiers |= 8\n })\n\n /** Prepare modifiers byte for mouse message */\n function packModifiersForMouse () {\n return modifiers\n }\n\n input = {\n /** Init the Input module */\n init,\n\n /** Send a literal string message */\n sendString,\n\n /** Enable alternate key modes (cursors, numpad, fn) */\n setAlts: function (cu, np, fn, crlf) {\n if (cfg.cu_alt !== cu || cfg.np_alt !== np || cfg.fn_alt !== fn || cfg.crlf_mode !== crlf) {\n cfg.cu_alt = cu\n cfg.np_alt = np\n cfg.fn_alt = fn\n cfg.crlf_mode = crlf\n }\n },\n\n setMouseMode (click, move) {\n cfg.mt_click = click\n cfg.mt_move = move\n },\n\n // Mouse events\n onMouseMove (x, y) {\n if (!cfg.mt_move) return\n const b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0\n const m = packModifiersForMouse()\n conn.send('m' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n },\n\n onMouseDown (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n },\n\n onMouseUp (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('r' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseWheel (x, y, dir) {\n if (!cfg.mt_click) return\n // -1 ... btn 4 (away from user)\n // +1 ... btn 5 (towards user)\n const m = packModifiersForMouse()\n const b = (dir < 0 ? 4 : 5)\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n /**\n * Prevent capturing keys. This is used for text input\n * modals on the terminal screen\n */\n blockKeys (yes) {\n cfg.no_keys = yes\n },\n\n handleKeyDown\n }\n return input\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/input.js","const $ = require('../lib/chibi')\nconst { qs } = require('../utils')\nconst modal = require('../modal')\n\n/** File upload utility */\nmodule.exports = function (conn, input, screen) {\n let lines, // array of lines without newlines\n line_i, // current line index\n fuTout, // timeout handle for line sending\n send_delay_ms, // delay between lines (ms)\n nl_str, // newline string to use\n curLine, // current line (when using fuOil)\n inline_pos // Offset in line (for long lines)\n\n // lines longer than this are split to chunks\n // sending a super-ling string through the socket is not a good idea\n const MAX_LINE_LEN = 128\n\n function openUploadDialog () {\n updateStatus('Ready...')\n modal.show('#fu_modal', onDialogClose)\n $('#fu_form').toggleClass('busy', false)\n input.blockKeys(true)\n }\n\n function onDialogClose () {\n console.log('Upload modal closed.')\n clearTimeout(fuTout)\n line_i = 0\n input.blockKeys(false)\n }\n\n function updateStatus (msg) {\n qs('#fu_prog').textContent = msg\n }\n\n function startUpload () {\n let v = qs('#fu_text').value\n if (!v.length) {\n fuClose()\n return\n }\n\n lines = v.split('\\n')\n line_i = 0\n inline_pos = 0 // offset in line\n send_delay_ms = qs('#fu_delay').value\n\n // sanitize - 0 causes overflows\n if (send_delay_ms < 0) {\n send_delay_ms = 0\n qs('#fu_delay').value = send_delay_ms\n }\n\n nl_str = {\n 'CR': '\\r',\n 'LF': '\\n',\n 'CRLF': '\\r\\n'\n }[qs('#fu_crlf').value]\n\n $('#fu_form').toggleClass('busy', true)\n updateStatus('Starting...')\n uploadLine()\n }\n\n function uploadLine () {\n if (!$('#fu_modal').hasClass('visible')) {\n // Modal is closed, cancel\n return\n }\n\n if (!conn.canSend()) {\n // postpone\n fuTout = setTimeout(uploadLine, 1)\n return\n }\n\n if (inline_pos === 0) {\n curLine = ''\n if (line_i === 0) {\n if (screen.bracketedPaste) {\n curLine = '\\x1b[200~'\n }\n }\n\n curLine += lines[line_i++] + nl_str\n\n if (line_i === lines.length) {\n if (screen.bracketedPaste) {\n curLine += '\\x1b[201~'\n }\n }\n }\n\n let chunk\n if ((curLine.length - inline_pos) <= MAX_LINE_LEN) {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos = 0\n } else {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos += MAX_LINE_LEN\n }\n\n if (!input.sendString(chunk)) {\n updateStatus('FAILED!')\n return\n }\n\n let pt = Math.round((line_i / lines.length) * 1000) / 10\n updateStatus(`${line_i} / ${lines.length} (${pt}%)`)\n\n if (lines.length > line_i || inline_pos > 0) {\n fuTout = setTimeout(uploadLine, send_delay_ms)\n } else {\n closeWhenReady()\n }\n }\n\n function closeWhenReady () {\n if (!conn.canSend()) {\n // stuck in XOFF still, wait to process...\n updateStatus('Waiting for Tx buffer...')\n setTimeout(closeWhenReady, 100)\n } else {\n updateStatus('Done.')\n // delay to show it\n fuClose()\n }\n }\n\n function fuClose () {\n modal.hide('#fu_modal')\n }\n\n return {\n init: function () {\n qs('#fu_file').addEventListener('change', function (evt) {\n let reader = new window.FileReader()\n let file = evt.target.files[0]\n let ftype = file.type || 'application/octet-stream'\n console.log('Selected file type: ' + ftype)\n if (!ftype.match(/text\\/.*|application\\/(json|csv|.*xml.*|.*script.*|x-php)/)) {\n // Deny load of blobs like img - can crash browser and will get corrupted anyway\n if (!window.confirm(`This does not look like a text file: ${ftype}\\nReally load?`)) {\n qs('#fu_file').value = ''\n return\n }\n }\n reader.onload = function (e) {\n const txt = e.target.result.replace(/[\\r\\n]+/, '\\n')\n qs('#fu_text').value = txt\n }\n console.log('Loading file...')\n reader.readAsText(file)\n }, false)\n\n qs('#term-fu-open').addEventListener('click', function () {\n openUploadDialog()\n return false\n })\n\n qs('#term-fu-start').addEventListener('click', function () {\n startUpload()\n return false\n })\n\n qs('#term-fu-close').addEventListener('click', function () {\n fuClose()\n return false\n })\n },\n open: openUploadDialog,\n setContent (content) {\n qs('#fu_text').value = content\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/upload.js","const { qs } = require('../utils')\n\nmodule.exports = function (screen, input) {\n const keyInput = qs('#softkb-input')\n if (!keyInput) return // abort, we're not on the terminal page\n\n const shortcutBar = document.createElement('div')\n shortcutBar.id = 'keyboard-shortcut-bar'\n if (navigator.userAgent.match(/iPad|iPhone|iPod/)) {\n qs('#screen').appendChild(shortcutBar)\n }\n\n let keyboardOpen = false\n\n // moves the input to where the cursor is on the canvas.\n // this is because most browsers will always scroll to wherever the focused\n // input is\n let updateInputPosition = function () {\n if (!keyboardOpen) return\n\n let [x, y] = screen.gridToScreen(screen.cursor.x, screen.cursor.y, true)\n keyInput.style.transform = `translate(${x}px, ${y}px)`\n }\n\n keyInput.addEventListener('focus', () => {\n keyboardOpen = true\n updateInputPosition()\n shortcutBar.classList.add('open')\n })\n\n keyInput.addEventListener('blur', () => {\n keyboardOpen = false\n shortcutBar.classList.remove('open')\n })\n\n screen.on('cursor-moved', updateInputPosition)\n\n qs('#term-kb-open').addEventListener('click', e => {\n e.preventDefault()\n keyInput.focus()\n })\n\n // Chrome for Android doesn't send proper keydown/keypress events with\n // real key values instead of 229 “Unidentified,” so here's a workaround\n // that deals with the input composition events.\n\n let lastCompositionString = ''\n\n // sends the difference between the last and the new composition string\n let sendInputDelta = function (newValue) {\n let resend = false\n if (newValue.length > lastCompositionString.length) {\n if (newValue.startsWith(lastCompositionString)) {\n // characters have been added at the end\n input.sendString(newValue.substr(lastCompositionString.length))\n } else resend = true\n } else if (newValue.length < lastCompositionString.length) {\n if (lastCompositionString.startsWith(newValue)) {\n // characters have been removed at the end\n input.sendString('\\b'.repeat(lastCompositionString.length -\n newValue.length))\n } else resend = true\n } else if (newValue !== lastCompositionString) resend = true\n\n if (resend) {\n // the entire string changed; resend everything\n input.sendString('\\b'.repeat(lastCompositionString.length) +\n newValue)\n }\n lastCompositionString = newValue\n }\n\n keyInput.addEventListener('keydown', e => {\n if (e.key === 'Unidentified') return\n\n keyInput.value = ''\n\n e.stopPropagation()\n input.handleKeyDown(e)\n })\n\n keyInput.addEventListener('keypress', e => {\n // prevent key duplication on iOS (because Safari *does* send proper events)\n e.stopPropagation()\n })\n\n keyInput.addEventListener('input', e => {\n e.stopPropagation()\n\n if (e.isComposing && 'data' in e) {\n sendInputDelta(e.data)\n } else if (e.isComposing) {\n // Firefox Mobile doesn't support InputEvent#data, so here's a hack\n // that just takes the input value and uses that\n sendInputDelta(keyInput.value)\n } else {\n if (e.inputType === 'insertCompositionText') input.sendString(e.data)\n else if (e.inputType === 'deleteContentBackward') {\n lastCompositionString = ''\n sendInputDelta('')\n } else if (e.inputType === 'insertText') {\n input.sendString(e.data)\n }\n }\n })\n\n keyInput.addEventListener('compositionstart', e => {\n lastCompositionString = ''\n })\n\n keyInput.addEventListener('compositionend', e => {\n lastCompositionString = ''\n keyInput.value = ''\n })\n\n screen.on('open-soft-keyboard', () => keyInput.focus())\n\n // shortcut bar\n const shortcuts = {\n Tab: 0x09,\n '←': 0x25,\n '↓': 0x28,\n '↑': 0x26,\n '→': 0x27,\n '^C': { which: 0x43, ctrlKey: true }\n }\n\n for (const shortcut in shortcuts) {\n const button = document.createElement('button')\n button.classList.add('shortcut-button')\n button.textContent = shortcut\n shortcutBar.appendChild(button)\n\n const key = shortcuts[shortcut]\n button.addEventListener('click', e => {\n e.preventDefault()\n let fakeEvent = key\n if (typeof key === 'number') fakeEvent = { which: key }\n fakeEvent.preventDefault = () => {}\n input.handleKeyDown(fakeEvent)\n })\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/soft_keyboard.js","const { mk } = require('../utils')\n\nmodule.exports = function attachDebugScreen (screen) {\n const debugCanvas = mk('canvas')\n const ctx = debugCanvas.getContext('2d')\n\n debugCanvas.style.position = 'absolute'\n // hackity hack should probably set this in CSS\n debugCanvas.style.top = '6px'\n debugCanvas.style.left = '6px'\n debugCanvas.style.pointerEvents = 'none'\n\n let addCanvas = function () {\n if (!debugCanvas.parentNode) screen.canvas.parentNode.appendChild(debugCanvas)\n }\n let removeCanvas = function () {\n if (debugCanvas.parentNode) debugCanvas.parentNode.removeChild(debugCanvas)\n }\n let updateCanvasSize = function () {\n let { width, height, devicePixelRatio } = screen.window\n let cellSize = screen.getCellSize()\n debugCanvas.width = width * cellSize.width * devicePixelRatio\n debugCanvas.height = height * cellSize.height * devicePixelRatio\n debugCanvas.style.width = `${width * cellSize.width}px`\n debugCanvas.style.height = `${height * cellSize.height}px`\n }\n\n let startTime, endTime, lastReason\n let cells = new Map()\n let clippedRects = []\n\n let startDrawing\n\n screen._debug = {\n drawStart (reason) {\n lastReason = reason\n startTime = Date.now()\n clippedRects = []\n },\n drawEnd () {\n endTime = Date.now()\n console.log(`Draw: ${lastReason} (${(endTime - startTime)} ms) with fancy graphics: ${screen.window.graphics}`)\n startDrawing()\n },\n setCell (cell, flags) {\n cells.set(cell, [flags, Date.now()])\n },\n clipRect (...args) {\n clippedRects.push(args)\n }\n }\n\n let clipPattern\n {\n let patternCanvas = document.createElement('canvas')\n patternCanvas.width = patternCanvas.height = 12\n let pctx = patternCanvas.getContext('2d')\n pctx.lineWidth = 1\n pctx.strokeStyle = '#00f'\n pctx.beginPath()\n pctx.moveTo(0, 0)\n pctx.lineTo(0 - 4, 12)\n pctx.moveTo(4, 0)\n pctx.lineTo(4 - 4, 12)\n pctx.moveTo(8, 0)\n pctx.lineTo(8 - 4, 12)\n pctx.moveTo(12, 0)\n pctx.lineTo(12 - 4, 12)\n pctx.moveTo(16, 0)\n pctx.lineTo(16 - 4, 12)\n pctx.stroke()\n clipPattern = ctx.createPattern(patternCanvas, 'repeat')\n }\n\n let isDrawing = false\n\n let drawLoop = function () {\n if (isDrawing) window.requestAnimationFrame(drawLoop)\n\n let { devicePixelRatio, width, height } = screen.window\n let { width: cellWidth, height: cellHeight } = screen.getCellSize()\n let screenLength = width * height\n let now = Date.now()\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n ctx.clearRect(0, 0, width * cellWidth, height * cellHeight)\n\n let activeCells = 0\n for (let cell = 0; cell < screenLength; cell++) {\n if (!cells.has(cell) || cells.get(cell)[0] === 0) continue\n\n let [flags, timestamp] = cells.get(cell)\n let elapsedTime = (now - timestamp) / 1000\n\n if (elapsedTime > 1) continue\n\n activeCells++\n ctx.globalAlpha = 0.5 * Math.max(0, 1 - elapsedTime)\n\n let x = cell % width\n let y = Math.floor(cell / width)\n\n if (flags & 1) {\n // redrawn\n ctx.fillStyle = '#f0f'\n }\n if (flags & 2) {\n // updated\n ctx.fillStyle = '#0f0'\n }\n\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n\n if (flags & 4) {\n // wide cell\n ctx.lineWidth = 2\n ctx.strokeStyle = '#f00'\n ctx.strokeRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n }\n\n if (clippedRects.length) {\n ctx.globalAlpha = 0.5\n ctx.beginPath()\n\n for (let rect of clippedRects) {\n ctx.rect(...rect)\n }\n\n ctx.fillStyle = clipPattern\n ctx.fill()\n }\n\n if (activeCells === 0) {\n isDrawing = false\n removeCanvas()\n }\n }\n\n startDrawing = function () {\n if (isDrawing) return\n addCanvas()\n updateCanvasSize()\n isDrawing = true\n drawLoop()\n }\n\n // debug toolbar\n const toolbar = mk('div')\n toolbar.classList.add('debug-toolbar')\n let toolbarAttached = false\n\n const attachToolbar = function () {\n screen.canvas.parentNode.appendChild(toolbar)\n }\n const detachToolbar = function () {\n toolbar.parentNode.removeChild(toolbar)\n }\n\n screen.on('update-window:debug', debug => {\n if (debug !== toolbarAttached) {\n toolbarAttached = debug\n if (debug) attachToolbar()\n else detachToolbar()\n }\n })\n\n screen.on('draw', () => {\n if (!toolbarAttached) return\n let cursorCell = screen.cursor.y * screen.window.width + screen.cursor.x\n let cellFG = screen.screenFG[cursorCell]\n let cellBG = screen.screenBG[cursorCell]\n let cellCode = (screen.screen[cursorCell] || '').codePointAt(0)\n let cellAttrs = screen.screenAttrs[cursorCell]\n let hexcode = cellCode.toString(16).toUpperCase()\n if (hexcode.length < 4) hexcode = `0000${hexcode}`.substr(-4)\n hexcode = `U+${hexcode}`\n toolbar.textContent = `Cursor cell (${cursorCell}): ${hexcode} FG: ${cellFG} BG: ${cellBG} Attrs: ${cellAttrs.toString(2)}`\n })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/debug_screen.js"],"sourceRoot":""} \ No newline at end of file diff --git a/js/app.6241b01.js b/js/app.6241b01.js deleted file mode 100644 index ab2eb28..0000000 --- a/js/app.6241b01.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict';var _typeof='function'==typeof Symbol&&'symbol'==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&'function'==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?'symbol':typeof a};(function(){'use strict';function a(){var a;for(p=!0,a=0;a":'>','"':'"',"'":''',"/":'/',"`":'`',"=":'='};m.htmlEscape=function(a){return(a+'').replace(/[&<>"'`=\/]/g,function(a){return t[a]})},d.$=m})(); -'use strict';(function(a){function b(a,b){for(var c=a.length;c--;)if(a[c]===b)return c;return-1}function c(a,b){if(a.length!=b.length)return!1;for(var c=0;cj;j++)p['f'+j]=111+j;var s={16:'shiftKey',17:'ctrlKey',18:'altKey',91:'metaKey'};for(j in o)f[j]=!1;i(document,'keydown',function(a){e(a)}),i(document,'keyup',function(a){var c,d=a.keyCode,e=b(r,d);if(0<=e&&r.splice(e,1),(93==d||224==d)&&(d=91),d in n)for(c in n[d]=!1,o)o[c]==d&&(f[c]=!1)}),i(window,'focus',function(){for(j in n)n[j]=!1;for(j in o)f[j]=!1});var t=a.key;a.key=f,a.key.setScope=function(a){k=a||'all'},a.key.getScope=g,a.key.deleteScope=function(a){var b,c,d;for(b in m)for(c=m[b],d=0;di||1114111=i?a.push(i):(i-=65536,d=(i>>10)+55296,e=i%1024+56320,a.push(d,e)),(f+1==g||a.length>16384)&&(h+=b.apply(null,a),a.length=0)}return h};a?a(String,'fromCodePoint',{value:d,configurable:!0,writable:!0}):String.fromCodePoint=d}(); -'use strict';function mk(a){return document.createElement(a)}function qs(a){return document.querySelector(a)}function qsa(a){return document.querySelectorAll(a)}function bool(a){return 1===a||'1'===a||!0===a||'true'===a}function cr(a){return function(b){(10===b.which||13===b.which||32===b.which)&&a()}}function esc(a){return $.htmlEscape(a)}function undef(a){return'undefined'==typeof a}function jsp(a){try{return JSON.parse(a)}catch(a){return console.error(a),null}}function Chr(a){return String.fromCharCode(a)}function parse2B(a){var b=1=e)&&(e=2500),d=setTimeout(a.hide,e),g=!1,f=setTimeout(function(){g=!0},500)},a.hide=function(){var a=$(b);a.removeClass('visible'),e=setTimeout(function(){a.addClass('hidden')},250)},a.init=function(){c=$(b),$(document).on('click',function(){g&&a.hide(this)}),c.on('click',function(a){return a.stopImmediatePropagation(),!1}),c.on('mouseenter',function(){h(),c.removeClass('hidden').addClass('visible')})},a}(); -'use strict';$.ready(function(){$('.Row.checkbox').forEach(function(a){var b=a.querySelector('input');var c=a.querySelector('.box');$(c).toggleClass('checked',b.value);var d=function(){b.value=1-b.value,$(c).toggleClass('checked',b.value)};$(a).on('click',d).on('keypress',cr(d))}),$('.Box.mobcol,.Box.fold').forEach(function(a){var b=a.querySelector('h2');var c=function(){$(a).toggleClass('expanded')};$(b).on('click',c).on('keypress',cr(c))}),$('form').forEach(function(a){$(a).on('keypress',function(b){(10===b.keyCode||13===b.keyCode)&&b.ctrlKey&&a.submit()})}),setInterval(function(){$('.anim-dots').each(function(a){var b=$(a);var c=b.html()+'.';5===c.length&&(c='.'),b.html(c)})},1e3),$('input[type=number]').on('mousewheel',function(a){var b=$(this);var c=+b.val();isNaN(c)&&(c=1);var d=+(b.attr('step')||1);var e=+b.attr('min');var f=+b.attr('max');if(0=b)this.handler('move-cursor-'+('B'>=b?'y':'x'),('B'===b||'C'===b?1:-1)*e);else if('E'===b||'F'===b)this.handler('move-cursor-line',('E'===b?1:-1)*e);else if('G'===b)this.handler('set-cursor-x',e-1);else if('J'===b){var f=d.length?d[0]:2;2===f&&this.handler('clear')}else if('P'===b)this.handler('delete',e);else if('@'===b)this.handler('insert-blanks',e);else if('q'===b)this.handler('set-cursor-style',e);else if('m'===b){if(!d.length||0===d[0])return void this.handler('reset-style');var g=d[0];if(1===g)this.handler('add-attrs',1);else if(2===g)this.handler('add-attrs',2);else if(3===g)this.handler('add-attrs',4);else if(4===g)this.handler('add-attrs',8);else if(5===g||6===g)this.handler('add-attrs',16);else if(7===g)this.handler('add-attrs',-1);else if(9===g)this.handler('add-attrs',64);else if(20===g)this.handler('add-attrs',32);else if(30<=g&&37>=g)this.handler('set-color-fg',g%10);else if(40<=g&&47>=g)this.handler('set-color-bg',g%10);else if(39===g)this.handler('set-color-fg',7);else if(49===g)this.handler('set-color-bg',0);else if(90<=g&&98>=g)this.handler('set-color-fg',g%10+8);else if(100<=g&&108>=g)this.handler('set-color-bg',g%10+8);else if((38===g||48===g)&&5===d[1]){var h=255&(0|d[2]);38===g&&this.handler('set-color-fg',h),48===g&&this.handler('set-color-bg',h)}}else('h'===b||'l'===b)&&'?25'===c&&('h'===b?this.handler('show-cursor'):'l'===b&&this.handler('hide-cursor'))}}},{key:'write',value:function write(a){var b=!0;var c=!1;var d=void 0;try{for(var e,f=a.toString()[Symbol.iterator]();!(b=(e=f.next()).done);b=!0){var g=e.value;var h=g.codePointAt(0);27===h?this.currentSequence=1:1===this.currentSequence&&'['===g?(this.currentSequence=2,this.sequence+='['):this.currentSequence&&g.match(/[\x40-\x7e]/)?(this.parseSequence(this.sequence+g),this.currentSequence=0,this.sequence=''):1h?this.handler('_null'):3===h?this.handler('sigint'):6>=h?this.handler('_null'):7===h?this.handler('bell'):8===h?this.handler('back'):10===h?this.handler('new-line'):13===h?this.handler('return'):21===h?this.handler('delete-line'):23===h?this.handler('delete-word'):this.handler('write',g)}}catch(a){c=!0,d=a}finally{try{!b&&f.return&&f.return()}finally{if(c)throw d}}this.joinChunks||this.reset()}}]),a}();var TERM_DEFAULT_STYLE=7;var TERM_MIN_DRAW_DELAY=10;var getRainbowColor=function(a){var c=Math.PI;var d=Math.floor;var e=Math.sin;var f=d(2.5*e(a)+2.5);var h=d(2.5*e(a+2/3*c)+2.5);var g=d(2.5*e(a+4/3*c)+2.5);return 16+36*f+6*h+g};var ScrollingTerminal=function(){function a(b){var c=this;_classCallCheck(this,a),this.width=80,this.height=25,this.termScreen=b,this.parser=new ANSIParser(function(){return c.handleParsed.apply(c,arguments)}),this.reset(),this._lastLoad=Date.now(),this.termScreen.load(this.serialize(),0)}var b=Math.min;var c=Math.max;return _createClass(a,[{key:'reset',value:function reset(){this.style=TERM_DEFAULT_STYLE,this.cursor={x:0,y:0,style:1,visible:!0},this.trackMouse=!1,this.theme=0,this.rainbow=!1,this.parser.reset(),this.clear()}},{key:'clear',value:function clear(){this.screen=[];for(var a=0;a=this.height&&this.scroll()}},{key:'writeChar',value:function writeChar(a){this.screen[this.cursor.y*this.width+this.cursor.x]=[a,this.style],this.cursor.x++,this.cursor.x>=this.width&&(this.cursor.x=0,this.newLine())}},{key:'moveBack',value:function moveBack(){var a=0this.cursor.x&&(this.cursor.x=0=this.width&&(this.cursor.x=0,this.cursor.y++,this.cursor.y>=this.height&&this.scroll())}},{key:'deleteChar',value:function deleteChar(){this.moveBack(),this.screen.splice((this.cursor.y+1)*this.width,0,[' ',TERM_DEFAULT_STYLE]),this.screen.splice(this.cursor.y*this.width+this.cursor.x,1)}},{key:'deleteForward',value:function deleteForward(a){a=b(this.width,a);for(var c=0;cthis.cursor.x&&(this.cursor.x=0),0>this.cursor.y&&(this.cursor.y=0),this.cursor.x>this.width-1&&(this.cursor.x=this.width-1),this.cursor.y>this.height-1&&(this.cursor.y=this.height-1)}},{key:'handleParsed',value:function handleParsed(a){'write'===a?this.writeChar(1>=arguments.length?void 0:arguments[1]):'delete'===a?this.deleteForward(1>=arguments.length?void 0:arguments[1]):'insert-blanks'===a?this.insertBlanks(1>=arguments.length?void 0:arguments[1]):'clear'===a?this.clear():'bell'===a?this.terminal.load('B'):'back'===a?this.moveBack():'new-line'===a?this.newLine():'return'===a?this.cursor.x=0:'set-cursor'===a?(this.cursor.x=2>=arguments.length?void 0:arguments[2],this.cursor.y=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-y'===a?(this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-x'===a?(this.cursor.x+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-line'===a?(this.cursor.x=0,this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'set-cursor-x'===a?this.cursor.x=1>=arguments.length?void 0:arguments[1]:'set-cursor-style'===a?this.cursor.style=c(0,b(6,1>=arguments.length?void 0:arguments[1])):'reset-style'===a?this.style=TERM_DEFAULT_STYLE:'add-attrs'===a?-1===(1>=arguments.length?void 0:arguments[1])?this.style=16711680&this.style|255&this.style>>8|(255&this.style)<<8:this.style|=(1>=arguments.length?void 0:arguments[1])<<16:'set-color-fg'===a?this.style=16776960&this.style|(1>=arguments.length?void 0:arguments[1]):'set-color-bg'===a?this.style=16711935&this.style|(1>=arguments.length?void 0:arguments[1])<<8:'hide-cursor'===a?this.cursor.visible=!1:'show-cursor'===a&&(this.cursor.visible=!0)}},{key:'write',value:function write(a){this.parser.write(a),this.scheduleLoad()}},{key:'serialize',value:function serialize(){var a='S';a+=encode2B(this.height)+encode2B(this.width),a+=encode2B(this.cursor.y)+encode2B(this.cursor.x);var b=+this.cursor.visible;b|=96*+this.trackMouse,b|=384,b|=this.cursor.style<<9,a+=encode3B(b);var c=null;var d=0;var e=!0;var f=!1;var g=void 0;try{for(var h,i=this.screen[Symbol.iterator]();!(e=(h=i.next()).done);e=!0){var j=h.value;var k=j[1];if(this.rainbow){var l=d%this.width;var m=Math.floor(d/this.width);k=16711680&k|getRainbowColor((l+m)/10+Date.now()/1e3),d++}if(k!==c){var n=255&k;var o=255&k>>8;var p=255&k>>16;var q=n!=(255&c);var r=o!=(255&c>>8);var s=p!=(255&c>>16);q&&r?a+='\x03'+encode3B(65535&k):q?a+='\x05'+encode2B(n):r&&(a+='\x06'+encode2B(o)),s&&(a+='\x04'+encode2B(p)),c=k}a+=j[0]}}catch(a){f=!0,g=a}finally{try{!e&&i.return&&i.return()}finally{if(f)throw g}}return a}},{key:'scheduleLoad',value:function scheduleLoad(){var a=this;clearTimeout(this._scheduledLoad),this._lastLoadf;f++)c+=b[e][f]?'\x1B[38;5;'+getRainbowColor((f+e)/10)+'m'+b[e][f]:' ';this.emit('write','\r\n\x1B[?25l');var d=function(){a.emit('write',c.substr(0,80)),c=c.substr(80),c.length?setTimeout(d,50):(a.emit('write','\r\n\x1B[?25h'),a.destroy())};d()}}]),b}(Process),"local-echo":function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;cb[h].length&&(b[h]+=' '.repeat(79-b[h].length));this.emit('write','\r\n'.repeat(b.length+1)),this.emit('write','\x1B[A'.repeat(b.length)),this.emit('write','\x1B[?25l');var d=0;var e=0;var f=function(b,c){var f=Math.abs;var g=b-d;var h=c-e;a.emit('write','\x1B['+f(g)+(0++d?3<=++e?(setTimeout(h,20),e=0):h():(f(0,b.length),a.emit('write','\x1B[m\x1B[?25h'),c())};h()})}},{key:'printText',value:function printText(){var a=0a;a++)this.emit('write','\x1B['+(8>a?'3'+a:'9'+(a-8))+'m'),this.emit('write','foreground-color'[a]+' ');this.emit('write','\r\n ');for(var c=0;16>c;c++)this.emit('write','\x1B['+(8>c?'4'+c:'10'+(c-8))+'m ');this.emit('write','\x1B[m\r\n');for(var d=0;6>d;d++){this.emit('write',' ');for(var e=0;6>e;e++){for(var f=0;6>f;f++)this.emit('write','\x1B[48;5;'+(16+36*d+6*e+f)+'m ');this.emit('write','\x1B[m')}this.emit('write','\r\n')}this.emit('write',' ');for(var b=0;24>b;b++)this.emit('write','\x1B[48;5;'+(232+b)+'m ');this.emit('write','\x1B[m\r\n\n'),this.destroy()}}]),b}(Process),ls:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a in this.emit('write','\x1B[92mList of demo commands\x1B[m\r\n'),demoshIndex)'string'!=typeof demoshIndex[a]&&this.emit('write',a+'\r\n');this.destroy()}}]),b}(Process),theme:function(a){function b(a){_classCallCheck(this,b);var c=_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).call(this));return c.shell=a,c}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){var a=0|(0>=arguments.length?void 0:arguments[0]);return!arguments.length||!Number.isFinite(a)||0>a||5b;b++){var c='';for(var d=0;79>d;d++)c+=a[Math.floor(a.length*Math.random())];this.randomData.push(c)}this.scrollOffset=0,this.render()}},{key:'render',value:function render(){this.emit('write','\x1B[m\x1B[2J\x1B[1;1H'),this.emit('write','\x1B[97m\x1B[1mMouse Demo\r\n\x1B[mMouse movement, clicking and scrolling!');for(var a=0;23>a;a++){var b=a+this.scrollOffset;b=(b%this.randomData.length+this.randomData.length)%this.randomData.length;var c=this.randomData[b];var d='\x1B['+(3+a)+';1H\x1B[38;5;239m';for(var e in c)this.highlighted[80*(a+2)+ +e]&&(d+='\x1B[97m'),d+=c[e],this.highlighted[80*(a+2)+ +e]&&(d+='\x1B[38;5;239m');this.emit('write',d)}this.mouse&&this.emit('write','\x1B['+(this.mouse.y+1)+';'+(this.mouse.x+1)+'H')}},{key:'mouseMove',value:function mouseMove(a,b){this.mouse={x:a,y:b},this.render()}},{key:'mouseDown',value:function mouseDown(a,b,c){4===c?this.scrollOffset--:5===c?this.scrollOffset++:this.highlighted[80*b+a]=!this.highlighted[80*b+a],this.render()}},{key:'mouseUp',value:function mouseUp(){}},{key:'destroy',value:function destroy(){this.shell.terminal.write('\x1B[2J\x1B[1;1H'),this.shell.terminal.trackMouse=!1,demoData.mouseReceiver===this&&(demoData.mouseReceiver=null),_get(b.prototype.__proto__||Object.getPrototypeOf(b.prototype),'destroy',this).call(this)}}]),b}(Process),sudo:function(a){function b(a){_classCallCheck(this,b);var c=_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).call(this));return c.shell=a,c}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){var a=this;for(var d=arguments.length,e=Array(d),f=0;f\x1B[m\r\n'),this.destroy();else if(4===e.length&&'make me a sandwich'===e.join(' ').toLowerCase()){var g='\x1B[33m';var b='\x1B[32m';var i='\x1B[38;5;229m';var c='\x1B[38;5;225m';this.emit('write',' '+g+'_.---._\r\n _.-~ ~-._\r\n _.-~ ~-._\r\n _.-~ ~---._\r\n _.-~ ~\\\r\n .-~ _.;\r\n :-._ _.-~ ./\r\n `-._~-._ _..__.-~ _.-~\r\n'+(' '+i+'/ '+g+'~-._~-._ / .__..--'+i+'~-'+b+'---._\r\n')+(i+' \\_____(_'+g+';-._\\. _.-~_/'+i+' ~)'+b+'.. . \\\r\n')+(b+' /(_____ '+g+'\\`--...--~_.-~'+i+'______..-+'+b+'_______)\r\n')+(b+' .(_________/'+g+'`--...--~/'+b+' _/ '+c+' '+g+'/\\\r\n')+(g+' /-._'+c+' \\_ '+b+'(___./_..-~'+c+'__.....'+g+'__..-~./\r\n')+(g+' `-._~-._'+c+' ~\\--------~ .-~'+g+'_..__.-~ _.-~\r\n')+(g+' ~-._~-._ '+c+'~---------` '+g+'/ .__..--~\r\n')+(g+' ~-._\\. _.-~_/\r\n')+(g+' \\`--...--~_.-~\r\n')+(g+' `--...--~'+'\x1B[0m'+'\r\n')),this.destroy()}else{var h=e.shift();if(this.shell.index[h]){var j=this.shell.index[h];if(j instanceof Function){var k=new j(this);var l=function(b){return a.emit('write',b)};k.on('write',l),k.on('exit',function(){k.off('write',l),a.destroy()}),k.run.apply(k,e)}else this.emit('write',j),this.destroy()}else this.emit('write','sudo: '+h+': command not found\r\n'),this.destroy()}}}]),b}(Process),make:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;c=arguments.length?void 0:arguments[1])+this.history[0].substr(this.cursorPos),this.cursorPos++;else if('back'===a)this.copyFromHistoryIndex(),this.history[0]=this.history[0].substr(0,this.cursorPos-1)+this.history[0].substr(this.cursorPos),this.cursorPos--,0>this.cursorPos&&(this.cursorPos=0);else if('move-cursor-x'===a)this.cursorPos=Math.max(0,Math.min(this.history[this.historyIndex].length,this.cursorPos+(1>=arguments.length?void 0:arguments[1])));else if('delete-line'===a)this.copyFromHistoryIndex(),this.history[0]='',this.cursorPos=0;else if('delete-word'===a){this.copyFromHistoryIndex();var b=this.history[0].substr(0,this.cursorPos).split(' ');b.pop(),this.history[0]=b.join(' ')+this.history[0].substr(this.cursorPos),this.cursorPos=b.join(' ').length}else'move-cursor-y'===a&&(this.historyIndex-=1>=arguments.length?void 0:arguments[1],0>this.historyIndex&&(this.historyIndex=0),this.historyIndex>=this.history.length&&(this.historyIndex=this.history.length-1),this.cursorPos=this.history[this.historyIndex].length);this.terminal.write(this.history[this.historyIndex]),this.terminal.write('\b'.repeat(this.history[this.historyIndex].length)),this.terminal.moveForward(this.cursorPos),this.terminal.write(''),'return'===a&&(this.terminal.write('\r\n'),this.parse(this.history[this.historyIndex]))}},{key:'parse',value:function parse(a){'help'===a&&(a='info'),this.run(a)}},{key:'run',value:function run(a){var b=[''];var c=!1;var d=!0;var e=!1;var f=void 0;try{for(var g,h=a.trim()[Symbol.iterator]();!(d=(g=h.next()).done);d=!0){var j=g.value;c&&j!==c?b[b.length-1]+=j:c?c=!1:'"'===j||'\''===j?c=j:j.match(/\s/)?b[b.length-1]&&b.push(''):b[b.length-1]+=j}}catch(a){e=!0,f=a}finally{try{!d&&h.return&&h.return()}finally{if(e)throw f}}var i=b.shift();i in this.index?this.spawn(i,b):(this.terminal.write('demosh: Unknown command: '+i+'\r\n'),this.prompt(!1))}},{key:'spawn',value:function spawn(a){var b=this;var c=1'+a.rssi_perc+'
').htmlAppend('
'+i+'
').htmlAppend('
'+g[a.enc]+'
'),d.on('click',function(){var a=$(this);var b=a.data('ssid');var d='';+a.data('pwd')&&(d=prompt(tr('wifi.enter_passwd').replace(':ssid:',b)),!d)||($('#sta_password').val(d),$('#sta_ssid').val(b),c(b,d,''))}),b.appendChild(f),e[0].appendChild(b)}})}}function e(){_demo?d(_demo_aps,200):$.get('http://'+_root+'/cfg/wifi/scan',d)}function f(a){setTimeout(e,a)}var g=['Open','WEP','WPA','WPA2','WPA/WPA2'];var h;a.init=function(a){$('.Row.range').forEach(function(a){var c=a.querySelector('input');var d=a.querySelector('.x-disp1');var e=a.querySelector('.x-disp2');var f=b(c);$(d).html(f),$(e).html(f),$(c).on('input',function(){f=b(c),$(d).html(f),$(e).html(f)})}),$('#forget-sta').on('click',function(){return c('','',''),!1}),c(a.sta_ssid,a.sta_password,a.sta_active_ip),h=a.sta_active_ssid},a.startScanning=function(){$('#ap-loader').removeClass('hidden'),$('#ap-scan').addClass('hidden'),$('#ap-loader .anim-dots').html('.'),e()}})(window.WiFi={}); -'use strict';window.Conn=function(a){function b(){console.log('CONNECTED'),g(),e('i')}function c(a){console.warn('SOCKET CLOSED, code '+a.code+'. Reconnecting...'),clearTimeout(n),n=setTimeout(function(){f()},2e3)}function d(b){try{switch(b.data.charAt(0)){case'.':break;case'-':l=!0,m=setTimeout(function(){l=!1},250);break;case'+':l=!1,clearTimeout(m);break;default:a.load(b.data),o||(showPage(),o=!0);}g()}catch(a){console.error(a)}}function e(a){return _demo?('undefined'==typeof demoInterface?console.log('TX: '+JSON.stringify(a)):demoInterface.input(a),!0):l?(console.log('Can\'t send, flood control.'),!1):!!i&&(1===i.readyState?('string'!=typeof a&&(a=JSON.stringify(a)),i.send(a),!0):(console.error('Socket not ready'),!1))}function f(){return window._demo?void('undefined'==typeof demoInterface?alert('Demoing non-demo demo!'):(demoInterface.init(a),showPage())):void(clearTimeout(n),clearTimeout(j),i=new WebSocket('ws://'+_root+'/term/update.ws'),i.onopen=b,i.onclose=c,i.onmessage=d,console.log('Opening socket.'),g())}function g(){clearTimeout(j),j=setTimeout(h,2e3)}function h(){console.error('Heartbeat lost, probing server...'),k=setInterval(function(){console.log('> ping'),$.get('http://'+_root+'/system/ping',function(a,b){200===b&&(clearInterval(k),console.info('Server ready, reloading page...'),location.reload())},{timeout:100})},1e3)}var i;var j;var k;var l=!1;var m;var n;var o=!1;return{ws:null,init:f,send:e,canSend:function(){return!l}}}; -'use strict';window.Input=function(a){function b(b){return a.send('s'+b)}function c(b){a.send('b'+k(b))}function d(a,b){return l.fn_alt?a:b}function e(a,b){return l.cu_alt?a:b}function f(a,b){return l.np_alt?a:b}function g(a){var b={tab:'\t',backspace:'\b',enter:l.crlf_mode?'\r\n':'\r',"ctrl+enter":'\n',esc:'\x1B',up:e('\x1BOA','\x1B[A'),down:e('\x1BOB','\x1B[B'),right:e('\x1BOC','\x1B[C'),left:e('\x1BOD','\x1B[D'),home:e('\x1BOH',d('\x1B[H','\x1B[1~')),insert:'\x1B[2~',delete:'\x1B[3~',end:e('\x1BOF',d('\x1B[F','\x1B[4~')),pageup:'\x1B[5~',pagedown:'\x1B[6~',f1:d('\x1BOP','\x1B[11~'),f2:d('\x1BOQ','\x1B[12~'),f3:d('\x1BOR','\x1B[13~'),f4:d('\x1BOS','\x1B[14~'),f5:'\x1B[15~',f6:'\x1B[17~',f7:'\x1B[18~',f8:'\x1B[19~',f9:'\x1B[20~',f10:'\x1B[21~',f11:'\x1B[23~',f12:'\x1B[24~',"shift+f1":d('\x1BO1;2P','\x1B[25~'),"shift+f2":d('\x1BO1;2Q','\x1B[26~'),"shift+f3":d('\x1BO1;2R','\x1B[28~'),"shift+f4":d('\x1BO1;2S','\x1B[29~'),"shift+f5":d('\x1B[15;2~','\x1B[31~'),"shift+f6":d('\x1B[17;2~','\x1B[32~'),"shift+f7":d('\x1B[18;2~','\x1B[33~'),"shift+f8":d('\x1B[19;2~','\x1B[34~'),"shift+f9":d('\x1B[20;2~','\x1B[35~'),"shift+f10":d('\x1B[21;2~','\x1B[36~'),"shift+f11":d('\x1B[22;2~','\x1B[37~'),"shift+f12":d('\x1B[23;2~','\x1B[38~'),np_0:f('\x1BOp','0'),np_1:f('\x1BOq','1'),np_2:f('\x1BOr','2'),np_3:f('\x1BOs','3'),np_4:f('\x1BOt','4'),np_5:f('\x1BOu','5'),np_6:f('\x1BOv','6'),np_7:f('\x1BOw','7'),np_8:f('\x1BOx','8'),np_9:f('\x1BOy','9'),np_mul:f('\x1BOR','*'),np_add:f('\x1BOl','+'),np_sub:f('\x1BOS','-'),np_point:f('\x1BOn','.'),np_div:f('\x1BOQ','/')};var c=['f5','f11','f12','shift+f5'];for(var g in b)(a||!c.includes(g))&&b.hasOwnProperty(g)&&h(g,b[g])}function h(a,c){-1!==a.indexOf('ctrl+')&&(a+=','+a.replace('ctrl','command')),key.unbind(a),key(a,function(a){l.no_keys||(a.preventDefault(),b(c))})}function i(a){var c=a.allFn;window.addEventListener('keypress',function(a){if(!l.no_keys){var c='';a.key?c=a.key:a.which&&(c=String.fromCodePoint(a.which)),0=d;d++)h('ctrl+'+k(96+d),k(d));h('ctrl+]','\x1B'),h('ctrl+\\','\x1C'),h('ctrl+[','\x1D'),h('ctrl+^','\x1E'),h('ctrl+_','\x1F'),h('ctrl+left','\x1F[1;5D'),h('ctrl+right','\x1F[1;5C'),h('ctrl+up','\x1F[1;5A'),h('ctrl+down','\x1F[1;5B'),h('ctrl+home','\x1F[1;5H'),h('ctrl+end','\x1F[1;5F'),h('shift+left','\x1F[1;2D'),h('shift+right','\x1F[1;2C'),h('shift+up','\x1F[1;2A'),h('shift+down','\x1F[1;2B'),h('shift+home','\x1F[1;2H'),h('shift+end','\x1F[1;2F'),h('\u2325+left','\x1Bb'),h('\u2325+right','\x1Bf'),h('\u2318+left','\x01'),h('\u2318+right','\x05'),h('\u2325+backspace','\x17'),h('\u2318+backspace','\x15'),g(c)}function j(){return(key.isModifier('ctrl')?1:0)|(key.isModifier('shift')?2:0)|(key.isModifier('alt')?4:0)|(key.isModifier('meta')?8:0)}var k=String.fromCharCode;var l={np_alt:!1,cu_alt:!1,fn_alt:!1,mt_click:!1,mt_move:!1,no_keys:!1,crlf_mode:!1};var n=0;var o=0;var p=0;return{init:function(a){i(a),$('#action-buttons button').forEach(function(a){a.addEventListener('click',function(){c(+this.dataset.n)})}),window.addEventListener('mousedown',function(a){0===a.button&&(n=1),1===a.button&&(o=1),2===a.button&&(p=1)}),window.addEventListener('mouseup',function(a){0===a.button&&(n=0),1===a.button&&(o=0),2===a.button&&(p=0)})},sendString:b,setAlts:function setAlts(a,b,c,d){(l.cu_alt!==a||l.np_alt!==b||l.fn_alt!==c||l.crlf_mode!==d)&&(l.cu_alt=a,l.np_alt=b,l.fn_alt=c,l.crlf_mode=d,g())},setMouseMode:function setMouseMode(a,b){l.mt_click=a,l.mt_move=b},onMouseMove:function onMouseMove(c,d){if(l.mt_move){var e=n?1:o?2:p?3:0;var b=j();a.send('m'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseDown:function onMouseDown(c,d,e){if(l.mt_click&&!(3e)){var b=j();a.send('p'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseUp:function onMouseUp(c,d,e){if(l.mt_click&&!(3e)){var b=j();a.send('r'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseWheel:function onMouseWheel(c,d,e){if(l.mt_click){var f=j();var g=0>e?4:5;a.send('p'+encode2B(d)+encode2B(c)+encode2B(g)+encode2B(f))}},blockKeys:function blockKeys(a){l.no_keys=a}}}; -'use strict';var _slicedToArray=function(){function a(a,b){var c=[];var d=!0;var e=!1;var f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!(b&&c.length===b));d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h['return']&&h['return']()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError('Invalid attempt to destructure non-iterable instance')}}();var _createClass=function(){function a(a,b){for(var c=0;cred;red++)for(var green=0;6>green;green++)for(var blue=0;6>blue;blue++){var redValue=40*red+(red?55:0);var greenValue=40*green+(green?55:0);var blueValue=40*blue+(blue?55:0);colorTable256.push('rgb('+redValue+', '+greenValue+', '+blueValue+')')}for(var gray=0;24>gray;gray++){var value=10*gray+8;colorTable256.push('rgb('+value+', '+value+', '+value+')')}window.TermScreen=function(){function a(){var b=this;_classCallCheck(this,a),this.canvas=mk('canvas'),this.ctx=this.canvas.getContext('2d'),'AudioContext'in window||'webkitAudioContext'in window?this.audioCtx=new(window.AudioContext||window.webkitAudioContext):console.warn('No AudioContext!'),this.input=new Proxy({},{get:function get(){return function(){return console.warn('TermScreen#input not set!')}}}),this.cursor={x:0,y:0,blinkOn:!1,blinking:!0,visible:!0,hanging:!1,style:'block',blinkInterval:null},this._palette=null,this._window={width:0,height:0,devicePixelRatio:1,fontFamily:'"DejaVu Sans Mono", "Liberation Mono", "Inconsolata", "Menlo", monospace',fontSize:20,gridScaleX:1,gridScaleY:1.2,blinkStyleOn:!0,blinkInterval:null,fitIntoWidth:0,fitIntoHeight:0,debug:!1,graphics:0},this._windowScale=1,this.windowState={width:0,height:0,devicePixelRatio:0,gridScaleX:0,gridScaleY:0,fontFamily:'',fontSize:0,fitIntoWidth:0,fitIntoHeight:0},this.selection={selectable:!0,start:[0,0],end:[0,0]},this.mouseMode={clicks:!1,movement:!1},this._listeners={};var c=this;this.window=new Proxy(this._window,{set:function set(a,b,d){return a[b]=d,c.scheduleSizeUpdate(),c.scheduleDraw('window:'+b+'='+d),!0}}),this.bracketedPaste=!1,this.blinkingCellCount=0,this.screen=[],this.screenFG=[],this.screenBG=[],this.screenAttrs=[],this.drawnScreen=[],this.drawnScreenFG=[],this.drawnScreenBG=[],this.drawnScreenAttrs=[],this.drawnCursor=[-1,-1,''],this.resetBlink(),this.resetCursorBlink();var d=!1;var f=function(a,c){d||(d=!0,b.selection.start=b.selection.end=b.screenToGrid(a,c,!0),b.scheduleDraw('select-start'))};var g=function(a,c){d&&(b.selection.end=b.screenToGrid(a,c,!0),b.scheduleDraw('select-move'))};var h=function(a,c){d&&(d=!1,b.selection.end=b.screenToGrid(a,c,!0),b.scheduleDraw('select-end'),Object.assign(b.selection,b.getNormalizedSelection()))};this.canvas.addEventListener('mousedown',function(a){if((b.selection.selectable||a.altKey)&&0===a.button)f(a.offsetX,a.offsetY);else{var c;(c=b.input).onMouseDown.apply(c,_toConsumableArray(b.screenToGrid(a.offsetX,a.offsetY)).concat([a.button+1]))}}),window.addEventListener('mousemove',function(a){g(a.offsetX,a.offsetY)}),window.addEventListener('mouseup',function(a){h(a.offsetX,a.offsetY)});var i=null;var j=0;var k=!1;var l=function(a){var c=b.canvas.getBoundingClientRect();return[a.clientX-c.left,a.clientY-c.top]};this.canvas.addEventListener('touchstart',function(a){i=l(a.touches[0]),k=!1,j=Date.now()}),this.canvas.addEventListener('touchmove',function(a){i=l(a.touches[0]),d||!1!=k?d&&(a.preventDefault(),g.apply(void 0,_toConsumableArray(i))):ja)return colorTable256[a];if(255>16;var c=255&a>>8;var d=255&a;return'rgb('+b+', '+c+', '+d+')'}return'rgba(0, 0, 0, 0)'}},{key:'scheduleSizeUpdate',value:function scheduleSizeUpdate(){var a=this;clearTimeout(this._scheduledSizeUpdate),this._scheduledSizeUpdate=setTimeout(function(){return a.updateSize()},1)}},{key:'scheduleDraw',value:function scheduleDraw(a){var b=this;var c=1=a.blinkingCellCount||(b++,4<=b&&a.window.blinkStyleOn?(a.window.blinkStyleOn=!1,b=0):1<=b&&!a.window.blinkStyleOn&&(a.window.blinkStyleOn=!0,b=0))},200)}},{key:'getNormalizedSelection',value:function getNormalizedSelection(){var a=this.selection,b=a.start,c=a.end;if(b[1]>c[1]||b[1]===c[1]&&b[0]>c[0]){var d=[c,b];b=d[0],c=d[1]}return{start:b,end:c}}},{key:'isInSelection',value:function isInSelection(a,b){var c=this.getNormalizedSelection(),d=c.start,e=c.end;var f=d[0]<=a;var g=a=m+0.05};var s=function(a){var c=p.get(a)||q.get(a);var d=b.screen[a];var e=r(d);var f=e?2:1;if(!c){var l=!1;var g=!0;var h=!1;var i=void 0;try{for(var j,k=b.getAdjacentCells(a,f)[Symbol.iterator]();!(g=(j=k.next()).done);g=!0){var m=j.value;if(p.get(m)){l=!0;break}}}catch(a){h=!0,i=a}finally{try{!g&&k.return&&k.return()}finally{if(h)throw i}}l&&(c=!0)}q.set(a,c)};var t=!0;var u=!1;var v=void 0;try{for(var w,z=p.keys()[Symbol.iterator]();!(t=(w=z.next()).done);t=!0){var xa=w.value;s(xa)}}catch(a){u=!0,v=a}finally{try{!t&&z.return&&z.return()}finally{if(u)throw v}}if(1<=this.window.graphics){d.save(),d.beginPath();for(var ya=0;ya>9;0>1;var q=!(1&o);0==p?this.cursor.style='block':1==p?this.cursor.style='line':2==p&&(this.cursor.style='bar'),this.cursor.blinking!==q&&(this.cursor.blinking=q,this.resetCursorBlink()),this.input.setMouseMode(m,n),this.selection.selectable=!m&&!n,$(this.canvas).toggleClass('selectable',this.selection.selectable),this.mouseMode={clicks:m,movement:n};$('.x-term-conf-btn').toggleClass('hidden',!!!(256&l)),$('#action-buttons').toggleClass('hidden',!!!(128&l)),this.bracketedPaste=!!(8192&l);var r=7;var s=0;var t=0;var u=0;var v=' ';var w=this.window.width*this.window.height;f&&(this.updateSize(),this.blinkingCellCount=0,this.screen=Array(w).fill(' '),this.screenFG=Array(w).fill(' '),this.screenBG=Array(w).fill(' '),this.screenAttrs=Array(w).fill(' '));var x=undef(Array.from)?a.split(''):Array.from(a);var y=16;for(var z=function(){var a=t;0!=(a&y)&&(' '==v&&0==(a&200)||r==s)&&(a^=y),(b.screenAttrs[u]&y)!=(a&y)&&(a&y?b.blinkingCellCount++:b.blinkingCellCount--),b.screen[u]=v,b.screenFG[u]=r,b.screenBG[u]=s,b.screenAttrs[u]=a};cw));E++);break;case SEQ_SET_COLORS:C=parse3B(x[c]+x[c+1]+x[c+2]),c+=3,r=255&C,s=255&C>>8;break;case SEQ_SET_ATTRS:C=parse2B(x[c]+x[c+1]),c+=2,t=255&C;break;case SEQ_SET_FG:C=parse2B(x[c]+x[c+1]),c+=2,r=255&C;break;case SEQ_SET_BG:C=parse2B(x[c]+x[c+1]),c+=2,s=255&C;break;default:32>B&&(A='\uFFFD'),v=A,z(u),u++;}}this.window.debug&&console.log('Blinky cells = '+this.blinkingCellCount),this.scheduleDraw('load',16),this.emit('load')}},{key:'loadLabels',value:function loadLabels(a){var b=a.split('\x01');qs('#screen-title').textContent=b[0],$('#action-buttons button').forEach(function(a,c){var d=b[c+1].trim();a.innerHTML=d?esc(d):' ',a.style.opacity=d?1:0.2})}},{key:'showNotification',value:function showNotification(a){if(console.info('Notification: '+a),Notification&&'granted'===Notification.permission){var b=new Notification('ESPTerm',{body:a});b.addEventListener('click',function(){return window.focus()})}else Notification&&'denied'!==Notification.permission?Notification.requestPermission():Notify.show(a)}},{key:'load',value:function load(a){var b=1Date.now()-50)){this._lastBeep=Date.now();var b,c;b=a.createOscillator(),c=a.createGain(),b.connect(c),c.connect(a.destination),c.gain.value=0.5,b.frequency.value=750,b.type='sine',b.start(),b.stop(a.currentTime+0.05),b=a.createOscillator(),c=a.createGain(),b.connect(c),c.connect(a.destination),c.gain.value=0.2,b.frequency.value=400,b.type='sine',b.start(a.currentTime+0.05),b.stop(a.currentTime+0.08)}}},{key:'palette',get:function get(){return this._palette||themes[0]},set:function set(a){this._palette!==a&&(this._palette=a,this.scheduleDraw('palette'))}}],[{key:'alphaToFraktur',value:function alphaToFraktur(a){var b=String.fromCodePoint;return'a'<=a&&'z'>=a?a=b(119997+a.charCodeAt(0)):'A'<=a&&'Z'>=a&&(a=frakturExceptions[a]||b(120003+a.charCodeAt(0))),a}}]),a}(); -'use strict';window.TermUpl=function(a,b,c){function d(){f('Ready...'),Modal.show('#fu_modal',e),$('#fu_form').toggleClass('busy',!1),b.blockKeys(!0)}function e(){console.log('Upload modal closed.'),clearTimeout(m),l=0,b.blockKeys(!1)}function f(a){qs('#fu_prog').textContent=a}function g(){var a=qs('#fu_text').value;return a.length?void(k=a.split('\n'),l=0,q=0,n=qs('#fu_delay').value,0>n&&(n=0,qs('#fu_delay').value=n),o={CR:'\r',LF:'\n',CRLF:'\r\n'}[qs('#fu_crlf').value],$('#fu_form').toggleClass('busy',!0),f('Starting...'),h()):void j()}function h(){if($('#fu_modal').hasClass('visible')){if(!a.canSend())return void(m=setTimeout(h,1));0===q&&(p='',0===l&&c.bracketedPaste&&(p='\x1B[200~'),p+=k[l++]+o,l===k.length&&c.bracketedPaste&&(p+='\x1B[201~'));var d;if(p.length-q<=r?(d=p.substr(q,r),q=0):(d=p.substr(q,r),q+=r),!b.sendString(d))return void f('FAILED!');var e=Math.round(1e3*(l/k.length))/10;f(l+' / '+k.length+' ('+e+'%)'),k.length>l||0f.length?a.startsWith(f)?b.sendString(a.substr(f.length)):c=!0:a.lengthJS ERROR!
'+a+'
at '+b+':'+c+':'+d,1e4,!0),!1},qs('#screen').appendChild(f.canvas),f.load(b,c),window.initSoftKeyboard(f,g),window.attachDebugScreen&&window.attachDebugScreen(f);var i=!1;var j=!1;var k=function(){i?(f.window.fitIntoWidth=window.screen.width,f.window.fitIntoHeight=window.screen.height):(f.window.fitIntoWidth=j?window.innerWidth-20:0,f.window.fitIntoHeight=j?window.innerHeight:0)};k(),window.addEventListener('resize',k);var l=function(){j=!j;var a=qs('#resize-button-icon');j?(a.classList.remove('icn-resize-small'),a.classList.add('icn-resize-full')):(a.classList.remove('icn-resize-full'),a.classList.add('icn-resize-small')),k()};if(qs('#term-fit-screen').addEventListener('click',function(){return l(),!1}),Element.prototype.requestFullscreen||Element.prototype.webkitRequestFullscreen){setInterval(function checkForFullscreen(){i&&(innerWidth!==window.screen.width||innerHeight!==window.screen.height)&&(i=!1,k())},500);var m=mk('a');m.href='#',m.addEventListener('click',function(a){a.preventDefault(),i=!0,k(),f.updateSize(),f.canvas.requestFullscreen?f.canvas.requestFullscreen():f.canvas.webkitRequestFullscreen()});var n=mk('i');n.classList.add('icn-resize-full'),m.appendChild(n);var o=mk('span');o.textContent='Fullscreen',m.appendChild(o),qs('#term-nav').insertBefore(m,qs('#term-nav').firstChild)}window.termScreen=f,window.conn=e,window.input=g,window.termUpl=h}; - -//# sourceMappingURL=app.6241b01.js.map \ No newline at end of file diff --git a/js/app.6241b01.js.map b/js/app.6241b01.js.map deleted file mode 100644 index e1c93d0..0000000 --- a/js/app.6241b01.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../js/lib/chibi.js","../../js/lib/keymaster.js","../../js/lib/polyfills.js","../../js/utils.js","../../js/modal.js","../../js/notif.js","../../js/appcommon.js","../../js/demo.js","../../js/lang.js","../../js/wifi.js","../../js/term_conn.js","../../js/term_input.js","../../js/term_screen.js","../../js/term_upload.js","../../js/debug_screen.js","../../js/soft_keyboard.js","../../js/term.js"],"names":[],"mappings":"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","file":"app.6241b01.js","sourcesContent":["/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */\n\n// MODIFIED VERSION.\n(function () {\n\t'use strict';\n\n\tvar readyfn = [],\n\t\tloadedfn = [],\n\t\tdomready = false,\n\t\tpageloaded = false,\n\t\td = document,\n\t\tw = window;\n\n\t// Fire any function calls on ready event\n\tfunction fireReady() {\n\t\tvar i;\n\t\tdomready = true;\n\t\tfor (i = 0; i < readyfn.length; i += 1) {\n\t\t\treadyfn[i]();\n\t\t}\n\t\treadyfn = [];\n\t}\n\n\t// Fire any function calls on loaded event\n\tfunction fireLoaded() {\n\t\tvar i;\n\t\tpageloaded = true;\n\t\t// For browsers with no DOM loaded support\n\t\tif (!domready) {\n\t\t\tfireReady();\n\t\t}\n\t\tfor (i = 0; i < loadedfn.length; i += 1) {\n\t\t\tloadedfn[i]();\n\t\t}\n\t\tloadedfn = [];\n\t}\n\n\t// Check DOM ready, page loaded\n\tif (d.addEventListener) {\n\t\t// Standards\n\t\td.addEventListener('DOMContentLoaded', fireReady, false);\n\t\tw.addEventListener('load', fireLoaded, false);\n\t} else if (d.attachEvent) {\n\t\t// IE\n\t\td.attachEvent('onreadystatechange', fireReady);\n\t\t// IE < 9\n\t\tw.attachEvent('onload', fireLoaded);\n\t} else {\n\t\t// Anything else\n\t\tw.onload = fireLoaded;\n\t}\n\n\t// Utility functions\n\n\t// Loop through node array\n\tfunction nodeLoop(fn, nodes) {\n\t\tvar i;\n\t\t// Good idea to walk up the DOM\n\t\tfor (i = nodes.length - 1; i >= 0; i -= 1) {\n\t\t\tfn(nodes[i]);\n\t\t}\n\t}\n\n\t// Convert to camel case\n\tfunction cssCamel(property) {\n\t\treturn property.replace(/-\\w/g, function (result) {\n\t\t\treturn result.charAt(1).toUpperCase();\n\t\t});\n\t}\n\n\t// Get computed style\n\tfunction computeStyle(elm, property) {\n\t\t// IE, everything else or null\n\t\treturn (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null;\n\n\t}\n\n\t// Returns URI encoded query string pair\n\tfunction queryPair(name, value) {\n\t\treturn encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+');\n\t}\n\n\t// Set CSS, important to wrap in try to prevent error thown on unsupported property\n\tfunction setCss(elm, property, value) {\n\t\ttry {\n\t\t\telm.style[cssCamel(property)] = value;\n\t\t} catch (e) {\n\t\t}\n\t}\n\n\t// Show CSS\n\tfunction showCss(elm) {\n\t\telm.style.display = '';\n\t\t// For elements still hidden by style block\n\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\telm.style.display = 'block';\n\t\t}\n\t}\n\n\t// Serialize form & JSON values\n\tfunction serializeData(nodes) {\n\t\tvar querystring = '', subelm, i, j;\n\t\tif (nodes.constructor === Object) { // Serialize JSON data\n\t\t\tfor (subelm in nodes) {\n\t\t\t\tif (nodes.hasOwnProperty(subelm)) {\n\t\t\t\t\tif (nodes[subelm].constructor === Array) {\n\t\t\t\t\t\tfor (i = 0; i < nodes[subelm].length; i += 1) {\n\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm][i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else { // Serialize node data\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (elm.nodeName === 'FORM') {\n\t\t\t\t\tfor (i = 0; i < elm.elements.length; i += 1) {\n\t\t\t\t\t\tsubelm = elm.elements[i];\n\n\t\t\t\t\t\tif (!subelm.disabled) {\n\t\t\t\t\t\t\tswitch (subelm.type) {\n\t\t\t\t\t\t\t\t// Ignore buttons, unsupported XHR 1 form fields\n\t\t\t\t\t\t\t\tcase 'button':\n\t\t\t\t\t\t\t\tcase 'image':\n\t\t\t\t\t\t\t\tcase 'file':\n\t\t\t\t\t\t\t\tcase 'submit':\n\t\t\t\t\t\t\t\tcase 'reset':\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-one':\n\t\t\t\t\t\t\t\t\tif (subelm.length > 0) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-multiple':\n\t\t\t\t\t\t\t\t\tfor (j = 0; j < subelm.length; j += 1) {\n\t\t\t\t\t\t\t\t\t\tif (subelm[j].selected) {\n\t\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm[j].value);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'checkbox':\n\t\t\t\t\t\t\t\tcase 'radio':\n\t\t\t\t\t\t\t\t\tif (subelm.checked) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t// Everything else including shinny new HTML5 input types\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\t// Tidy up first &\n\t\treturn (querystring.length > 0) ? querystring.substring(1) : '';\n\t}\n\n\t// Class helper\n\tfunction classHelper(classes, action, nodes) {\n\t\tvar classarray, search, i, replace, has = false;\n\t\tif (classes) {\n\t\t\t// Trim any whitespace\n\t\t\tclassarray = classes.split(/\\s+/);\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tfor (i = 0; i < classarray.length; i += 1) {\n\t\t\t\t\tvar clz = classarray[i];\n\t\t\t\t\tif (action === 'remove') {\n\t\t\t\t\t\telm.classList.remove(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'add') {\n\t\t\t\t\t\telm.classList.add(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'toggle') {\n\t\t\t\t\t\telm.classList.toggle(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'has') {\n\t\t\t\t\t\tif (elm.classList.contains(clz)) {\n\t\t\t\t\t\t\thas = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// search = new RegExp('\\\\b' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// replace = new RegExp(' *' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// if (action === 'remove') {\n\t\t\t\t\t// \telm.className = elm.className.replace(search, '');\n\t\t\t\t\t// } else if (action === 'toggle') {\n\t\t\t\t\t// \telm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i];\n\t\t\t\t\t// } else if (action === 'has') {\n\t\t\t\t\t// \tif (elm.className.match(search)) {\n\t\t\t\t\t// \t\thas = true;\n\t\t\t\t\t// \t\tbreak;\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\treturn has;\n\t}\n\n\t// HTML insertion helper\n\tfunction insertHtml(value, position, nodes) {\n\t\tvar tmpnodes, tmpnode;\n\t\tif (value) {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead\n\t\t\t\t// Convert string to node. We can't innerHTML on a document fragment\n\t\t\t\ttmpnodes = d.createElement('div');\n\t\t\t\ttmpnodes.innerHTML = value;\n\t\t\t\twhile ((tmpnode = tmpnodes.lastChild) !== null) {\n\t\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (position === 'before') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm);\n\t\t\t\t\t\t} else if (position === 'after') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm.nextSibling);\n\t\t\t\t\t\t} else if (position === 'append') {\n\t\t\t\t\t\t\telm.appendChild(tmpnode);\n\t\t\t\t\t\t} else if (position === 'prepend') {\n\t\t\t\t\t\t\telm.insertBefore(tmpnode, elm.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t}\n\n\t// Get nodes and return chibi\n\tfunction chibi(selector) {\n\t\tvar cb, nodes = [], json = false, nodelist, i;\n\n\t\tif (selector) {\n\n\t\t\t// Element node, would prefer to use (selector instanceof HTMLElement) but no IE support\n\t\t\tif (selector.nodeType && selector.nodeType === 1) {\n\t\t\t\tnodes = [selector]; // return element as node list\n\t\t\t} else if (typeof selector === 'object') {\n\t\t\t\t// JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support\n\t\t\t\tjson = (typeof selector.length !== 'number');\n\t\t\t\tnodes = selector;\n\t\t\t} else if (typeof selector === 'string') {\n\t\t\t\tnodelist = d.querySelectorAll(selector);\n\n\t\t\t\t// Convert node list to array so results have full access to array methods\n\t\t\t\t// Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway\n\t\t\t\tfor (i = 0; i < nodelist.length; i += 1) {\n\t\t\t\t\tnodes[i] = nodelist[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Only attach nodes if not JSON\n\t\tcb = json ? {} : nodes;\n\n\t\t// Public functions\n\n\t\t// Executes a function on nodes\n\t\tcb.each = function (fn) {\n\t\t\tif (typeof fn === 'function') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply\n\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Find first\n\t\tcb.first = function () {\n\t\t\treturn chibi(nodes.shift());\n\t\t};\n\t\t// Find last\n\t\tcb.last = function () {\n\t\t\treturn chibi(nodes.pop());\n\t\t};\n\t\t// Find odd\n\t\tcb.odd = function () {\n\t\t\tvar odds = [], i;\n\t\t\tfor (i = 0; i < nodes.length; i += 2) {\n\t\t\t\todds.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(odds);\n\t\t};\n\t\t// Find even\n\t\tcb.even = function () {\n\t\t\tvar evens = [], i;\n\t\t\tfor (i = 1; i < nodes.length; i += 2) {\n\t\t\t\tevens.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(evens);\n\t\t};\n\t\t// Hide node\n\t\tcb.hide = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\telm.style.display = 'none';\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Show node\n\t\tcb.show = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tshowCss(elm);\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle node display\n\t\tcb.toggle = function (state) {\n\t\t\tif (typeof state != 'undefined') { // ADDED\n\t\t\t\tif (state)\n\t\t\t\t\tcb.show();\n\t\t\t\telse\n\t\t\t\t\tcb.hide();\n\t\t\t} else {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// computeStyle instead of style.display == 'none' catches elements that are hidden via style block\n\t\t\t\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\t\t\t\tshowCss(elm);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telm.style.display = 'none';\n\t\t\t\t\t}\n\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove node\n\t\tcb.remove = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\ttry {\n\t\t\t\t\telm.parentNode.removeChild(elm);\n\t\t\t\t} catch (e) {\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn chibi();\n\t\t};\n\t\t// Get/Set CSS\n\t\tcb.css = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tif (value || value === '') {\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tsetCss(elm, property, value);\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (nodes[0].style[cssCamel(property)]) {\n\t\t\t\t\t\treturn nodes[0].style[cssCamel(property)];\n\t\t\t\t\t}\n\t\t\t\t\tif (computeStyle(nodes[0], property)) {\n\t\t\t\t\t\treturn computeStyle(nodes[0], property);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get class(es)\n\t\tcb.getClass = function () {\n\t\t\tif (nodes[0] && nodes[0].className.length > 0) {\n\t\t\t\t// Weak IE trim support\n\t\t\t\treturn nodes[0].className.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '').replace(/\\s+/, ' ');\n\t\t\t}\n\t\t};\n\t\t// Set (replaces) classes\n\t\tcb.setClass = function (classes) {\n\t\t\tif (classes || classes === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.className = classes;\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Add class\n\t\tcb.addClass = function (classes) {\n\t\t\tclassHelper(classes, 'add', nodes);\n\t\t\t// if (classes) {\n\t\t\t// \tnodeLoop(function (elm) {\n\t\t\t// \t\telm.className += ' ' + classes;\n\t\t\t// \t}, nodes);\n\t\t\t// }\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove class\n\t\tcb.removeClass = function (classes) {\n\t\t\tclassHelper(classes, 'remove', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle class\n\t\tcb.toggleClass = function (classes, set) {\n\t\t\tvar method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove'));\n\t\t\tclassHelper(classes, method, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Has class\n\t\tcb.hasClass = function (classes) {\n\t\t\treturn classHelper(classes, 'has', nodes);\n\t\t};\n\t\t// Get/set HTML\n\t\tcb.html = function (value) {\n\t\t\tif (value || value === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.innerHTML = value;\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\treturn nodes[0].innerHTML;\n\t\t\t}\n\t\t};\n\t\t// Insert HTML before selector\n\t\tcb.htmlBefore = function (value) {\n\t\t\tinsertHtml(value, 'before', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector\n\t\tcb.htmlAfter = function (value) {\n\t\t\tinsertHtml(value, 'after', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector innerHTML\n\t\tcb.htmlAppend = function (value) {\n\t\t\tinsertHtml(value, 'append', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML before selector innerHTML\n\t\tcb.htmlPrepend = function (value) {\n\t\t\tinsertHtml(value, 'prepend', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Get/Set HTML attributes\n\t\tcb.attr = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tproperty = property.toLowerCase();\n\t\t\t\t// IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway\n\t\t\t\tif (typeof value !== 'undefined') {//FIXED BUG HERE\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\t\telm.style.cssText = value;\n\t\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\t\telm.className = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telm.setAttribute(property, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\tif (nodes[0].style.cssText) {\n\t\t\t\t\t\t\treturn nodes[0].style.cssText;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\tif (nodes[0].className) {\n\t\t\t\t\t\t\treturn nodes[0].className;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (nodes[0].getAttribute(property)) {\n\t\t\t\t\t\t\treturn nodes[0].getAttribute(property);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get/Set HTML data property\n\t\tcb.data = function (key, value) {\n\t\t\tif (key) {\n\t\t\t\treturn cb.attr('data-' + key, value);\n\t\t\t}\n\t\t};\n\t\t// Get/Set form element values\n\t\tcb.val = function (value) {\n\t\t\tvar values, i, j;\n\t\t\tif (typeof value != 'undefined') { // FIXED A BUG HERE\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tswitch (elm.nodeName) {\n\t\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\t\t\t\tvalue = [value];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (i = 0; i < elm.length; i += 1) {\n\t\t\t\t\t\t\t\t// Multiple select\n\t\t\t\t\t\t\t\tfor (j = 0; j < value.length; j += 1) {\n\t\t\t\t\t\t\t\t\telm[i].selected = '';\n\t\t\t\t\t\t\t\t\tif (elm[i].value === \"\"+value[j]) {\n\t\t\t\t\t\t\t\t\t\telm[i].selected = 'selected';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\t\telm.value = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\tswitch (nodes[0].nodeName) {\n\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\tvalues = [];\n\t\t\t\t\t\tfor (i = 0; i < nodes[0].length; i += 1) {\n\t\t\t\t\t\t\tif (nodes[0][i].selected) {\n\t\t\t\t\t\t\t\tvalues.push(nodes[0][i].value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (values.length > 1) ? values : values[0];\n\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\treturn nodes[0].value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Return matching checked checkbox or radios\n\t\tcb.checked = function (check) {\n\t\t\tif (typeof check === 'boolean') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tif (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) {\n\t\t\t\t\t\telm.checked = check;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) {\n\t\t\t\treturn (!!nodes[0].checked);\n\t\t\t}\n\t\t};\n\t\t// Add event handler\n\t\tcb.on = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.addEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions)\n\t\t\t\t\telm[event + fn] = function () {\n\t\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t\t};\n\t\t\t\t\telm.attachEvent('on' + event, elm[event + fn]);\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove event handler\n\t\tcb.off = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.removeEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\telm.detachEvent('on' + event, elm[event + fn]);\n\t\t\t\t\t// Tidy up\n\t\t\t\t\telm[event + fn] = null;\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\treturn cb;\n\t}\n\n\t// Basic XHR\n\tchibi.ajax = function (options) { // if options is a number, it's timeout in ms\n\t\tvar opts = Object.assign({\n\t\t\tmethod: 'GET',\n\t\t\tnocache: true,\n\t\t\ttimeout: 5000,\n\t\t\tloader: true,\n\t\t\tcallback: null\n\t\t}, options);\n\t\topts.method = opts.method.toUpperCase();\n\n\t\tvar loaderFn = opts.loader ? chibi._loader : function(){};\n\t\tvar url = opts.url;\n\t\tvar method = opts.method;\n\t\tvar query = null;\n\n\t\tif (opts.data) {\n\t\t\tquery = serializeData(opts.data);\n\t\t}\n\n\t\tif (query && (method === 'GET')) {\n\t\t\turl += (url.indexOf('?') === -1) ? '?' + query : '&' + query;\n\t\t\tquery = null;\n\t\t}\n\n\t\tvar xhr = new XMLHttpRequest();\n\n\t\t// prevent caching\n\t\tif (opts.nocache) {\n\t\t\tvar ts = (+(new Date())).toString(36);\n\t\t\turl += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts;\n\t\t}\n\n\t\tloaderFn(true);\n\n\t\txhr.open(method, url, true);\n\t\txhr.timeout = opts.timeout;\n\n\t\t// Abort after given timeout\n\t\tvar abortTmeo = setTimeout(function () {\n\t\t\tconsole.error(\"XHR timed out.\");\n\t\t\txhr.abort();\n\t\t\tloaderFn(false);\n\t\t}, opts.timeout + 10);\n\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tloaderFn(false);\n\n\t\t\t\topts.callback && opts.callback(xhr.responseText, xhr.status);\n\n\t\t\t\tclearTimeout(abortTmeo);\n\t\t\t}\n\t\t};\n\n\t\txhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\tif (method === 'POST') {\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t}\n\n\t\txhr.send(query);\n\t\treturn xhr;\n\t};\n\n\tchibi._loader = function(){};\n\n\t// Alias to cb.ajax(url, 'get', callback)\n\tchibi.get = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'GET';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Alias to cb.ajax(url, 'post', callback)\n\tchibi.post = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'POST';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Fire on DOM ready\n\tchibi.ready = function (fn) {\n\t\tif (fn) {\n\t\t\tif (domready) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\treadyfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\t// Fire on page loaded\n\tchibi.loaded = function (fn) {\n\t\tif (fn) {\n\t\t\tif (pageloaded) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\tloadedfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar entityMap = {\n\t\t'&': '&',\n\t\t'<': '<',\n\t\t'>': '>',\n\t\t'\"': '"',\n\t\t\"'\": ''',\n\t\t'/': '/',\n\t\t'`': '`',\n\t\t'=': '='\n\t};\n\n\tchibi.htmlEscape = function(string) {\n\t\treturn String(string).replace(/[&<>\"'`=\\/]/g, function (s) {\n\t\t\treturn entityMap[s];\n\t\t});\n\t};\n\n\t// Set Chibi's global namespace here ($)\n\tw.$ = chibi;\n}());\n","// keymaster.js\n// (c) 2011-2013 Thomas Fuchs\n// keymaster.js may be freely distributed under the MIT license.\n\n;(function(global){\n var k,\n _handlers = {},\n _mods = { 16: false, 18: false, 17: false, 91: false },\n _scope = 'all',\n // modifier keys\n _MODIFIERS = {\n '⇧': 16, shift: 16,\n '⌥': 18, alt: 18, option: 18,\n '⌃': 17, ctrl: 17, control: 17,\n '⌘': 91, command: 91\n },\n // special keys\n _MAP = {\n backspace: 8, tab: 9, clear: 12,\n enter: 13, 'return': 13,\n esc: 27, escape: 27, space: 32,\n left: 37, up: 38,\n right: 39, down: 40,\n del: 46, 'delete': 46,\n home: 36, end: 35,\n pageup: 33, pagedown: 34,\n ',': 188, '.': 190, '/': 191,\n '`': 192, '-': 189, '=': 187,\n ';': 186, '\\'': 222,\n '[': 219, ']': 221, '\\\\': 220,\n // added:\n insert: 45,\n np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101,\n\t np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106,\n\t np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144,\n },\n code = function(x){\n return _MAP[x] || x.toUpperCase().charCodeAt(0);\n },\n _downKeys = [];\n\n for(k=1;k<20;k++) _MAP['f'+k] = 111+k;\n\n // IE doesn't support Array#indexOf, so have a simple replacement\n function index(array, item){\n var i = array.length;\n while(i--) if(array[i]===item) return i;\n return -1;\n }\n\n // for comparing mods before unassignment\n function compareArray(a1, a2) {\n if (a1.length != a2.length) return false;\n for (var i = 0; i < a1.length; i++) {\n if (a1[i] !== a2[i]) return false;\n }\n return true;\n }\n\n var modifierMap = {\n 16:'shiftKey',\n 18:'altKey',\n 17:'ctrlKey',\n 91:'metaKey'\n };\n function updateModifierKey(event) {\n for(k in _mods) _mods[k] = event[modifierMap[k]];\n };\n\n function isModifierPressed(mod) {\n if (mod=='control'||mod=='ctrl') return _mods[17];\n\tif (mod=='shift') return _mods[16];\n\tif (mod=='meta') return _mods[91];\n\tif (mod=='alt') return _mods[18];\n\treturn false;\n }\n\n // handle keydown event\n function dispatch(event) {\n var key, handler, k, i, modifiersMatch, scope;\n key = event.keyCode;\n\n if (index(_downKeys, key) == -1) {\n _downKeys.push(key);\n }\n\n // if a modifier key, set the key. property to true and return\n if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko\n if(key in _mods) {\n _mods[key] = true;\n // 'assignKey' from inside this closure is exported to window.key\n for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true;\n return;\n }\n updateModifierKey(event);\n\n // see if we need to ignore the keypress (filter() can can be overridden)\n // by default ignore key presses if a select, textarea, or input is focused\n if(!assignKey.filter.call(this, event)) return;\n\n // abort if no potentially matching shortcuts found\n if (!(key in _handlers)) return;\n\n scope = getScope();\n\n // for each potential shortcut\n for (i = 0; i < _handlers[key].length; i++) {\n handler = _handlers[key][i];\n\n // see if it's in the current scope\n if(handler.scope == scope || handler.scope == 'all'){\n // check if modifiers match if any\n modifiersMatch = handler.mods.length > 0;\n for(k in _mods)\n if((!_mods[k] && index(handler.mods, +k) > -1) ||\n (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false;\n // call the handler and stop the event if neccessary\n if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){\n if(handler.method(event, handler)===false){\n if(event.preventDefault) event.preventDefault();\n else event.returnValue = false;\n if(event.stopPropagation) event.stopPropagation();\n if(event.cancelBubble) event.cancelBubble = true;\n }\n }\n }\n }\n };\n\n // unset modifier keys on keyup\n function clearModifier(event){\n var key = event.keyCode, k,\n i = index(_downKeys, key);\n\n // remove key from _downKeys\n if (i >= 0) {\n _downKeys.splice(i, 1);\n }\n\n if(key == 93 || key == 224) key = 91;\n if(key in _mods) {\n _mods[key] = false;\n for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false;\n }\n };\n\n function resetModifiers() {\n for(k in _mods) _mods[k] = false;\n for(k in _MODIFIERS) assignKey[k] = false;\n };\n\n // parse and assign shortcut\n function assignKey(key, scope, method){\n var keys, mods;\n keys = getKeys(key);\n if (method === undefined) {\n method = scope;\n scope = 'all';\n }\n\n // for each shortcut\n for (var i = 0; i < keys.length; i++) {\n // set modifier keys if any\n mods = [];\n key = keys[i].split('+');\n if (key.length > 1){\n mods = getMods(key);\n key = [key[key.length-1]];\n }\n // convert to keycode and...\n key = key[0]\n key = code(key);\n // ...store handler\n if (!(key in _handlers)) _handlers[key] = [];\n _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods });\n }\n };\n\n // unbind all handlers for given key in current scope\n function unbindKey(key, scope) {\n var multipleKeys, keys,\n mods = [],\n i, j, obj;\n\n multipleKeys = getKeys(key);\n\n for (j = 0; j < multipleKeys.length; j++) {\n keys = multipleKeys[j].split('+');\n\n if (keys.length > 1) {\n mods = getMods(keys);\n }\n\n key = keys[keys.length - 1];\n key = code(key);\n\n if (scope === undefined) {\n scope = getScope();\n }\n if (!_handlers[key]) {\n return;\n }\n for (i = 0; i < _handlers[key].length; i++) {\n obj = _handlers[key][i];\n // only clear handlers if correct scope and mods match\n if (obj.scope === scope && compareArray(obj.mods, mods)) {\n _handlers[key][i] = {};\n }\n }\n }\n };\n\n // Returns true if the key with code 'keyCode' is currently down\n // Converts strings into key codes.\n function isPressed(keyCode) {\n if (typeof(keyCode)=='string') {\n keyCode = code(keyCode);\n }\n return index(_downKeys, keyCode) != -1;\n }\n\n function getPressedKeyCodes() {\n return _downKeys.slice(0);\n }\n\n function filter(event){\n var tagName = (event.target || event.srcElement).tagName;\n // ignore keypressed in any elements that support keyboard data input\n return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');\n }\n\n // initialize key. to false\n for(k in _MODIFIERS) assignKey[k] = false;\n\n // set current scope (default 'all')\n function setScope(scope){ _scope = scope || 'all' };\n function getScope(){ return _scope || 'all' };\n\n // delete all handlers for a given scope\n function deleteScope(scope){\n var key, handlers, i;\n\n for (key in _handlers) {\n handlers = _handlers[key];\n for (i = 0; i < handlers.length; ) {\n if (handlers[i].scope === scope) handlers.splice(i, 1);\n else i++;\n }\n }\n };\n\n // abstract key logic for assign and unassign\n function getKeys(key) {\n var keys;\n key = key.replace(/\\s/g, '');\n keys = key.split(',');\n if ((keys[keys.length - 1]) == '') {\n keys[keys.length - 2] += ',';\n }\n return keys;\n }\n\n // abstract mods logic for assign and unassign\n function getMods(key) {\n var mods = key.slice(0, key.length - 1);\n for (var mi = 0; mi < mods.length; mi++)\n mods[mi] = _MODIFIERS[mods[mi]];\n return mods;\n }\n\n // cross-browser events\n function addEvent(object, event, method) {\n if (object.addEventListener)\n object.addEventListener(event, method, false);\n else if(object.attachEvent)\n object.attachEvent('on'+event, function(){ method(window.event) });\n };\n\n // set the handlers globally on document\n addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48\n addEvent(document, 'keyup', clearModifier);\n\n // reset modifiers to false whenever the window is (re)focused.\n addEvent(window, 'focus', resetModifiers);\n\n // store previously defined key\n var previousKey = global.key;\n\n // restore previously defined key and return reference to our key object\n function noConflict() {\n var k = global.key;\n global.key = previousKey;\n return k;\n }\n\n // set window.key and window.key.set/get/deleteScope, and the default filter\n global.key = assignKey;\n global.key.setScope = setScope;\n global.key.getScope = getScope;\n global.key.deleteScope = deleteScope;\n global.key.filter = filter;\n global.key.isPressed = isPressed;\n global.key.isModifier = isModifierPressed;\n global.key.getPressedKeyCodes = getPressedKeyCodes;\n global.key.noConflict = noConflict;\n global.key.unbind = unbindKey;\n\n if(typeof module !== 'undefined') module.exports = assignKey;\n\n})(window);\n\n","/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\nif (!String.fromCodePoint) {\n (function () {\n var defineProperty = (function () {\n // IE 8 only supports `Object.defineProperty` on DOM elements\n try {\n var object = {};\n var $defineProperty = Object.defineProperty;\n var result = $defineProperty(object, object, object) && $defineProperty;\n } catch (error) {\n }\n return result;\n }());\n var stringFromCharCode = String.fromCharCode;\n var floor = Math.floor;\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000;\n var codeUnits = [];\n var highSurrogate;\n var lowSurrogate;\n var index = -1;\n var length = arguments.length;\n if (!length) {\n return '';\n }\n var result = '';\n while (++index < length) {\n var codePoint = Number(arguments[index]);\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) != codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint);\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint);\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n highSurrogate = (codePoint >> 10) + 0xD800;\n lowSurrogate = (codePoint % 0x400) + 0xDC00;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 == length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n if (defineProperty) {\n defineProperty(String, 'fromCodePoint', {\n 'value': fromCodePoint,\n 'configurable': true,\n 'writable': true\n });\n } else {\n String.fromCodePoint = fromCodePoint;\n }\n }());\n}\n","/** Make a node */\nfunction mk (e) {\n return document.createElement(e)\n}\n\n/** Find one by query */\nfunction qs (s) {\n return document.querySelector(s)\n}\n\n/** Find all by query */\nfunction qsa (s) {\n return document.querySelectorAll(s)\n}\n\n/** Convert any to bool safely */\nfunction bool (x) {\n return (x === 1 || x === '1' || x === true || x === 'true')\n}\n\n/**\n * Filter 'spacebar' and 'return' from keypress handler,\n * and when they're pressed, fire the callback.\n * use $(...).on('keypress', cr(handler))\n */\nfunction cr (hdl) {\n return function (e) {\n if (e.which === 10 || e.which === 13 || e.which === 32) {\n hdl()\n }\n }\n}\n\n/** HTML escape */\nfunction esc (str) {\n return $.htmlEscape(str)\n}\n\n/** Check for undefined */\nfunction undef (x) {\n return typeof x == 'undefined'\n}\n\n/** Safe json parse */\nfunction jsp (str) {\n try {\n return JSON.parse(str)\n } catch (e) {\n console.error(e)\n return null\n }\n}\n\n/** Create a character from ASCII code */\nfunction Chr (n) {\n return String.fromCharCode(n)\n}\n\n/** Decode number from 2B encoding */\nfunction parse2B (s, i = 0) {\n return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127\n}\n\n/** Decode number from 3B encoding */\nfunction parse3B (s, i = 0) {\n return (s.charCodeAt(i) - 1) + (s.charCodeAt(i + 1) - 1) * 127 + (s.charCodeAt(i + 2) - 1) * 127 * 127\n}\n\n/** Encode using 2B encoding, returns string. */\nfunction encode2B (n) {\n let lsb, msb\n lsb = (n % 127)\n n = ((n - lsb) / 127)\n lsb += 1\n msb = (n + 1)\n return Chr(lsb) + Chr(msb)\n}\n\n/** Encode using 3B encoding, returns string. */\nfunction encode3B (n) {\n let lsb, msb, xsb\n lsb = (n % 127)\n n = (n - lsb) / 127\n lsb += 1\n msb = (n % 127)\n n = (n - msb) / 127\n msb += 1\n xsb = (n + 1)\n return Chr(lsb) + Chr(msb) + Chr(xsb)\n}\n","/** Module for toggling a modal overlay */\n(function () {\n let modal = {}\n let curCloseCb = null\n\n modal.show = function (sel, closeCb) {\n let $m = $(sel)\n $m.removeClass('hidden visible')\n setTimeout(function () {\n $m.addClass('visible')\n }, 1)\n curCloseCb = closeCb\n }\n\n modal.hide = function (sel) {\n let $m = $(sel)\n $m.removeClass('visible')\n setTimeout(function () {\n $m.addClass('hidden')\n if (curCloseCb) curCloseCb()\n }, 500) // transition time\n }\n\n modal.init = function () {\n // close modal by click outside the dialog\n $('.Modal').on('click', function () {\n if ($(this).hasClass('no-close')) return // this is a no-close modal\n modal.hide(this)\n })\n\n $('.Dialog').on('click', function (e) {\n e.stopImmediatePropagation()\n })\n\n // Hide all modals on esc\n $(window).on('keydown', function (e) {\n if (e.which === 27) {\n modal.hide('.Modal')\n }\n })\n }\n\n window.Modal = modal\n})()\n","window.Notify = (function () {\n let nt = {}\n const sel = '#notif'\n let $balloon\n\n let timerHideBegin // timeout to start hiding (transition)\n let timerHideEnd // timeout to add the hidden class\n let timerCanCancel\n let canCancel = false\n\n let stopTimeouts = function () {\n clearTimeout(timerHideBegin)\n clearTimeout(timerHideEnd)\n }\n\n nt.show = function (message, timeout, isError) {\n $balloon.toggleClass('error', isError === true)\n $balloon.html(message)\n Modal.show($balloon)\n stopTimeouts()\n\n if (undef(timeout) || timeout === null || timeout <= 0) {\n timeout = 2500\n }\n\n timerHideBegin = setTimeout(nt.hide, timeout)\n\n canCancel = false\n timerCanCancel = setTimeout(function () {\n canCancel = true\n }, 500)\n }\n\n nt.hide = function () {\n let $m = $(sel)\n $m.removeClass('visible')\n timerHideEnd = setTimeout(function () {\n $m.addClass('hidden')\n }, 250) // transition time\n }\n\n nt.init = function () {\n $balloon = $(sel)\n\n // close by click outside\n $(document).on('click', function () {\n if (!canCancel) return\n nt.hide(this)\n })\n\n // click caused by selecting, prevent it from bubbling\n $balloon.on('click', function (e) {\n e.stopImmediatePropagation()\n return false\n })\n\n // stop fading if moused\n $balloon.on('mouseenter', function () {\n stopTimeouts()\n $balloon.removeClass('hidden').addClass('visible')\n })\n }\n\n return nt\n})()\n","/** Global generic init */\n$.ready(function () {\n // Checkbox UI (checkbox CSS and hidden input with int value)\n $('.Row.checkbox').forEach(function (x) {\n let inp = x.querySelector('input')\n let box = x.querySelector('.box')\n\n $(box).toggleClass('checked', inp.value)\n\n let hdl = function () {\n inp.value = 1 - inp.value\n $(box).toggleClass('checked', inp.value)\n }\n\n $(x).on('click', hdl).on('keypress', cr(hdl))\n })\n\n // Expanding boxes on mobile\n $('.Box.mobcol,.Box.fold').forEach(function (x) {\n let h = x.querySelector('h2')\n\n let hdl = function () {\n $(x).toggleClass('expanded')\n }\n $(h).on('click', hdl).on('keypress', cr(hdl))\n })\n\n $('form').forEach(function (x) {\n $(x).on('keypress', function (e) {\n if ((e.keyCode === 10 || e.keyCode === 13) && e.ctrlKey) {\n x.submit()\n }\n })\n })\n\n // loader dots...\n setInterval(function () {\n $('.anim-dots').each(function (x) {\n let $x = $(x)\n let dots = $x.html() + '.'\n if (dots.length === 5) dots = '.'\n $x.html(dots)\n })\n }, 1000)\n\n // flipping number boxes with the mouse wheel\n $('input[type=number]').on('mousewheel', function (e) {\n let $this = $(this)\n let val = +$this.val()\n if (isNaN(val)) val = 1\n\n const step = +($this.attr('step') || 1)\n const min = +$this.attr('min')\n const max = +$this.attr('max')\n if (e.wheelDelta > 0) {\n val += step\n } else {\n val -= step\n }\n\n if (undef(min)) val = Math.max(val, +min)\n if (undef(max)) val = Math.min(val, +max)\n $this.val(val)\n\n if ('createEvent' in document) {\n let evt = document.createEvent('HTMLEvents')\n evt.initEvent('change', false, true)\n $this[0].dispatchEvent(evt)\n } else {\n $this[0].fireEvent('onchange')\n }\n\n e.preventDefault()\n })\n\n // populate the form errors box from GET arg ?err=...\n // (a way to pass errors back from server via redirect)\n let errAt = location.search.indexOf('err=')\n if (errAt !== -1 && qs('.Box.errors')) {\n let errs = location.search.substr(errAt + 4).split(',')\n let humanReadableErrors = []\n errs.forEach(function (er) {\n let lbl = qs('label[for=\"' + er + '\"]')\n if (lbl) {\n lbl.classList.add('error')\n humanReadableErrors.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, ''))\n }\n // else {\n // hres.push(er)\n // }\n })\n\n qs('.Box.errors .list').innerHTML = humanReadableErrors.join(', ')\n qs('.Box.errors').classList.remove('hidden')\n }\n\n Modal.init()\n Notify.init()\n\n // remove tabindices from h2 if wide\n if (window.innerWidth > 550) {\n $('.Box h2').forEach(function (x) {\n x.removeAttribute('tabindex')\n })\n\n // brand works as a link back to term in widescreen mode\n let br = qs('#brand')\n br && br.addEventListener('click', function () {\n location.href = '/' // go to terminal\n })\n }\n})\n\n// setup the ajax loader\n$._loader = function (vis) {\n $('#loader').toggleClass('show', vis)\n}\n\n// reveal content on load\nfunction showPage () {\n $('#content').addClass('load')\n}\n\n// Auto reveal pages other than the terminal (sets window.noAutoShow)\n$.ready(function () {\n if (window.noAutoShow !== true) {\n setTimeout(function () {\n showPage()\n }, 1)\n }\n})\n","class ANSIParser {\n constructor (handler) {\n this.reset()\n this.handler = handler\n this.joinChunks = true\n }\n reset () {\n this.currentSequence = 0\n this.sequence = ''\n }\n parseSequence (sequence) {\n if (sequence[0] === '[') {\n let type = sequence[sequence.length - 1]\n let content = sequence.substring(1, sequence.length - 1)\n\n let numbers = content ? content.split(';').map(i => +i.replace(/\\D/g, '')) : []\n let numOr1 = numbers.length ? numbers[0] : 1\n if (type === 'H') {\n this.handler('set-cursor', (numbers[0] | 0) - 1, (numbers[1] | 0) - 1)\n } else if (type >= 'A' && type <= 'D') {\n this.handler(`move-cursor-${type <= 'B' ? 'y' : 'x'}`, ((type === 'B' || type === 'C') ? 1 : -1) * numOr1)\n } else if (type === 'E' || type === 'F') {\n this.handler('move-cursor-line', (type === 'E' ? 1 : -1) * numOr1)\n } else if (type === 'G') {\n this.handler('set-cursor-x', numOr1 - 1)\n } else if (type === 'J') {\n let number = numbers.length ? numbers[0] : 2\n if (number === 2) this.handler('clear')\n } else if (type === 'P') {\n this.handler('delete', numOr1)\n } else if (type === '@') {\n this.handler('insert-blanks', numOr1)\n } else if (type === 'q') this.handler('set-cursor-style', numOr1)\n else if (type === 'm') {\n if (!numbers.length || numbers[0] === 0) {\n this.handler('reset-style')\n return\n }\n let type = numbers[0]\n if (type === 1) this.handler('add-attrs', 1) // bold\n else if (type === 2) this.handler('add-attrs', 1 << 1) // faint\n else if (type === 3) this.handler('add-attrs', 1 << 2) // italic\n else if (type === 4) this.handler('add-attrs', 1 << 3) // underline\n else if (type === 5 || type === 6) this.handler('add-attrs', 1 << 4) // blink\n else if (type === 7) this.handler('add-attrs', -1) // invert\n else if (type === 9) this.handler('add-attrs', 1 << 6) // strike\n else if (type === 20) this.handler('add-attrs', 1 << 5) // fraktur\n else if (type >= 30 && type <= 37) this.handler('set-color-fg', type % 10)\n else if (type >= 40 && type <= 47) this.handler('set-color-bg', type % 10)\n else if (type === 39) this.handler('set-color-fg', 7)\n else if (type === 49) this.handler('set-color-bg', 0)\n else if (type >= 90 && type <= 98) this.handler('set-color-fg', (type % 10) + 8)\n else if (type >= 100 && type <= 108) this.handler('set-color-bg', (type % 10) + 8)\n else if (type === 38 || type === 48) {\n if (numbers[1] === 5) {\n let color = (numbers[2] | 0) & 0xFF\n if (type === 38) this.handler('set-color-fg', color)\n if (type === 48) this.handler('set-color-bg', color)\n }\n }\n } else if (type === 'h' || type === 'l') {\n if (content === '?25') {\n if (type === 'h') this.handler('show-cursor')\n else if (type === 'l') this.handler('hide-cursor')\n }\n }\n }\n }\n write (text) {\n for (let character of text.toString()) {\n let code = character.codePointAt(0)\n if (code === 0x1b) this.currentSequence = 1\n else if (this.currentSequence === 1 && character === '[') {\n this.currentSequence = 2\n this.sequence += '['\n } else if (this.currentSequence && character.match(/[\\x40-\\x7e]/)) {\n this.parseSequence(this.sequence + character)\n this.currentSequence = 0\n this.sequence = ''\n } else if (this.currentSequence > 1) this.sequence += character\n else if (this.currentSequence === 1) {\n // something something nothing\n this.currentSequence = 0\n this.handler('write', character)\n } else if (code < 0x03) this.handler('_null')\n else if (code === 0x03) this.handler('sigint')\n else if (code <= 0x06) this.handler('_null')\n else if (code === 0x07) this.handler('bell')\n else if (code === 0x08) this.handler('back')\n else if (code === 0x0a) this.handler('new-line')\n else if (code === 0x0d) this.handler('return')\n else if (code === 0x15) this.handler('delete-line')\n else if (code === 0x17) this.handler('delete-word')\n else this.handler('write', character)\n }\n if (!this.joinChunks) this.reset()\n }\n}\nconst TERM_DEFAULT_STYLE = 7\nconst TERM_MIN_DRAW_DELAY = 10\n\nlet getRainbowColor = t => {\n let r = Math.floor(Math.sin(t) * 2.5 + 2.5)\n let g = Math.floor(Math.sin(t + 2 / 3 * Math.PI) * 2.5 + 2.5)\n let b = Math.floor(Math.sin(t + 4 / 3 * Math.PI) * 2.5 + 2.5)\n return 16 + 36 * r + 6 * g + b\n}\n\nclass ScrollingTerminal {\n constructor (screen) {\n this.width = 80\n this.height = 25\n this.termScreen = screen\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n\n this.reset()\n\n this._lastLoad = Date.now()\n this.termScreen.load(this.serialize(), 0)\n }\n reset () {\n this.style = TERM_DEFAULT_STYLE\n this.cursor = { x: 0, y: 0, style: 1, visible: true }\n this.trackMouse = false\n this.theme = 0\n this.rainbow = false\n this.parser.reset()\n this.clear()\n }\n clear () {\n this.screen = []\n for (let i = 0; i < this.width * this.height; i++) {\n this.screen.push([' ', this.style])\n }\n }\n scroll () {\n this.screen.splice(0, this.width)\n for (let i = 0; i < this.width; i++) {\n this.screen.push([' ', TERM_DEFAULT_STYLE])\n }\n this.cursor.y--\n }\n newLine () {\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n writeChar (character) {\n this.screen[this.cursor.y * this.width + this.cursor.x] = [character, this.style]\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.newLine()\n }\n }\n moveBack (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x--\n if (this.cursor.x < 0) {\n if (this.cursor.y > 0) this.cursor.x = this.width - 1\n else this.cursor.x = 0\n this.cursor.y = Math.max(0, this.cursor.y - 1)\n }\n }\n }\n moveForward (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n }\n }\n deleteChar () {\n this.moveBack()\n this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, 1)\n }\n deleteForward (n) {\n n = Math.min(this.width, n)\n for (let i = 0; i < n; i++) this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, n)\n }\n clampCursor () {\n if (this.cursor.x < 0) this.cursor.x = 0\n if (this.cursor.y < 0) this.cursor.y = 0\n if (this.cursor.x > this.width - 1) this.cursor.x = this.width - 1\n if (this.cursor.y > this.height - 1) this.cursor.y = this.height - 1\n }\n handleParsed (action, ...args) {\n if (action === 'write') {\n this.writeChar(args[0])\n } else if (action === 'delete') {\n this.deleteForward(args[0])\n } else if (action === 'insert-blanks') {\n this.insertBlanks(args[0])\n } else if (action === 'clear') {\n this.clear()\n } else if (action === 'bell') {\n this.terminal.load('B')\n } else if (action === 'back') {\n this.moveBack()\n } else if (action === 'new-line') {\n this.newLine()\n } else if (action === 'return') {\n this.cursor.x = 0\n } else if (action === 'set-cursor') {\n this.cursor.x = args[1]\n this.cursor.y = args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-y') {\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-x') {\n this.cursor.x += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-line') {\n this.cursor.x = 0\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'set-cursor-x') {\n this.cursor.x = args[0]\n } else if (action === 'set-cursor-style') {\n this.cursor.style = Math.max(0, Math.min(6, args[0]))\n } else if (action === 'reset-style') {\n this.style = TERM_DEFAULT_STYLE\n } else if (action === 'add-attrs') {\n if (args[0] === -1) {\n this.style = (this.style & 0xFF0000) | ((this.style >> 8) & 0xFF) | ((this.style & 0xFF) << 8)\n } else {\n this.style |= (args[0] << 16)\n }\n } else if (action === 'set-color-fg') {\n this.style = (this.style & 0xFFFF00) | args[0]\n } else if (action === 'set-color-bg') {\n this.style = (this.style & 0xFF00FF) | (args[0] << 8)\n } else if (action === 'hide-cursor') {\n this.cursor.visible = false\n } else if (action === 'show-cursor') {\n this.cursor.visible = true\n }\n }\n write (text) {\n this.parser.write(text)\n this.scheduleLoad()\n }\n serialize () {\n let serialized = 'S'\n serialized += encode2B(this.height) + encode2B(this.width)\n serialized += encode2B(this.cursor.y) + encode2B(this.cursor.x)\n\n let attributes = +this.cursor.visible\n attributes |= (3 << 5) * +this.trackMouse // track mouse controls both\n attributes |= 3 << 7 // buttons/links always visible\n attributes |= (this.cursor.style << 9)\n serialized += encode3B(attributes)\n\n let lastStyle = null\n let index = 0\n for (let cell of this.screen) {\n let style = cell[1]\n if (this.rainbow) {\n let x = index % this.width\n let y = Math.floor(index / this.width)\n style = (style & 0xFF0000) | getRainbowColor((x + y) / 10 + Date.now() / 1000)\n index++\n }\n if (style !== lastStyle) {\n let foreground = style & 0xFF\n let background = (style >> 8) & 0xFF\n let attributes = (style >> 16) & 0xFF\n let setForeground = foreground !== (lastStyle & 0xFF)\n let setBackground = background !== ((lastStyle >> 8) & 0xFF)\n let setAttributes = attributes !== ((lastStyle >> 16) & 0xFF)\n\n if (setForeground && setBackground) serialized += '\\x03' + encode3B(style & 0xFFFF)\n else if (setForeground) serialized += '\\x05' + encode2B(foreground)\n else if (setBackground) serialized += '\\x06' + encode2B(background)\n if (setAttributes) serialized += '\\x04' + encode2B(attributes)\n\n lastStyle = style\n }\n serialized += cell[0]\n }\n return serialized\n }\n scheduleLoad () {\n clearTimeout(this._scheduledLoad)\n if (this._lastLoad < Date.now() - TERM_MIN_DRAW_DELAY) {\n this.termScreen.load(this.serialize(), this.theme)\n } else {\n this._scheduledLoad = setTimeout(() => {\n this.termScreen.load(this.serialize())\n }, TERM_MIN_DRAW_DELAY - this._lastLoad)\n }\n }\n rainbowTimer () {\n if (!this.rainbow) return\n clearInterval(this._rainbowTimer)\n this._rainbowTimer = setInterval(() => {\n if (this.rainbow) this.scheduleLoad()\n }, 50)\n }\n}\n\nclass Process {\n constructor (args) {\n // event listeners\n this._listeners = {}\n }\n on (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener })\n }\n once (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener, once: true })\n }\n off (event, listener) {\n let listeners = this._listeners[event]\n if (listeners) {\n for (let i in listeners) {\n if (listeners[i].listener === listener) {\n listeners.splice(i, 1)\n break\n }\n }\n }\n }\n emit (event, ...args) {\n let listeners = this._listeners[event]\n if (listeners) {\n let remove = []\n for (let listener of listeners) {\n try {\n listener.listener(...args)\n if (listener.once) remove.push(listener)\n } catch (err) {\n console.error(err)\n }\n }\n for (let listener of remove) {\n listeners.splice(listeners.indexOf(listener), 1)\n }\n }\n }\n write (data) {\n this.emit('in', data)\n }\n destroy () {\n // death.\n this.emit('exit', 0)\n }\n run () {\n // noop\n }\n}\n\nlet demoData = {\n buttons: {\n 1: '',\n 2: '',\n 3: '',\n 4: '',\n 5: function (terminal, shell) {\n if (shell.child) shell.child.destroy()\n let chars = 'info\\r'\n let loop = function () {\n shell.write(chars[0])\n chars = chars.substr(1)\n if (chars) setTimeout(loop, 100)\n }\n setTimeout(loop, 200)\n }\n },\n mouseReceiver: null\n}\n\nlet demoshIndex = {\n clear: class Clear extends Process {\n run () {\n this.emit('write', '\\x1b[2J\\x1b[1;1H')\n this.destroy()\n }\n },\n screenfetch: class Screenfetch extends Process {\n run () {\n let image = `\n ###. ESPTerm Demo\n '###. Hostname: ${window.location.hostname}\n '###. Shell: ESPTerm Demo Shell\n '###. Resolution: 80x25@${window.devicePixelRatio}x\n :###-\n .###'\n .###'\n .###' ###############\n ###' ###############\n `.split('\\n').filter(line => line.trim())\n\n let chars = ''\n for (let y = 0; y < image.length; y++) {\n for (let x = 0; x < 80; x++) {\n if (image[y][x]) {\n chars += `\\x1b[38;5;${getRainbowColor((x + y) / 10)}m${image[y][x]}`\n } else chars += ' '\n }\n }\n\n this.emit('write', '\\r\\n\\x1b[?25l')\n let loop = () => {\n this.emit('write', chars.substr(0, 80))\n chars = chars.substr(80)\n if (chars.length) setTimeout(loop, 50)\n else {\n this.emit('write', '\\r\\n\\x1b[?25h')\n this.destroy()\n }\n }\n loop()\n }\n },\n 'local-echo': class LocalEcho extends Process {\n run (...args) {\n if (!args.includes('--suppress-note')) {\n this.emit('write', '\\x1b[38;5;239mNote: not all terminal features are supported or and may not work as expected in this demo\\x1b[0m\\r\\n')\n }\n }\n write (data) {\n this.emit('write', data)\n }\n },\n 'info': class Info extends Process {\n run (...args) {\n let fast = args.includes('--fast')\n this.showSplash().then(() => {\n this.printText(fast)\n })\n }\n showSplash () {\n let splash = `\n -#####- -###*..#####- ######-\n -#* -#- .## .##. *#-\n -##### .-###*..#####- *#- -*##*- #*-#--#**#-*##-\n -#* -#-.##. *#- *##@#* ##. -#* *# .#*\n -#####--####- .##. *#- -*#@@- ##. -#* *# .#*\n `.split('\\n').filter(line => line.trim())\n let levels = {\n ' ': -231,\n '.': 4,\n '-': 8,\n '*': 17,\n '#': 24\n }\n for (let i in splash) {\n if (splash[i].length < 79) splash[i] += ' '.repeat(79 - splash[i].length)\n }\n this.emit('write', '\\r\\n'.repeat(splash.length + 1))\n this.emit('write', '\\x1b[A'.repeat(splash.length))\n this.emit('write', '\\x1b[?25l')\n\n let cursorX = 0\n let cursorY = 0\n let moveTo = (x, y) => {\n let moveX = x - cursorX\n let moveY = y - cursorY\n this.emit('write', `\\x1b[${Math.abs(moveX)}${moveX > 0 ? 'C' : 'D'}`)\n this.emit('write', `\\x1b[${Math.abs(moveY)}${moveY > 0 ? 'B' : 'A'}`)\n cursorX = x\n cursorY = y\n }\n let drawCell = (x, y) => {\n moveTo(x, y)\n if (splash[y][x] === '@') {\n this.emit('write', '\\x1b[48;5;8m\\x1b[38;5;255m▄\\b')\n } else {\n this.emit('write', `\\x1b[48;5;${231 + levels[splash[y][x]]}m \\b`)\n }\n }\n return new Promise((resolve, reject) => {\n const self = this\n let x = 14\n let cycles = 0\n let loop = function () {\n for (let y = 0; y < splash.length; y++) {\n let dx = x - y\n if (dx > 0) drawCell(dx, y)\n }\n\n if (++x < 79) {\n if (++cycles >= 3) {\n setTimeout(loop, 20)\n cycles = 0\n } else loop()\n } else {\n moveTo(0, splash.length)\n self.emit('write', '\\x1b[m\\x1b[?25h')\n resolve()\n }\n }\n loop()\n })\n }\n printText (fast = false) {\n // lots of printing\n let parts = [\n '',\n ' ESPTerm is a VT100-like terminal emulator running on the ESP8266 WiFi chip.',\n '',\n ' \\x1b[93mThis is an online demo of the web user interface, simulating a simple ',\n ' terminal in your browser.\\x1b[m',\n '',\n ' Type \\x1b[92mls\\x1b[m to list available commands.',\n ' Use the \\x1b[94mlinks\\x1b[m below this screen for a demo of the options and more info.',\n ''\n ]\n\n if (fast) {\n this.emit('write', parts.join('\\r\\n') + '\\r\\n')\n this.destroy()\n } else {\n const self = this\n let loop = function () {\n self.emit('write', parts.shift() + '\\r\\n')\n if (parts.length) setTimeout(loop, 17)\n else self.destroy()\n }\n loop()\n }\n }\n },\n colors: class PrintColors extends Process {\n run () {\n this.emit('write', '\\r\\n')\n let fgtext = 'foreground-color'\n this.emit('write', ' ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `3${i}` : `9${i - 8}`) + 'm')\n this.emit('write', fgtext[i] + ' ')\n }\n this.emit('write', '\\r\\n ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `4${i}` : `10${i - 8}`) + 'm ')\n }\n this.emit('write', '\\x1b[m\\r\\n')\n for (let r = 0; r < 6; r++) {\n this.emit('write', ' ')\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n this.emit('write', `\\x1b[48;5;${16 + r * 36 + g * 6 + b}m `)\n }\n this.emit('write', '\\x1b[m')\n }\n this.emit('write', '\\r\\n')\n }\n this.emit('write', ' ')\n for (let g = 0; g < 24; g++) {\n this.emit('write', `\\x1b[48;5;${232 + g}m `)\n }\n this.emit('write', '\\x1b[m\\r\\n\\n')\n this.destroy()\n }\n },\n ls: class ListCommands extends Process {\n run () {\n this.emit('write', '\\x1b[92mList of demo commands\\x1b[m\\r\\n')\n for (let i in demoshIndex) {\n if (typeof demoshIndex[i] === 'string') continue\n this.emit('write', i + '\\r\\n')\n }\n this.destroy()\n }\n },\n theme: class SetTheme extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run (...args) {\n let theme = args[0] | 0\n if (!args.length || !Number.isFinite(theme) || theme < 0 || theme > 5) {\n this.emit('write', '\\x1b[31mUsage: theme [0–5]\\r\\n')\n this.destroy()\n return\n }\n this.shell.terminal.theme = theme\n // HACK: reset drawn screen to prevent only partly redrawn screen\n this.shell.terminal.termScreen.drawnScreenFG = []\n this.emit('write', '')\n this.destroy()\n }\n },\n cursor: class SetCursor extends Process {\n run (...args) {\n let steady = args.includes('--steady')\n if (args.includes('block')) {\n this.emit('write', `\\x1b[${0 + 2 * steady} q`)\n } else if (args.includes('line')) {\n this.emit('write', `\\x1b[${3 + steady} q`)\n } else if (args.includes('bar') || args.includes('beam')) {\n this.emit('write', `\\x1b[${5 + steady} q`)\n } else {\n this.emit('write', '\\x1b[31mUsage: cursor [block|line|bar] [--steady]\\r\\n')\n }\n this.destroy()\n }\n },\n rainbow: class ToggleRainbow extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.rainbow = !this.shell.terminal.rainbow\n this.shell.terminal.rainbowTimer()\n this.emit('write', '')\n this.destroy()\n }\n },\n mouse: class ShowMouse extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.trackMouse = true\n demoData.mouseReceiver = this\n this.randomData = []\n this.highlighted = {}\n let characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\n for (let i = 0; i < 23; i++) {\n let line = ''\n for (let j = 0; j < 79; j++) {\n line += characters[Math.floor(characters.length * Math.random())]\n }\n this.randomData.push(line)\n }\n this.scrollOffset = 0\n this.render()\n }\n render () {\n this.emit('write', '\\x1b[m\\x1b[2J\\x1b[1;1H')\n this.emit('write', '\\x1b[97m\\x1b[1mMouse Demo\\r\\n\\x1b[mMouse movement, clicking and scrolling!')\n\n // render random data for scrolling\n for (let y = 0; y < 23; y++) {\n let index = y + this.scrollOffset\n // proper modulo:\n index = ((index % this.randomData.length) + this.randomData.length) % this.randomData.length\n let line = this.randomData[index]\n let lineData = `\\x1b[${3 + y};1H\\x1b[38;5;239m`\n for (let x in line) {\n if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\\x1b[97m'\n lineData += line[x]\n if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\\x1b[38;5;239m'\n }\n this.emit('write', lineData)\n }\n\n // move cursor to mouse\n if (this.mouse) {\n this.emit('write', `\\x1b[${this.mouse.y + 1};${this.mouse.x + 1}H`)\n }\n }\n mouseMove (x, y) {\n this.mouse = { x, y }\n this.render()\n }\n mouseDown (x, y, button) {\n if (button === 4) this.scrollOffset--\n else if (button === 5) this.scrollOffset++\n else this.highlighted[y * 80 + x] = !this.highlighted[y * 80 + x]\n this.render()\n }\n mouseUp (x, y, button) {}\n destroy () {\n this.shell.terminal.write('\\x1b[2J\\x1b[1;1H')\n this.shell.terminal.trackMouse = false\n if (demoData.mouseReceiver === this) demoData.mouseReceiver = null\n super.destroy()\n }\n },\n sudo: class Sudo extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run (...args) {\n if (args.length === 0) {\n this.emit('write', '\\x1b[31mUsage: sudo \\x1b[m\\r\\n')\n this.destroy()\n } else if (args.length === 4 && args.join(' ').toLowerCase() === 'make me a sandwich') {\n const b = '\\x1b[33m'\n const r = '\\x1b[0m'\n const l = '\\x1b[32m'\n const c = '\\x1b[38;5;229m'\n const h = '\\x1b[38;5;225m'\n this.emit('write',\n ` ${b}_.---._\\r\\n` +\n ` _.-~ ~-._\\r\\n` +\n ` _.-~ ~-._\\r\\n` +\n ` _.-~ ~---._\\r\\n` +\n ` _.-~ ~\\\\\\r\\n` +\n ` .-~ _.;\\r\\n` +\n ` :-._ _.-~ ./\\r\\n` +\n ` \\`-._~-._ _..__.-~ _.-~\\r\\n` +\n ` ${c}/ ${b}~-._~-._ / .__..--${c}~-${l}---._\\r\\n` +\n `${c} \\\\_____(_${b};-._\\\\. _.-~_/${c} ~)${l}.. . \\\\\\r\\n` +\n `${l} /(_____ ${b}\\\\\\`--...--~_.-~${c}______..-+${l}_______)\\r\\n` +\n `${l} .(_________/${b}\\`--...--~/${l} _/ ${h} ${b}/\\\\\\r\\n` +\n `${b} /-._${h} \\\\_ ${l}(___./_..-~${h}__.....${b}__..-~./\\r\\n` +\n `${b} \\`-._~-._${h} ~\\\\--------~ .-~${b}_..__.-~ _.-~\\r\\n` +\n `${b} ~-._~-._ ${h}~---------\\` ${b}/ .__..--~\\r\\n` +\n `${b} ~-._\\\\. _.-~_/\\r\\n` +\n `${b} \\\\\\`--...--~_.-~\\r\\n` +\n `${b} \\`--...--~${r}\\r\\n`)\n this.destroy()\n } else {\n let name = args.shift()\n if (this.shell.index[name]) {\n let Process = this.shell.index[name]\n if (Process instanceof Function) {\n let child = new Process(this)\n let write = data => this.emit('write', data)\n child.on('write', write)\n child.on('exit', code => {\n child.off('write', write)\n this.destroy()\n })\n child.run(...args)\n } else {\n this.emit('write', Process)\n this.destroy()\n }\n } else {\n this.emit('write', `sudo: ${name}: command not found\\r\\n`)\n this.destroy()\n }\n }\n }\n },\n make: class Make extends Process {\n run (...args) {\n if (args.length === 0) this.emit('write', '\\x1b[31mmake: *** No targets specified. Stop.\\x1b[0m\\r\\n')\n else if (args.length === 3 && args.join(' ').toLowerCase() === 'me a sandwich') {\n this.emit('write', '\\x1b[31mmake: me a sandwich : Permission denied\\x1b[0m\\r\\n')\n } else {\n this.emit('write', `\\x1b[31mmake: *** No rule to make target '${args.join(' ').toLowerCase()}'. Stop.\\x1b[0m\\r\\n`)\n }\n this.destroy()\n }\n },\n pwd: '/this/is/a/demo\\r\\n',\n cd: '\\x1b[38;5;239mNo directories to change to\\r\\n',\n whoami: `${window.navigator.userAgent}\\r\\n`,\n hostname: `${window.location.hostname}`,\n uname: 'ESPTerm Demo\\r\\n',\n mkdir: '\\x1b[38;5;239mDid not create a directory because this is a demo.\\r\\n',\n rm: '\\x1b[38;5;239mDid not delete anything because this is a demo.\\r\\n',\n cp: '\\x1b[38;5;239mNothing to copy because this is a demo.\\r\\n',\n mv: '\\x1b[38;5;239mNothing to move because this is a demo.\\r\\n',\n ln: '\\x1b[38;5;239mNothing to link because this is a demo.\\r\\n',\n touch: '\\x1b[38;5;239mNothing to touch\\r\\n',\n exit: '\\x1b[38;5;239mNowhere to go\\r\\n',\n github: class GoToGithub extends Process {\n run () {\n window.open('https://github.com/espterm/espterm-firmware')\n this.destroy()\n }\n }\n}\n\nclass DemoShell {\n constructor (terminal, printInfo) {\n this.terminal = terminal\n this.terminal.reset()\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n this.history = []\n this.historyIndex = 0\n this.cursorPos = 0\n this.child = null\n this.index = demoshIndex\n\n if (printInfo) this.run('info')\n else this.prompt()\n }\n write (text) {\n if (this.child) {\n if (text.codePointAt(0) === 3) this.child.destroy()\n else this.child.write(text)\n } else this.parser.write(text)\n }\n prompt (success = true) {\n if (this.terminal.cursor.x !== 0) this.terminal.write('\\x1b[m\\x1b[38;5;238m⏎\\r\\n')\n this.terminal.write('\\x1b[34;1mdemosh \\x1b[m')\n if (!success) this.terminal.write('\\x1b[31m')\n this.terminal.write('$ \\x1b[m')\n this.history.unshift('')\n this.cursorPos = 0\n }\n copyFromHistoryIndex () {\n if (!this.historyIndex) return\n let current = this.history[this.historyIndex]\n this.history[0] = current\n this.historyIndex = 0\n }\n handleParsed (action, ...args) {\n this.terminal.write('\\b\\x1b[P'.repeat(this.cursorPos))\n if (action === 'write') {\n this.copyFromHistoryIndex()\n this.history[0] = this.history[0].substr(0, this.cursorPos) + args[0] + this.history[0].substr(this.cursorPos)\n this.cursorPos++\n } else if (action === 'back') {\n this.copyFromHistoryIndex()\n this.history[0] = this.history[0].substr(0, this.cursorPos - 1) + this.history[0].substr(this.cursorPos)\n this.cursorPos--\n if (this.cursorPos < 0) this.cursorPos = 0\n } else if (action === 'move-cursor-x') {\n this.cursorPos = Math.max(0, Math.min(this.history[this.historyIndex].length, this.cursorPos + args[0]))\n } else if (action === 'delete-line') {\n this.copyFromHistoryIndex()\n this.history[0] = ''\n this.cursorPos = 0\n } else if (action === 'delete-word') {\n this.copyFromHistoryIndex()\n let words = this.history[0].substr(0, this.cursorPos).split(' ')\n words.pop()\n this.history[0] = words.join(' ') + this.history[0].substr(this.cursorPos)\n this.cursorPos = words.join(' ').length\n } else if (action === 'move-cursor-y') {\n this.historyIndex -= args[0]\n if (this.historyIndex < 0) this.historyIndex = 0\n if (this.historyIndex >= this.history.length) this.historyIndex = this.history.length - 1\n this.cursorPos = this.history[this.historyIndex].length\n }\n\n this.terminal.write(this.history[this.historyIndex])\n this.terminal.write('\\b'.repeat(this.history[this.historyIndex].length))\n this.terminal.moveForward(this.cursorPos)\n this.terminal.write('') // dummy. Apply the moveFoward\n\n if (action === 'return') {\n this.terminal.write('\\r\\n')\n this.parse(this.history[this.historyIndex])\n }\n }\n parse (input) {\n if (input === 'help') input = 'info'\n // TODO: basic chaining (i.e. semicolon)\n this.run(input)\n }\n run (command) {\n let parts = ['']\n\n let inQuote = false\n for (let character of command.trim()) {\n if (inQuote && character !== inQuote) {\n parts[parts.length - 1] += character\n } else if (inQuote) {\n inQuote = false\n } else if (character === '\"' || character === \"'\") {\n inQuote = character\n } else if (character.match(/\\s/)) {\n if (parts[parts.length - 1]) parts.push('')\n } else parts[parts.length - 1] += character\n }\n\n let name = parts.shift()\n\n if (name in this.index) {\n this.spawn(name, parts)\n } else {\n this.terminal.write(`demosh: Unknown command: ${name}\\r\\n`)\n this.prompt(false)\n }\n }\n spawn (name, args = []) {\n let Process = this.index[name]\n if (Process instanceof Function) {\n this.child = new Process(this)\n let write = data => this.terminal.write(data)\n this.child.on('write', write)\n this.child.on('exit', code => {\n if (this.child) this.child.off('write', write)\n this.child = null\n this.prompt(!code)\n })\n this.child.run(...args)\n } else {\n this.terminal.write(Process)\n this.prompt()\n }\n }\n}\n\nwindow.demoInterface = {\n input (data) {\n let type = data[0]\n let content = data.substr(1)\n\n if (type === 's') {\n this.shell.write(content)\n } else if (type === 'b') {\n let button = content.charCodeAt(0)\n let action = demoData.buttons[button]\n if (action) {\n if (typeof action === 'string') this.shell.write(action)\n else if (action instanceof Function) action(this.terminal, this.shell)\n }\n } else if (type === 'm' || type === 'p' || type === 'r') {\n let row = parse2B(content, 0)\n let column = parse2B(content, 2)\n let button = parse2B(content, 4)\n let modifiers = parse2B(content, 6)\n\n if (demoData.mouseReceiver) {\n if (type === 'm') demoData.mouseReceiver.mouseMove(column, row, button, modifiers)\n else if (type === 'p') demoData.mouseReceiver.mouseDown(column, row, button, modifiers)\n else if (type === 'r') demoData.mouseReceiver.mouseUp(column, row, button, modifiers)\n }\n }\n },\n init (screen) {\n this.terminal = new ScrollingTerminal(screen)\n this.shell = new DemoShell(this.terminal, true)\n }\n}\n","// Generated from PHP locale file\nlet _tr = {\n \"wifi.connected_ip_is\": \"Connected, IP is \",\n \"wifi.not_conn\": \"Not connected.\",\n \"wifi.enter_passwd\": \"Enter password for \\\":ssid:\\\"\"\n};\n\nfunction tr (key) { return _tr[key] || '?' + key + '?' }\n","(function (w) {\n const authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']\n let curSSID\n\n // Get XX % for a slider input\n function rangePt (inp) {\n return Math.round(((inp.value / inp.max) * 100)) + '%'\n }\n\n // Display selected STA SSID etc\n function selectSta (name, password, ip) {\n $('#sta_ssid').val(name)\n $('#sta_password').val(password)\n\n $('#sta-nw').toggleClass('hidden', name.length === 0)\n $('#sta-nw-nil').toggleClass('hidden', name.length > 0)\n\n $('#sta-nw .essid').html(esc(name))\n const nopw = undef(password) || password.length === 0\n $('#sta-nw .passwd').toggleClass('hidden', nopw)\n $('#sta-nw .nopasswd').toggleClass('hidden', !nopw)\n $('#sta-nw .ip').html(ip.length > 0 ? tr('wifi.connected_ip_is') + ip : tr('wifi.not_conn'))\n }\n\n /** Update display for received response */\n function onScan (resp, status) {\n // var ap_json = {\n // \"result\": {\n // \"inProgress\": \"0\",\n // \"APs\": [\n // {\"essid\": \"Chlivek\", \"bssid\": \"88:f7:c7:52:b3:99\", \"rssi\": \"204\", \"enc\": \"4\", \"channel\": \"1\"},\n // {\"essid\": \"TyNikdy\", \"bssid\": \"5c:f4:ab:0d:f1:1b\", \"rssi\": \"164\", \"enc\": \"3\", \"channel\": \"1\"},\n // ]\n // }\n // };\n\n if (status !== 200) {\n // bad response\n rescan(5000) // wait 5sm then retry\n return\n }\n\n try {\n resp = JSON.parse(resp)\n } catch (e) {\n console.log(e)\n rescan(5000)\n return\n }\n\n const done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0)\n rescan(done ? 15000 : 1000)\n if (!done) return // no redraw yet\n\n // clear the AP list\n let $list = $('#ap-list')\n // remove old APs\n $('#ap-list .AP').remove()\n\n $list.toggleClass('hidden', !done)\n $('#ap-loader').toggleClass('hidden', done)\n\n // scan done\n resp.result.APs.sort(function (a, b) {\n return b.rssi - a.rssi\n }).forEach(function (ap) {\n ap.enc = parseInt(ap.enc)\n\n if (ap.enc > 4) return // hide unsupported auths\n\n let item = mk('div')\n\n let $item = $(item)\n .data('ssid', ap.essid)\n .data('pwd', ap.enc)\n .attr('tabindex', 0)\n .addClass('AP')\n\n // mark current SSID\n if (ap.essid === curSSID) {\n $item.addClass('selected')\n }\n\n let inner = mk('div')\n let escapedSSID = $.htmlEscape(ap.essid)\n $(inner).addClass('inner')\n .htmlAppend(`
${ap.rssi_perc}
`)\n .htmlAppend(`
${escapedSSID}
`)\n .htmlAppend(`
${authStr[ap.enc]}
`)\n\n $item.on('click', function () {\n let $th = $(this)\n\n const conn_ssid = $th.data('ssid')\n let conn_pass = ''\n\n if (+$th.data('pwd')) {\n // this AP needs a password\n conn_pass = prompt(tr('wifi.enter_passwd').replace(':ssid:', conn_ssid))\n if (!conn_pass) return\n }\n\n $('#sta_password').val(conn_pass)\n $('#sta_ssid').val(conn_ssid)\n selectSta(conn_ssid, conn_pass, '')\n })\n\n item.appendChild(inner)\n $list[0].appendChild(item)\n })\n }\n\n function startScanning () {\n $('#ap-loader').removeClass('hidden')\n $('#ap-scan').addClass('hidden')\n $('#ap-loader .anim-dots').html('.')\n\n scanAPs()\n }\n\n /** Ask the CGI what APs are visible (async) */\n function scanAPs () {\n if (_demo) {\n onScan(_demo_aps, 200)\n } else {\n $.get('http://' + _root + '/cfg/wifi/scan', onScan)\n }\n }\n\n function rescan (time) {\n setTimeout(scanAPs, time)\n }\n\n /** Set up the WiFi page */\n function wifiInit (cfg) {\n // Update slider value displays\n $('.Row.range').forEach(function (x) {\n let inp = x.querySelector('input')\n let disp1 = x.querySelector('.x-disp1')\n let disp2 = x.querySelector('.x-disp2')\n let t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n $(inp).on('input', function () {\n t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n })\n })\n\n // Forget STA credentials\n $('#forget-sta').on('click', () => {\n selectSta('', '', '')\n return false\n })\n\n selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip)\n curSSID = cfg.sta_active_ssid\n }\n\n w.init = wifiInit\n w.startScanning = startScanning\n})(window.WiFi = {})\n","/** Handle connections */\nwindow.Conn = function (screen) {\n let ws\n let heartbeatTout\n let pingIv\n let xoff = false\n let autoXoffTout\n let reconTout\n\n let pageShown = false\n\n function onOpen (evt) {\n console.log('CONNECTED')\n heartbeat()\n doSend('i')\n }\n\n function onClose (evt) {\n console.warn('SOCKET CLOSED, code ' + evt.code + '. Reconnecting...')\n clearTimeout(reconTout)\n reconTout = setTimeout(function () {\n init()\n }, 2000)\n // this happens when the buffer gets fucked up via invalid unicode.\n // we basically use polling instead of socket then\n }\n\n function onMessage (evt) {\n try {\n // . = heartbeat\n switch (evt.data.charAt(0)) {\n case '.':\n // heartbeat, no-op message\n break\n\n case '-':\n // console.log('xoff');\n xoff = true\n autoXoffTout = setTimeout(function () {\n xoff = false\n }, 250)\n break\n\n case '+':\n // console.log('xon');\n xoff = false\n clearTimeout(autoXoffTout)\n break\n\n default:\n screen.load(evt.data)\n if (!pageShown) {\n showPage()\n pageShown = true\n }\n break\n }\n heartbeat()\n } catch (e) {\n console.error(e)\n }\n }\n\n function canSend () {\n return !xoff\n }\n\n function doSend (message) {\n if (_demo) {\n if (typeof demoInterface !== 'undefined') {\n demoInterface.input(message)\n } else {\n console.log(`TX: ${JSON.stringify(message)}`)\n }\n return true // Simulate success\n }\n if (xoff) {\n // TODO queue\n console.log(\"Can't send, flood control.\")\n return false\n }\n\n if (!ws) return false // for dry testing\n if (ws.readyState !== 1) {\n console.error('Socket not ready')\n return false\n }\n if (typeof message != 'string') {\n message = JSON.stringify(message)\n }\n ws.send(message)\n return true\n }\n\n function init () {\n if (window._demo) {\n if (typeof demoInterface === 'undefined') {\n alert('Demoing non-demo demo!') // this will catch mistakes when deploying to the website\n } else {\n demoInterface.init(screen)\n showPage()\n }\n return\n }\n\n clearTimeout(reconTout)\n clearTimeout(heartbeatTout)\n\n ws = new WebSocket('ws://' + _root + '/term/update.ws')\n ws.onopen = onOpen\n ws.onclose = onClose\n ws.onmessage = onMessage\n console.log('Opening socket.')\n heartbeat()\n }\n\n function heartbeat () {\n clearTimeout(heartbeatTout)\n heartbeatTout = setTimeout(heartbeatFail, 2000)\n }\n\n function heartbeatFail () {\n console.error('Heartbeat lost, probing server...')\n pingIv = setInterval(function () {\n console.log('> ping')\n $.get('http://' + _root + '/system/ping', function (resp, status) {\n if (status === 200) {\n clearInterval(pingIv)\n console.info('Server ready, reloading page...')\n location.reload()\n }\n }, {\n timeout: 100\n })\n }, 1000)\n }\n\n return {\n ws: null,\n init,\n send: doSend,\n canSend // check flood control\n }\n}\n","/**\n * User input\n *\n * --- Rx messages: ---\n * S - screen content (binary encoding of the entire screen with simple compression)\n * T - text labels - Title and buttons, \\0x01-separated\n * B - beep\n * . - heartbeat\n *\n * --- Tx messages ---\n * s - string\n * b - action button\n * p - mb press\n * r - mb release\n * m - mouse move\n */\nwindow.Input = function (conn) {\n let cfg = {\n np_alt: false,\n cu_alt: false,\n fn_alt: false,\n mt_click: false,\n mt_move: false,\n no_keys: false,\n crlf_mode: false\n }\n\n /** Send a literal message */\n function sendStrMsg (str) {\n return conn.send('s' + str)\n }\n\n /** Send a button event */\n function sendBtnMsg (n) {\n conn.send('b' + String.fromCharCode(n))\n }\n\n /** Fn alt choice for key message */\n function fa (alt, normal) {\n return cfg.fn_alt ? alt : normal\n }\n\n /** Cursor alt choice for key message */\n function ca (alt, normal) {\n return cfg.cu_alt ? alt : normal\n }\n\n /** Numpad alt choice for key message */\n function na (alt, normal) {\n return cfg.np_alt ? alt : normal\n }\n\n function bindFnKeys (allFn) {\n const keymap = {\n 'tab': '\\x09',\n 'backspace': '\\x08',\n 'enter': cfg.crlf_mode ? '\\x0d\\x0a' : '\\x0d',\n 'ctrl+enter': '\\x0a',\n 'esc': '\\x1b',\n 'up': ca('\\x1bOA', '\\x1b[A'),\n 'down': ca('\\x1bOB', '\\x1b[B'),\n 'right': ca('\\x1bOC', '\\x1b[C'),\n 'left': ca('\\x1bOD', '\\x1b[D'),\n 'home': ca('\\x1bOH', fa('\\x1b[H', '\\x1b[1~')),\n 'insert': '\\x1b[2~',\n 'delete': '\\x1b[3~',\n 'end': ca('\\x1bOF', fa('\\x1b[F', '\\x1b[4~')),\n 'pageup': '\\x1b[5~',\n 'pagedown': '\\x1b[6~',\n 'f1': fa('\\x1bOP', '\\x1b[11~'),\n 'f2': fa('\\x1bOQ', '\\x1b[12~'),\n 'f3': fa('\\x1bOR', '\\x1b[13~'),\n 'f4': fa('\\x1bOS', '\\x1b[14~'),\n 'f5': '\\x1b[15~', // note the disconnect\n 'f6': '\\x1b[17~',\n 'f7': '\\x1b[18~',\n 'f8': '\\x1b[19~',\n 'f9': '\\x1b[20~',\n 'f10': '\\x1b[21~', // note the disconnect\n 'f11': '\\x1b[23~',\n 'f12': '\\x1b[24~',\n 'shift+f1': fa('\\x1bO1;2P', '\\x1b[25~'),\n 'shift+f2': fa('\\x1bO1;2Q', '\\x1b[26~'), // note the disconnect\n 'shift+f3': fa('\\x1bO1;2R', '\\x1b[28~'),\n 'shift+f4': fa('\\x1bO1;2S', '\\x1b[29~'), // note the disconnect\n 'shift+f5': fa('\\x1b[15;2~', '\\x1b[31~'),\n 'shift+f6': fa('\\x1b[17;2~', '\\x1b[32~'),\n 'shift+f7': fa('\\x1b[18;2~', '\\x1b[33~'),\n 'shift+f8': fa('\\x1b[19;2~', '\\x1b[34~'),\n 'shift+f9': fa('\\x1b[20;2~', '\\x1b[35~'), // 35-38 are not standard - but what is?\n 'shift+f10': fa('\\x1b[21;2~', '\\x1b[36~'),\n 'shift+f11': fa('\\x1b[22;2~', '\\x1b[37~'),\n 'shift+f12': fa('\\x1b[23;2~', '\\x1b[38~'),\n 'np_0': na('\\x1bOp', '0'),\n 'np_1': na('\\x1bOq', '1'),\n 'np_2': na('\\x1bOr', '2'),\n 'np_3': na('\\x1bOs', '3'),\n 'np_4': na('\\x1bOt', '4'),\n 'np_5': na('\\x1bOu', '5'),\n 'np_6': na('\\x1bOv', '6'),\n 'np_7': na('\\x1bOw', '7'),\n 'np_8': na('\\x1bOx', '8'),\n 'np_9': na('\\x1bOy', '9'),\n 'np_mul': na('\\x1bOR', '*'),\n 'np_add': na('\\x1bOl', '+'),\n 'np_sub': na('\\x1bOS', '-'),\n 'np_point': na('\\x1bOn', '.'),\n 'np_div': na('\\x1bOQ', '/')\n // we don't implement numlock key (should change in numpad_alt mode,\n // but it's even more useless than the rest and also has the side\n // effect of changing the user's numlock state)\n }\n\n const blacklist = [\n 'f5', 'f11', 'f12', 'shift+f5'\n ]\n\n for (let k in keymap) {\n if (!allFn && blacklist.includes(k)) continue\n if (keymap.hasOwnProperty(k)) {\n bind(k, keymap[k])\n }\n }\n }\n\n /** Bind a keystroke to message */\n function bind (combo, str) {\n // mac fix - allow also cmd\n if (combo.indexOf('ctrl+') !== -1) {\n combo += ',' + combo.replace('ctrl', 'command')\n }\n\n // unbind possible old binding\n key.unbind(combo)\n\n key(combo, function (e) {\n if (cfg.no_keys) return\n e.preventDefault()\n sendStrMsg(str)\n })\n }\n\n /** Bind/rebind key messages */\n function initKeys ({ allFn }) {\n // This takes care of text characters typed\n window.addEventListener('keypress', function (evt) {\n if (cfg.no_keys) return\n let str = ''\n if (evt.key) str = evt.key\n else if (evt.which) str = String.fromCodePoint(evt.which)\n if (str.length > 0 && str.charCodeAt(0) >= 32) {\n // console.log(\"Typed \", str);\n // prevent space from scrolling\n if (evt.which === 32) evt.preventDefault()\n sendStrMsg(str)\n }\n })\n\n // ctrl-letter codes are sent as simple low ASCII codes\n for (let i = 1; i <= 26; i++) {\n bind('ctrl+' + String.fromCharCode(96 + i), String.fromCharCode(i))\n }\n /* eslint-disable */\n bind('ctrl+]', '\\x1b') // alternate way to enter ESC\n bind('ctrl+\\\\', '\\x1c')\n bind('ctrl+[', '\\x1d')\n bind('ctrl+^', '\\x1e')\n bind('ctrl+_', '\\x1f')\n\n // extra ctrl-\n bind('ctrl+left', '\\x1f[1;5D')\n bind('ctrl+right', '\\x1f[1;5C')\n bind('ctrl+up', '\\x1f[1;5A')\n bind('ctrl+down', '\\x1f[1;5B')\n bind('ctrl+home', '\\x1f[1;5H')\n bind('ctrl+end', '\\x1f[1;5F')\n\n // extra shift-\n bind('shift+left', '\\x1f[1;2D')\n bind('shift+right', '\\x1f[1;2C')\n bind('shift+up', '\\x1f[1;2A')\n bind('shift+down', '\\x1f[1;2B')\n bind('shift+home', '\\x1f[1;2H')\n bind('shift+end', '\\x1f[1;2F')\n\n // macOS editing commands\n bind('⌥+left', '\\x1bb') // ⌥← to go back a word (^[b)\n bind('⌥+right', '\\x1bf') // ⌥→ to go forward one word (^[f)\n bind('⌘+left', '\\x01') // ⌘← to go to the beginning of a line (^A)\n bind('⌘+right', '\\x05') // ⌘→ to go to the end of a line (^E)\n bind('⌥+backspace', '\\x17') // ⌥⌫ to delete a word (^W)\n bind('⌘+backspace', '\\x15') // ⌘⌫ to delete to the beginning of a line (^U)\n /* eslint-enable */\n\n bindFnKeys(allFn)\n }\n\n // mouse button states\n let mb1 = 0\n let mb2 = 0\n let mb3 = 0\n\n /** Init the Input module */\n function init (opts) {\n initKeys(opts)\n\n // Button presses\n $('#action-buttons button').forEach(s => {\n s.addEventListener('click', function (evt) {\n sendBtnMsg(+this.dataset['n'])\n })\n })\n\n // global mouse state tracking - for motion reporting\n window.addEventListener('mousedown', evt => {\n if (evt.button === 0) mb1 = 1\n if (evt.button === 1) mb2 = 1\n if (evt.button === 2) mb3 = 1\n })\n\n window.addEventListener('mouseup', evt => {\n if (evt.button === 0) mb1 = 0\n if (evt.button === 1) mb2 = 0\n if (evt.button === 2) mb3 = 0\n })\n }\n\n /** Prepare modifiers byte for mouse message */\n function packModifiersForMouse () {\n return (key.isModifier('ctrl') ? 1 : 0) |\n (key.isModifier('shift') ? 2 : 0) |\n (key.isModifier('alt') ? 4 : 0) |\n (key.isModifier('meta') ? 8 : 0)\n }\n\n return {\n /** Init the Input module */\n init,\n\n /** Send a literal string message */\n sendString: sendStrMsg,\n\n /** Enable alternate key modes (cursors, numpad, fn) */\n setAlts: function (cu, np, fn, crlf) {\n if (cfg.cu_alt !== cu || cfg.np_alt !== np || cfg.fn_alt !== fn || cfg.crlf_mode !== crlf) {\n cfg.cu_alt = cu\n cfg.np_alt = np\n cfg.fn_alt = fn\n cfg.crlf_mode = crlf\n\n // rebind keys - codes have changed\n bindFnKeys()\n }\n },\n\n setMouseMode (click, move) {\n cfg.mt_click = click\n cfg.mt_move = move\n },\n\n // Mouse events\n onMouseMove (x, y) {\n if (!cfg.mt_move) return\n const b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0\n const m = packModifiersForMouse()\n conn.send('m' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n },\n\n onMouseDown (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseUp (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('r' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseWheel (x, y, dir) {\n if (!cfg.mt_click) return\n // -1 ... btn 4 (away from user)\n // +1 ... btn 5 (towards user)\n const m = packModifiersForMouse()\n const b = (dir < 0 ? 4 : 5)\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n /**\n * Prevent capturing keys. This is used for text input\n * modals on the terminal screen\n */\n blockKeys (yes) {\n cfg.no_keys = yes\n }\n }\n}\n","// Some non-bold Fraktur symbols are outside the contiguous block\nconst frakturExceptions = {\n 'C': '\\u212d',\n 'H': '\\u210c',\n 'I': '\\u2111',\n 'R': '\\u211c',\n 'Z': '\\u2128'\n}\n\n// constants for decoding the update blob\nconst SEQ_REPEAT = 2\nconst SEQ_SET_COLORS = 3\nconst SEQ_SET_ATTRS = 4\nconst SEQ_SET_FG = 5\nconst SEQ_SET_BG = 6\n\nconst SELECTION_BG = '#b2d7fe'\nconst SELECTION_FG = '#333'\n\nconst themes = [\n [ // Tango\n '#111213', '#CC0000', '#4E9A06', '#C4A000', '#3465A4', '#75507B', '#06989A', '#D3D7CF',\n '#555753', '#EF2929', '#8AE234', '#FCE94F', '#729FCF', '#AD7FA8', '#34E2E2', '#EEEEEC'\n ],\n [ // Linux\n '#000000', '#aa0000', '#00aa00', '#aa5500', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa',\n '#555555', '#ff5555', '#55ff55', '#ffff55', '#5555ff', '#ff55ff', '#55ffff', '#ffffff'\n ],\n [ // xterm\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5',\n '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // rxvt\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000cd', '#cd00cd', '#00cdcd', '#faebd7',\n '#404040', '#ff0000', '#00ff00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // Ambience\n '#2e3436', '#cc0000', '#4e9a06', '#c4a000', '#3465a4', '#75507b', '#06989a', '#d3d7cf',\n '#555753', '#ef2929', '#8ae234', '#fce94f', '#729fcf', '#ad7fa8', '#34e2e2', '#eeeeec'\n ],\n [ // Solarized\n '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5',\n '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3'\n ]\n]\n\n// TODO move this to the initializer so it's not run on non-terminal pages\n\n// 256color lookup table\n// should not be used to look up 0-15 (will return transparent)\nconst colorTable256 = new Array(16).fill('rgba(0, 0, 0, 0)')\n\n// fill color table\n// colors 16-231 are a 6x6x6 color cube\nfor (let red = 0; red < 6; red++) {\n for (let green = 0; green < 6; green++) {\n for (let blue = 0; blue < 6; blue++) {\n let redValue = red * 40 + (red ? 55 : 0)\n let greenValue = green * 40 + (green ? 55 : 0)\n let blueValue = blue * 40 + (blue ? 55 : 0)\n colorTable256.push(`rgb(${redValue}, ${greenValue}, ${blueValue})`)\n }\n }\n}\n// colors 232-255 are a grayscale ramp, sans black and white\nfor (let gray = 0; gray < 24; gray++) {\n let value = gray * 10 + 8\n colorTable256.push(`rgb(${value}, ${value}, ${value})`)\n}\n\nwindow.TermScreen = class TermScreen {\n constructor () {\n this.canvas = mk('canvas')\n this.ctx = this.canvas.getContext('2d')\n\n if ('AudioContext' in window || 'webkitAudioContext' in window) {\n this.audioCtx = new (window.AudioContext || window.webkitAudioContext)()\n } else {\n console.warn('No AudioContext!')\n }\n\n // dummy\n this.input = new Proxy({}, {\n get () {\n return () => console.warn('TermScreen#input not set!')\n }\n })\n\n this.cursor = {\n x: 0,\n y: 0,\n blinkOn: false,\n blinking: true,\n visible: true,\n hanging: false,\n style: 'block',\n blinkInterval: null\n }\n\n this._palette = null\n\n this._window = {\n width: 0,\n height: 0,\n devicePixelRatio: 1,\n fontFamily: '\"DejaVu Sans Mono\", \"Liberation Mono\", \"Inconsolata\", \"Menlo\", monospace',\n fontSize: 20,\n gridScaleX: 1.0,\n gridScaleY: 1.2,\n blinkStyleOn: true,\n blinkInterval: null,\n fitIntoWidth: 0,\n fitIntoHeight: 0,\n debug: false,\n graphics: 0\n }\n\n // scaling caused by fitIntoWidth/fitIntoHeight\n this._windowScale = 1\n\n // properties of this.window that require updating size and redrawing\n this.windowState = {\n width: 0,\n height: 0,\n devicePixelRatio: 0,\n gridScaleX: 0,\n gridScaleY: 0,\n fontFamily: '',\n fontSize: 0,\n fitIntoWidth: 0,\n fitIntoHeight: 0\n }\n\n // current selection\n this.selection = {\n // when false, this will prevent selection in favor of mouse events,\n // though alt can be held to override it\n selectable: true,\n\n // selection start and end (x, y) tuples\n start: [0, 0],\n end: [0, 0]\n }\n\n // mouse features\n this.mouseMode = { clicks: false, movement: false }\n\n // event listeners\n this._listeners = {}\n\n // make writing to window update size and draw\n const self = this\n this.window = new Proxy(this._window, {\n set (target, key, value, receiver) {\n target[key] = value\n self.scheduleSizeUpdate()\n self.scheduleDraw(`window:${key}=${value}`)\n return true\n }\n })\n\n this.bracketedPaste = false\n this.blinkingCellCount = 0\n\n this.screen = []\n this.screenFG = []\n this.screenBG = []\n this.screenAttrs = []\n\n // used to determine if a cell should be redrawn; storing the current state\n // as it is on screen\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n this.drawnCursor = [-1, -1, '']\n\n // start blink timers\n this.resetBlink()\n this.resetCursorBlink()\n\n let selecting = false\n\n let selectStart = (x, y) => {\n if (selecting) return\n selecting = true\n this.selection.start = this.selection.end = this.screenToGrid(x, y, true)\n this.scheduleDraw('select-start')\n }\n\n let selectMove = (x, y) => {\n if (!selecting) return\n this.selection.end = this.screenToGrid(x, y, true)\n this.scheduleDraw('select-move')\n }\n\n let selectEnd = (x, y) => {\n if (!selecting) return\n selecting = false\n this.selection.end = this.screenToGrid(x, y, true)\n this.scheduleDraw('select-end')\n Object.assign(this.selection, this.getNormalizedSelection())\n }\n\n // bind event listeners\n\n this.canvas.addEventListener('mousedown', e => {\n if ((this.selection.selectable || e.altKey) && e.button === 0) {\n selectStart(e.offsetX, e.offsetY)\n } else {\n this.input.onMouseDown(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n window.addEventListener('mousemove', e => {\n selectMove(e.offsetX, e.offsetY)\n })\n\n window.addEventListener('mouseup', e => {\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // touch event listeners\n\n let touchPosition = null\n let touchDownTime = 0\n let touchSelectMinTime = 500\n let touchDidMove = false\n\n let getTouchPositionOffset = touch => {\n let rect = this.canvas.getBoundingClientRect()\n return [touch.clientX - rect.left, touch.clientY - rect.top]\n }\n\n this.canvas.addEventListener('touchstart', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n touchDidMove = false\n touchDownTime = Date.now()\n })\n\n this.canvas.addEventListener('touchmove', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n\n if (!selecting && touchDidMove === false) {\n if (touchDownTime < Date.now() - touchSelectMinTime) {\n selectStart(...touchPosition)\n }\n } else if (selecting) {\n e.preventDefault()\n selectMove(...touchPosition)\n }\n\n touchDidMove = true\n })\n\n this.canvas.addEventListener('touchend', e => {\n if (e.touches[0]) {\n touchPosition = getTouchPositionOffset(e.touches[0])\n }\n\n if (selecting) {\n e.preventDefault()\n selectEnd(...touchPosition)\n\n // selection ended; show touch select menu\n let touchSelectMenu = qs('#touch-select-menu')\n touchSelectMenu.classList.add('open')\n let rect = touchSelectMenu.getBoundingClientRect()\n\n // use middle position for x and one line above for y\n let selectionPos = this.gridToScreen(\n (this.selection.start[0] + this.selection.end[0]) / 2,\n this.selection.start[1] - 1\n )\n selectionPos[0] -= rect.width / 2\n selectionPos[1] -= rect.height / 2\n touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${\n selectionPos[1]}px)`\n }\n\n if (!touchDidMove) {\n this.emit('tap', Object.assign(e, {\n x: touchPosition[0],\n y: touchPosition[1]\n }))\n }\n\n touchPosition = null\n })\n\n this.on('tap', e => {\n if (this.selection.start[0] !== this.selection.end[0] ||\n this.selection.start[1] !== this.selection.end[1]) {\n // selection is not empty\n // reset selection\n this.selection.start = this.selection.end = [0, 0]\n qs('#touch-select-menu').classList.remove('open')\n this.scheduleDraw('select-reset')\n } else {\n e.preventDefault()\n this.emit('open-soft-keyboard')\n }\n })\n\n $.ready(() => {\n let copyButton = qs('#touch-select-copy-btn')\n if (copyButton) {\n copyButton.addEventListener('click', () => {\n this.copySelectionToClipboard()\n })\n }\n })\n\n this.canvas.addEventListener('mousemove', e => {\n if (!selecting) {\n this.input.onMouseMove(...this.screenToGrid(e.offsetX, e.offsetY))\n }\n })\n\n this.canvas.addEventListener('mouseup', e => {\n if (!selecting) {\n this.input.onMouseUp(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n this.canvas.addEventListener('wheel', e => {\n if (this.mouseMode.clicks) {\n this.input.onMouseWheel(...this.screenToGrid(e.offsetX, e.offsetY),\n e.deltaY > 0 ? 1 : -1)\n\n // prevent page scrolling\n e.preventDefault()\n }\n })\n\n this.canvas.addEventListener('contextmenu', e => {\n if (this.mouseMode.clicks) {\n // prevent mouse keys getting stuck\n e.preventDefault()\n }\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // bind ctrl+shift+c to copy\n key('⌃+⇧+c', e => {\n e.preventDefault()\n this.copySelectionToClipboard()\n })\n }\n\n /**\n * Bind an event listener to an event\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n on (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener })\n }\n\n /**\n * Bind an event listener to be run only once the next time the event fires\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n once (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener, once: true })\n }\n\n /**\n * Remove an event listener\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n off (event, listener) {\n let listeners = this._listeners[event]\n if (listeners) {\n for (let i in listeners) {\n if (listeners[i].listener === listener) {\n listeners.splice(i, 1)\n break\n }\n }\n }\n }\n\n /**\n * Emits an event\n * @param {string} event - the event name\n * @param {...any} args - arguments passed to all listeners\n */\n emit (event, ...args) {\n let listeners = this._listeners[event]\n if (listeners) {\n let remove = []\n for (let listener of listeners) {\n try {\n listener.listener(...args)\n if (listener.once) remove.push(listener)\n } catch (err) {\n console.error(err)\n }\n }\n\n // this needs to be done in this roundabout way because for loops\n // do not like arrays with changing lengths\n for (let listener of remove) {\n listeners.splice(listeners.indexOf(listener), 1)\n }\n }\n }\n\n /**\n * The color palette. Should define 16 colors in an array.\n * @type {number[]}\n */\n get palette () {\n return this._palette || themes[0]\n }\n /** @type {number[]} */\n set palette (palette) {\n if (this._palette !== palette) {\n this._palette = palette\n this.scheduleDraw('palette')\n }\n }\n\n /**\n * Returns the specified color. If `i` is in the palette, it will return the\n * palette color. If `i` is between 16 and 255, it will return the 256color\n * value. If `i` is larger than 255, it will return an RGB color value. If `i`\n * is -1 (foreground) or -2 (background), it will return the selection colors.\n * @param {number} i - the color\n * @returns {string} the CSS color\n */\n getColor (i) {\n // return palette color if it exists\n if (this.palette[i]) return this.palette[i]\n\n // -1 for selection foreground, -2 for selection background\n if (i === -1) return SELECTION_FG\n if (i === -2) return SELECTION_BG\n\n // 256 color\n if (i > 15 && i < 256) return colorTable256[i]\n\n // true color, encoded as (hex) + 256 (such that #000 == 256)\n if (i > 255) {\n i -= 256\n let red = (i >> 16) & 0xFF\n let green = (i >> 8) & 0xFF\n let blue = i & 0xFF\n return `rgb(${red}, ${green}, ${blue})`\n }\n\n // default to transparent\n return 'rgba(0, 0, 0, 0)'\n }\n\n /**\n * Schedule a size update in the next millisecond\n */\n scheduleSizeUpdate () {\n clearTimeout(this._scheduledSizeUpdate)\n this._scheduledSizeUpdate = setTimeout(() => this.updateSize(), 1)\n }\n\n /**\n * Schedule a draw in the next millisecond\n * @param {string} why - the reason why the draw occured (for debugging)\n * @param {number} [aggregateTime] - time to wait for more scheduleDraw calls\n * to occur. 1 ms by default.\n */\n scheduleDraw (why, aggregateTime = 1) {\n clearTimeout(this._scheduledDraw)\n this._scheduledDraw = setTimeout(() => this.draw(why), aggregateTime)\n }\n\n /**\n * Returns a CSS font string with this TermScreen's font settings and the\n * font modifiers.\n * @param {Object} modifiers\n * @param {string} [modifiers.style] - the font style\n * @param {string} [modifiers.weight] - the font weight\n * @returns {string} a CSS font string\n */\n getFont (modifiers = {}) {\n let fontStyle = modifiers.style || 'normal'\n let fontWeight = modifiers.weight || 'normal'\n return `${fontStyle} normal ${fontWeight} ${this.window.fontSize}px ${this.window.fontFamily}`\n }\n\n /**\n * The character size, used for calculating the cell size. The space character\n * is used for measuring.\n * @returns {Object} the character size with `width` and `height` in pixels\n */\n getCharSize () {\n this.ctx.font = this.getFont()\n\n return {\n width: Math.floor(this.ctx.measureText(' ').width),\n height: this.window.fontSize\n }\n }\n\n /**\n * The cell size, which is the character size multiplied by the grid scale.\n * @returns {Object} the cell size with `width` and `height` in pixels\n */\n getCellSize () {\n let charSize = this.getCharSize()\n\n return {\n width: Math.ceil(charSize.width * this.window.gridScaleX),\n height: Math.ceil(charSize.height * this.window.gridScaleY)\n }\n }\n\n /**\n * Updates the canvas size if it changed\n */\n updateSize () {\n // see below (this is just updating it)\n this._window.devicePixelRatio = Math.round(this._windowScale * (window.devicePixelRatio || 1) * 2) / 2\n\n let didChange = false\n for (let key in this.windowState) {\n if (this.windowState.hasOwnProperty(key) && this.windowState[key] !== this.window[key]) {\n didChange = true\n this.windowState[key] = this.window[key]\n }\n }\n\n if (didChange) {\n const {\n width,\n height,\n gridScaleX,\n gridScaleY,\n fitIntoWidth,\n fitIntoHeight\n } = this.window\n const cellSize = this.getCellSize()\n\n // real height of the canvas element in pixels\n let realWidth = width * cellSize.width\n let realHeight = height * cellSize.height\n\n if (fitIntoWidth && fitIntoHeight) {\n let terminalAspect = realWidth / realHeight\n let fitAspect = fitIntoWidth / fitIntoHeight\n\n if (terminalAspect < fitAspect) {\n // align heights\n realHeight = fitIntoHeight\n realWidth = realHeight * terminalAspect\n } else {\n // align widths\n realWidth = fitIntoWidth\n realHeight = realWidth / terminalAspect\n }\n } else if (fitIntoWidth) {\n realHeight = fitIntoWidth / (realWidth / realHeight)\n realWidth = fitIntoWidth\n } else if (fitIntoHeight) {\n realWidth = fitIntoHeight * (realWidth / realHeight)\n realHeight = fitIntoHeight\n }\n\n // store new window scale\n this._windowScale = realWidth / (width * cellSize.width)\n\n // the DPR must be rounded to a very nice value to prevent gaps between cells\n let devicePixelRatio = this._window.devicePixelRatio = Math.round(this._windowScale * (window.devicePixelRatio || 1) * 2) / 2\n\n this.canvas.width = width * devicePixelRatio * cellSize.width\n this.canvas.style.width = `${realWidth}px`\n this.canvas.height = height * devicePixelRatio * cellSize.height\n this.canvas.style.height = `${realHeight}px`\n\n // the screen has been cleared (by changing canvas width)\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n\n // draw immediately; the canvas shouldn't flash\n this.draw('init')\n }\n }\n\n /**\n * Resets the cursor blink to on and restarts the timer\n */\n resetCursorBlink () {\n this.cursor.blinkOn = true\n clearInterval(this.cursor.blinkInterval)\n this.cursor.blinkInterval = setInterval(() => {\n this.cursor.blinkOn = this.cursor.blinking\n ? !this.cursor.blinkOn\n : true\n if (this.cursor.blinking) this.scheduleDraw('cursor-blink')\n }, 500)\n }\n\n /**\n * Resets the blink style to on and restarts the timer\n */\n resetBlink () {\n this.window.blinkStyleOn = true\n clearInterval(this.window.blinkInterval)\n let intervals = 0\n this.window.blinkInterval = setInterval(() => {\n if (this.blinkingCellCount <= 0) return\n\n intervals++\n if (intervals >= 4 && this.window.blinkStyleOn) {\n this.window.blinkStyleOn = false\n intervals = 0\n } else if (intervals >= 1 && !this.window.blinkStyleOn) {\n this.window.blinkStyleOn = true\n intervals = 0\n }\n }, 200)\n }\n\n /**\n * Returns a normalized version of the current selection, such that `start`\n * is always before `end`.\n * @returns {Object} the normalized selection, with `start` and `end`\n */\n getNormalizedSelection () {\n let { start, end } = this.selection\n // if the start line is after the end line, or if they're both on the same\n // line but the start column comes after the end column, swap\n if (start[1] > end[1] || (start[1] === end[1] && start[0] > end[0])) {\n [start, end] = [end, start]\n }\n return { start, end }\n }\n\n /**\n * Returns whether or not a given cell is in the current selection.\n * @param {number} col - the column (x)\n * @param {number} line - the line (y)\n * @returns {boolean}\n */\n isInSelection (col, line) {\n let { start, end } = this.getNormalizedSelection()\n let colAfterStart = start[0] <= col\n let colBeforeEnd = col < end[0]\n let onStartLine = line === start[1]\n let onEndLine = line === end[1]\n\n if (onStartLine && onEndLine) return colAfterStart && colBeforeEnd\n else if (onStartLine) return colAfterStart\n else if (onEndLine) return colBeforeEnd\n else return start[1] < line && line < end[1]\n }\n\n /**\n * Sweeps for selected cells and joins them in a multiline string.\n * @returns {string} the selection\n */\n getSelectedText () {\n const screenLength = this.window.width * this.window.height\n let lines = []\n let previousLineIndex = -1\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % this.window.width\n let y = Math.floor(cell / this.window.width)\n\n if (this.isInSelection(x, y)) {\n if (previousLineIndex !== y) {\n previousLineIndex = y\n lines.push('')\n }\n lines[lines.length - 1] += this.screen[cell]\n }\n }\n\n return lines.join('\\n')\n }\n\n /**\n * Copies the selection to clipboard and creates a notification balloon.\n */\n copySelectionToClipboard () {\n let selectedText = this.getSelectedText()\n // don't copy anything if nothing is selected\n if (!selectedText) return\n let textarea = mk('textarea')\n document.body.appendChild(textarea)\n textarea.value = selectedText\n textarea.select()\n if (document.execCommand('copy')) {\n Notify.show('Copied to clipboard')\n } else {\n Notify.show('Failed to copy')\n }\n document.body.removeChild(textarea)\n }\n\n /**\n * Converts screen coordinates to grid coordinates.\n * @param {number} x - x in pixels\n * @param {number} y - y in pixels\n * @param {boolean} rounded - whether to round the coord, used for select highlighting\n * @returns {number[]} a tuple of (x, y) in cells\n */\n screenToGrid (x, y, rounded = false) {\n let cellSize = this.getCellSize()\n\n return [\n Math.floor((x + (rounded ? cellSize.width / 2 : 0)) / cellSize.width),\n Math.floor(y / cellSize.height)\n ]\n }\n\n /**\n * Converts grid coordinates to screen coordinates.\n * @param {number} x - x in cells\n * @param {number} y - y in cells\n * @param {boolean} [withScale] - when true, will apply window scale\n * @returns {number[]} a tuple of (x, y) in pixels\n */\n gridToScreen (x, y, withScale = false) {\n let cellSize = this.getCellSize()\n\n return [x * cellSize.width, y * cellSize.height].map(v => withScale ? v * this._windowScale : v)\n }\n\n /**\n * Draws a cell's background with the given parameters.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {number} options.bg - the background color\n */\n drawCellBackground ({ x, y, cellWidth, cellHeight, bg }) {\n const ctx = this.ctx\n ctx.fillStyle = this.getColor(bg)\n ctx.clearRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n\n /**\n * Draws a cell's character with the given parameters. Won't do anything if\n * text is an empty string.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {Object} options.charSize - the character size, an object with\n * `width` and `height` in pixels\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {string} options.text - the cell content\n * @param {number} options.fg - the foreground color\n * @param {number} options.attrs - the cell's attributes\n */\n drawCell ({ x, y, charSize, cellWidth, cellHeight, text, fg, attrs }) {\n if (!text) return\n\n const ctx = this.ctx\n\n let underline = false\n let strike = false\n let overline = false\n if (attrs & (1 << 1)) ctx.globalAlpha = 0.5\n if (attrs & (1 << 3)) underline = true\n if (attrs & (1 << 5)) text = TermScreen.alphaToFraktur(text)\n if (attrs & (1 << 6)) strike = true\n if (attrs & (1 << 7)) overline = true\n\n ctx.fillStyle = this.getColor(fg)\n ctx.fillText(text, (x + 0.5) * cellWidth, (y + 0.5) * cellHeight)\n\n if (underline || strike || overline) {\n ctx.strokeStyle = this.getColor(fg)\n ctx.lineWidth = 1\n ctx.lineCap = 'round'\n ctx.beginPath()\n\n if (underline) {\n let lineY = Math.round(y * cellHeight + charSize.height) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (strike) {\n let lineY = Math.round((y + 0.5) * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (overline) {\n let lineY = Math.round(y * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n ctx.stroke()\n }\n\n ctx.globalAlpha = 1\n }\n\n /**\n * Returns all adjacent cell indices given a radius.\n * @param {number} cell - the center cell index\n * @param {number} [radius] - the radius. 1 by default\n * @returns {number[]} an array of cell indices\n */\n getAdjacentCells (cell, radius = 1) {\n const { width, height } = this.window\n const screenLength = width * height\n\n let cells = []\n\n for (let x = -radius; x <= radius; x++) {\n for (let y = -radius; y <= radius; y++) {\n if (x === 0 && y === 0) continue\n cells.push(cell + x + y * width)\n }\n }\n\n return cells.filter(cell => cell >= 0 && cell < screenLength)\n }\n\n /**\n * Updates the screen.\n * @param {string} why - the draw reason (for debugging)\n */\n draw (why) {\n const ctx = this.ctx\n const {\n width,\n height,\n devicePixelRatio,\n gridScaleX,\n gridScaleY\n } = this.window\n\n const charSize = this.getCharSize()\n const { width: cellWidth, height: cellHeight } = this.getCellSize()\n const screenWidth = width * cellWidth\n const screenHeight = height * cellHeight\n const screenLength = width * height\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n\n if (this.window.debug && this._debug) this._debug.drawStart(why)\n\n ctx.font = this.getFont()\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n\n // bits in the attr value that affect the font\n const FONT_MASK = 0b101\n\n // Map of (attrs & FONT_MASK) -> Array of cell indices\n let fontGroups = new Map()\n\n // Map of (cell index) -> boolean, whether or not a cell has updated\n let updateMap = new Map()\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % width\n let y = Math.floor(cell / width)\n let isCursor = !this.cursor.hanging &&\n this.cursor.x === x &&\n this.cursor.y === y &&\n this.cursor.blinkOn &&\n this.cursor.visible\n\n let wasCursor = x === this.drawnCursor[0] && y === this.drawnCursor[1]\n\n let inSelection = this.isInSelection(x, y)\n\n let text = this.screen[cell]\n let fg = this.screenFG[cell]\n let bg = this.screenBG[cell]\n let attrs = this.screenAttrs[cell]\n\n if (attrs & (1 << 4) && !this.window.blinkStyleOn) {\n // blinking is enabled and blink style is off\n // set text to nothing so drawCell doesn't draw anything\n text = ''\n }\n\n if (inSelection) {\n fg = -1\n bg = -2\n }\n\n let didUpdate = text !== this.drawnScreen[cell] ||\n fg !== this.drawnScreenFG[cell] ||\n bg !== this.drawnScreenBG[cell] ||\n attrs !== this.drawnScreenAttrs[cell] ||\n isCursor !== wasCursor ||\n (isCursor && this.cursor.style !== this.drawnCursor[2])\n\n let font = attrs & FONT_MASK\n if (!fontGroups.has(font)) fontGroups.set(font, [])\n\n fontGroups.get(font).push([cell, x, y, text, fg, bg, attrs, isCursor, inSelection])\n updateMap.set(cell, didUpdate)\n }\n\n // Map of (cell index) -> boolean, whether or not a cell should be redrawn\n const redrawMap = new Map()\n\n let isTextWide = text =>\n text !== ' ' && ctx.measureText(text).width >= (cellWidth + 0.05)\n\n // decide for each cell if it should be redrawn\n let updateRedrawMapAt = cell => {\n let shouldUpdate = updateMap.get(cell) || redrawMap.get(cell)\n\n // TODO: fonts (necessary?)\n let text = this.screen[cell]\n let isWideCell = isTextWide(text)\n let checkRadius = isWideCell ? 2 : 1\n\n if (!shouldUpdate) {\n // check adjacent cells\n let adjacentDidUpdate = false\n\n for (let adjacentCell of this.getAdjacentCells(cell, checkRadius)) {\n if (updateMap.get(adjacentCell)) {\n adjacentDidUpdate = true\n break\n }\n }\n\n if (adjacentDidUpdate) shouldUpdate = true\n }\n\n redrawMap.set(cell, shouldUpdate)\n }\n\n for (let cell of updateMap.keys()) updateRedrawMapAt(cell)\n\n // mask to redrawing regions only\n if (this.window.graphics >= 1) {\n ctx.save()\n ctx.beginPath()\n for (let y = 0; y < height; y++) {\n let regionStart = null\n for (let x = 0; x < width; x++) {\n let cell = y * width + x\n let redrawing = redrawMap.get(cell)\n if (redrawing && regionStart === null) regionStart = x\n if (!redrawing && regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (x - regionStart) * cellWidth, cellHeight)\n regionStart = null\n }\n }\n if (regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (width - regionStart) * cellWidth, cellHeight)\n }\n }\n ctx.clip()\n }\n\n // pass 1: backgrounds\n for (let font of fontGroups.keys()) {\n for (let data of fontGroups.get(font)) {\n let [cell, x, y, text, fg, bg, attrs, isCursor] = data\n\n if (redrawMap.get(cell)) {\n this.drawCellBackground({ x, y, cellWidth, cellHeight, bg })\n }\n }\n }\n\n // pass 2: characters\n for (let font of fontGroups.keys()) {\n // set font once because in Firefox, this is a really slow action for some\n // reason\n let modifiers = {}\n if (font & 1) modifiers.weight = 'bold'\n if (font & 1 << 2) modifiers.style = 'italic'\n ctx.font = this.getFont(modifiers)\n\n for (let data of fontGroups.get(font)) {\n let [cell, x, y, text, fg, bg, attrs, isCursor, inSelection] = data\n\n if (redrawMap.get(cell)) {\n this.drawCell({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n\n this.drawnScreen[cell] = text\n this.drawnScreenFG[cell] = fg\n this.drawnScreenBG[cell] = bg\n this.drawnScreenAttrs[cell] = attrs\n\n if (isCursor) this.drawnCursor = [x, y, this.cursor.style]\n\n if (this.window.debug && this._debug) {\n // set cell flags\n let flags = 1 // always redrawn\n flags |= (+updateMap.get(cell)) << 1\n flags |= (+isTextWide(text)) << 2\n this._debug.setCell(cell, flags)\n }\n }\n\n if (isCursor && !inSelection) {\n ctx.save()\n ctx.beginPath()\n if (this.cursor.style === 'block') {\n // block\n ctx.rect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n } else if (this.cursor.style === 'bar') {\n // vertical bar\n let barWidth = 2\n ctx.rect(x * cellWidth, y * cellHeight, barWidth, cellHeight)\n } else if (this.cursor.style === 'line') {\n // underline\n let lineHeight = 2\n ctx.rect(x * cellWidth, y * cellHeight + charSize.height, cellWidth, lineHeight)\n }\n ctx.clip()\n\n // swap foreground/background\n ;[fg, bg] = [bg, fg]\n\n // HACK: ensure cursor is visible\n if (fg === bg) bg = fg === 0 ? 7 : 0\n\n this.drawCellBackground({ x, y, cellWidth, cellHeight, bg })\n this.drawCell({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n ctx.restore()\n }\n }\n }\n\n if (this.window.graphics >= 1) ctx.restore()\n\n if (this.window.debug && this._debug) this._debug.drawEnd()\n }\n\n /**\n * Parses the content of an `S` message and schedules a draw\n * @param {string} str - the message content\n */\n loadContent (str) {\n // current index\n let i = 0\n // Uncomment to capture screen content for the demo page\n // console.log(JSON.stringify(`S${str}`))\n\n // window size\n const newHeight = parse2B(str, i)\n const newWidth = parse2B(str, i + 2)\n const resized = (this.window.height !== newHeight) || (this.window.width !== newWidth)\n this.window.height = newHeight\n this.window.width = newWidth\n i += 4\n\n // cursor position\n let [cursorY, cursorX] = [parse2B(str, i), parse2B(str, i + 2)]\n i += 4\n let cursorMoved = (cursorX !== this.cursor.x || cursorY !== this.cursor.y)\n this.cursor.x = cursorX\n this.cursor.y = cursorY\n\n if (cursorMoved) {\n this.resetCursorBlink()\n this.emit('cursor-moved')\n }\n\n // attributes\n let attributes = parse3B(str, i)\n i += 3\n\n this.cursor.visible = !!(attributes & 1)\n this.cursor.hanging = !!(attributes & (1 << 1))\n\n this.input.setAlts(\n !!(attributes & (1 << 2)), // cursors alt\n !!(attributes & (1 << 3)), // numpad alt\n !!(attributes & (1 << 4)), // fn keys alt\n !!(attributes & (1 << 12)) // crlf mode\n )\n\n let trackMouseClicks = !!(attributes & (1 << 5))\n let trackMouseMovement = !!(attributes & (1 << 6))\n\n // 0 - Block blink 2 - Block steady (1 is unused)\n // 3 - Underline blink 4 - Underline steady\n // 5 - I-bar blink 6 - I-bar steady\n let cursorShape = (attributes >> 9) & 0x07\n\n // if it's not zero, decrement such that the two most significant bits\n // are the type and the least significant bit is the blink state\n if (cursorShape > 0) cursorShape--\n\n let cursorStyle = cursorShape >> 1\n let cursorBlinking = !(cursorShape & 1)\n\n if (cursorStyle === 0) this.cursor.style = 'block'\n else if (cursorStyle === 1) this.cursor.style = 'line'\n else if (cursorStyle === 2) this.cursor.style = 'bar'\n\n if (this.cursor.blinking !== cursorBlinking) {\n this.cursor.blinking = cursorBlinking\n this.resetCursorBlink()\n }\n\n this.input.setMouseMode(trackMouseClicks, trackMouseMovement)\n this.selection.selectable = !trackMouseClicks && !trackMouseMovement\n $(this.canvas).toggleClass('selectable', this.selection.selectable)\n this.mouseMode = {\n clicks: trackMouseClicks,\n movement: trackMouseMovement\n }\n\n let showButtons = !!(attributes & (1 << 7))\n let showConfigLinks = !!(attributes & (1 << 8))\n\n $('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks)\n $('#action-buttons').toggleClass('hidden', !showButtons)\n\n this.bracketedPaste = !!(attributes & (1 << 13))\n\n // content\n let fg = 7\n let bg = 0\n let attrs = 0\n let cell = 0 // cell index\n let lastChar = ' '\n let screenLength = this.window.width * this.window.height\n\n if (resized) {\n this.updateSize()\n this.blinkingCellCount = 0\n this.screen = new Array(screenLength).fill(' ')\n this.screenFG = new Array(screenLength).fill(' ')\n this.screenBG = new Array(screenLength).fill(' ')\n this.screenAttrs = new Array(screenLength).fill(' ')\n }\n\n let strArray = !undef(Array.from) ? Array.from(str) : str.split('')\n\n const MASK_LINE_ATTR = 0xC8\n const MASK_BLINK = 1 << 4\n\n let setCellContent = () => {\n // Remove blink attribute if it wouldn't have any effect\n let myAttrs = attrs\n if ((myAttrs & MASK_BLINK) !== 0 &&\n ((lastChar === ' ' && ((myAttrs & MASK_LINE_ATTR) === 0)) || // no line styles\n fg === bg // invisible text\n )\n ) {\n myAttrs ^= MASK_BLINK\n }\n // update blinking cells counter if blink state changed\n if ((this.screenAttrs[cell] & MASK_BLINK) !== (myAttrs & MASK_BLINK)) {\n if (myAttrs & MASK_BLINK) this.blinkingCellCount++\n else this.blinkingCellCount--\n }\n\n this.screen[cell] = lastChar\n this.screenFG[cell] = fg\n this.screenBG[cell] = bg\n this.screenAttrs[cell] = myAttrs\n }\n\n while (i < strArray.length && cell < screenLength) {\n let character = strArray[i++]\n let charCode = character.codePointAt(0)\n\n let data\n switch (charCode) {\n case SEQ_REPEAT:\n let count = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n for (let j = 0; j < count; j++) {\n setCellContent(cell)\n if (++cell > screenLength) break\n }\n break\n\n case SEQ_SET_COLORS:\n data = parse3B(strArray[i] + strArray[i + 1] + strArray[i + 2])\n i += 3\n fg = data & 0xFF\n bg = (data >> 8) & 0xFF\n break\n\n case SEQ_SET_ATTRS:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n attrs = data & 0xFF\n break\n\n case SEQ_SET_FG:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n fg = data & 0xFF\n break\n\n case SEQ_SET_BG:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n bg = data & 0xFF\n break\n\n default:\n if (charCode < 32) character = '\\ufffd'\n lastChar = character\n setCellContent(cell)\n cell++\n }\n }\n\n if (this.window.debug) console.log(`Blinky cells = ${this.blinkingCellCount}`)\n\n this.scheduleDraw('load', 16)\n this.emit('load')\n }\n\n /**\n * Parses the content of a `T` message and updates the screen title and button\n * labels.\n * @param {string} str - the message content\n */\n loadLabels (str) {\n let pieces = str.split('\\x01')\n qs('#screen-title').textContent = pieces[0]\n $('#action-buttons button').forEach((button, i) => {\n let label = pieces[i + 1].trim()\n // if empty string, use the \"dim\" effect and put nbsp instead to\n // stretch the button vertically\n button.innerHTML = label ? esc(label) : ' '\n button.style.opacity = label ? 1 : 0.2\n })\n }\n\n /**\n * Shows an actual notification (if possible) or a notification balloon.\n * @param {string} text - the notification content\n */\n showNotification (text) {\n console.info(`Notification: ${text}`)\n if (Notification && Notification.permission === 'granted') {\n let notification = new Notification('ESPTerm', {\n body: text\n })\n notification.addEventListener('click', () => window.focus())\n } else {\n if (Notification && Notification.permission !== 'denied') {\n Notification.requestPermission()\n } else {\n // Fallback using the built-in notification balloon\n Notify.show(text)\n }\n }\n }\n\n /**\n * Loads a message from the server, and optionally a theme.\n * @param {string} str - the message\n * @param {number} [theme] - the new theme index\n */\n load (str, theme = -1) {\n const content = str.substr(1)\n if (theme >= 0 && theme < themes.length) {\n this.palette = themes[theme]\n }\n\n switch (str[0]) {\n case 'S':\n this.loadContent(content)\n break\n\n case 'T':\n this.loadLabels(content)\n break\n\n case 'B':\n this.beep()\n break\n\n case 'G':\n this.showNotification(content)\n break\n\n default:\n console.warn(`Bad data message type; ignoring.\\n${JSON.stringify(str)}`)\n }\n }\n\n /**\n * Creates a beep sound.\n */\n beep () {\n const audioCtx = this.audioCtx\n if (!audioCtx) return\n\n // prevent screeching\n if (this._lastBeep && this._lastBeep > Date.now() - 50) return\n this._lastBeep = Date.now()\n\n let osc, gain\n\n // main beep\n osc = audioCtx.createOscillator()\n gain = audioCtx.createGain()\n osc.connect(gain)\n gain.connect(audioCtx.destination)\n gain.gain.value = 0.5\n osc.frequency.value = 750\n osc.type = 'sine'\n osc.start()\n osc.stop(audioCtx.currentTime + 0.05)\n\n // surrogate beep (making it sound like 'oops')\n osc = audioCtx.createOscillator()\n gain = audioCtx.createGain()\n osc.connect(gain)\n gain.connect(audioCtx.destination)\n gain.gain.value = 0.2\n osc.frequency.value = 400\n osc.type = 'sine'\n osc.start(audioCtx.currentTime + 0.05)\n osc.stop(audioCtx.currentTime + 0.08)\n }\n\n /**\n * Converts an alphabetic character to its fraktur variant.\n * @param {string} character - the character\n * @returns {string} the converted character\n */\n static alphaToFraktur (character) {\n if (character >= 'a' && character <= 'z') {\n character = String.fromCodePoint(0x1d51e - 0x61 + character.charCodeAt(0))\n } else if (character >= 'A' && character <= 'Z') {\n character = frakturExceptions[character] || String.fromCodePoint(\n 0x1d504 - 0x41 + character.charCodeAt(0))\n }\n return character\n }\n}\n","/** File upload utility */\nwindow.TermUpl = function (conn, input, screen) {\n let lines, // array of lines without newlines\n line_i, // current line index\n fuTout, // timeout handle for line sending\n send_delay_ms, // delay between lines (ms)\n nl_str, // newline string to use\n curLine, // current line (when using fuOil)\n inline_pos // Offset in line (for long lines)\n\n // lines longer than this are split to chunks\n // sending a super-ling string through the socket is not a good idea\n const MAX_LINE_LEN = 128\n\n function openUploadDialog () {\n updateStatus('Ready...')\n Modal.show('#fu_modal', onDialogClose)\n $('#fu_form').toggleClass('busy', false)\n input.blockKeys(true)\n }\n\n function onDialogClose () {\n console.log('Upload modal closed.')\n clearTimeout(fuTout)\n line_i = 0\n input.blockKeys(false)\n }\n\n function updateStatus (msg) {\n qs('#fu_prog').textContent = msg\n }\n\n function startUpload () {\n let v = qs('#fu_text').value\n if (!v.length) {\n fuClose()\n return\n }\n\n lines = v.split('\\n')\n line_i = 0\n inline_pos = 0 // offset in line\n send_delay_ms = qs('#fu_delay').value\n\n // sanitize - 0 causes overflows\n if (send_delay_ms < 0) {\n send_delay_ms = 0\n qs('#fu_delay').value = send_delay_ms\n }\n\n nl_str = {\n 'CR': '\\r',\n 'LF': '\\n',\n 'CRLF': '\\r\\n'\n }[qs('#fu_crlf').value]\n\n $('#fu_form').toggleClass('busy', true)\n updateStatus('Starting...')\n uploadLine()\n }\n\n function uploadLine () {\n if (!$('#fu_modal').hasClass('visible')) {\n // Modal is closed, cancel\n return\n }\n\n if (!conn.canSend()) {\n // postpone\n fuTout = setTimeout(uploadLine, 1)\n return\n }\n\n if (inline_pos === 0) {\n curLine = ''\n if (line_i === 0) {\n if (screen.bracketedPaste) {\n curLine = '\\x1b[200~'\n }\n }\n\n curLine += lines[line_i++] + nl_str\n\n if (line_i === lines.length) {\n if (screen.bracketedPaste) {\n curLine += '\\x1b[201~'\n }\n }\n }\n\n let chunk\n if ((curLine.length - inline_pos) <= MAX_LINE_LEN) {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos = 0\n } else {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos += MAX_LINE_LEN\n }\n\n if (!input.sendString(chunk)) {\n updateStatus('FAILED!')\n return\n }\n\n let pt = Math.round((line_i / lines.length) * 1000) / 10\n updateStatus(`${line_i} / ${lines.length} (${pt}%)`)\n\n if (lines.length > line_i || inline_pos > 0) {\n fuTout = setTimeout(uploadLine, send_delay_ms)\n } else {\n closeWhenReady()\n }\n }\n\n function closeWhenReady () {\n if (!conn.canSend()) {\n // stuck in XOFF still, wait to process...\n updateStatus('Waiting for Tx buffer...')\n setTimeout(closeWhenReady, 100)\n } else {\n updateStatus('Done.')\n // delay to show it\n fuClose()\n }\n }\n\n function fuClose () {\n Modal.hide('#fu_modal')\n }\n\n return {\n init: function () {\n qs('#fu_file').addEventListener('change', function (evt) {\n let reader = new FileReader()\n let file = evt.target.files[0]\n let ftype = file.type || 'application/octet-stream'\n console.log('Selected file type: ' + ftype)\n if (!ftype.match(/text\\/.*|application\\/(json|csv|.*xml.*|.*script.*|x-php)/)) {\n // Deny load of blobs like img - can crash browser and will get corrupted anyway\n if (!confirm(`This does not look like a text file: ${ftype}\\nReally load?`)) {\n qs('#fu_file').value = ''\n return\n }\n }\n reader.onload = function (e) {\n const txt = e.target.result.replace(/[\\r\\n]+/, '\\n')\n qs('#fu_text').value = txt\n }\n console.log('Loading file...')\n reader.readAsText(file)\n }, false)\n\n qs('#term-fu-open').addEventListener('click', function () {\n openUploadDialog()\n return false\n })\n\n qs('#term-fu-start').addEventListener('click', function () {\n startUpload()\n return false\n })\n\n qs('#term-fu-close').addEventListener('click', function () {\n fuClose()\n return false\n })\n }\n }\n}\n","window.attachDebugScreen = function (screen) {\n const debugCanvas = mk('canvas')\n const ctx = debugCanvas.getContext('2d')\n\n debugCanvas.style.position = 'absolute'\n // hackity hack should probably set this in CSS\n debugCanvas.style.top = '6px'\n debugCanvas.style.left = '6px'\n debugCanvas.style.pointerEvents = 'none'\n\n let addCanvas = function () {\n if (!debugCanvas.parentNode) screen.canvas.parentNode.appendChild(debugCanvas)\n }\n let removeCanvas = function () {\n if (debugCanvas.parentNode) debugCanvas.parentNode.removeChild(debugCanvas)\n }\n let updateCanvasSize = function () {\n let { width, height, devicePixelRatio } = screen.window\n let cellSize = screen.getCellSize()\n debugCanvas.width = width * cellSize.width * devicePixelRatio\n debugCanvas.height = height * cellSize.height * devicePixelRatio\n debugCanvas.style.width = `${width * cellSize.width}px`\n debugCanvas.style.height = `${height * cellSize.height}px`\n }\n\n let startTime, endTime, lastReason\n let cells = new Map()\n\n let startDrawing\n\n screen._debug = {\n drawStart (reason) {\n lastReason = reason\n startTime = Date.now()\n },\n drawEnd () {\n endTime = Date.now()\n console.log(`Draw: ${lastReason} (${(endTime - startTime)} ms) with fancy graphics: ${screen.window.graphics}`)\n startDrawing()\n },\n setCell (cell, flags) {\n cells.set(cell, [flags, Date.now()])\n }\n }\n\n let isDrawing = false\n\n let drawLoop = function () {\n if (isDrawing) requestAnimationFrame(drawLoop)\n\n let { devicePixelRatio, width, height } = screen.window\n let { width: cellWidth, height: cellHeight } = screen.getCellSize()\n let screenLength = width * height\n let now = Date.now()\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n ctx.clearRect(0, 0, width * cellWidth, height * cellHeight)\n\n let activeCells = 0\n for (let cell = 0; cell < screenLength; cell++) {\n if (!cells.has(cell) || cells.get(cell)[0] === 0) continue\n\n let [flags, timestamp] = cells.get(cell)\n let elapsedTime = (now - timestamp) / 1000\n\n if (elapsedTime > 1) continue\n\n activeCells++\n ctx.globalAlpha = 0.5 * Math.max(0, 1 - elapsedTime)\n\n let x = cell % width\n let y = Math.floor(cell / width)\n\n if (flags & 1) {\n // redrawn\n ctx.fillStyle = '#f0f'\n }\n if (flags & 2) {\n // updated\n ctx.fillStyle = '#0f0'\n }\n\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n\n if (flags & 4) {\n // wide cell\n ctx.lineWidth = 2\n ctx.strokeStyle = '#f00'\n ctx.strokeRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n }\n\n if (activeCells === 0) {\n isDrawing = false\n removeCanvas()\n }\n }\n\n startDrawing = function () {\n if (isDrawing) return\n addCanvas()\n updateCanvasSize()\n isDrawing = true\n drawLoop()\n }\n}\n","window.initSoftKeyboard = function (screen, input) {\n const keyInput = qs('#softkb-input')\n if (!keyInput) return // abort, we're not on the terminal page\n\n let keyboardOpen = false\n\n // moves the input to where the cursor is on the canvas.\n // this is because most browsers will always scroll to wherever the focused\n // input is\n let updateInputPosition = function () {\n if (!keyboardOpen) return\n\n let [x, y] = screen.gridToScreen(screen.cursor.x, screen.cursor.y, true)\n keyInput.style.transform = `translate(${x}px, ${y}px)`\n }\n\n keyInput.addEventListener('focus', () => {\n keyboardOpen = true\n updateInputPosition()\n })\n\n keyInput.addEventListener('blur', () => (keyboardOpen = false))\n\n screen.on('cursor-moved', updateInputPosition)\n\n qs('#term-kb-open').addEventListener('click', e => {\n e.preventDefault()\n keyInput.focus()\n })\n\n // Chrome for Android doesn't send proper keydown/keypress events with\n // real key values instead of 229 “Unidentified,” so here's a workaround\n // that deals with the input composition events.\n\n let lastCompositionString = ''\n let compositing = false\n\n // sends the difference between the last and the new composition string\n let sendInputDelta = function (newValue) {\n let resend = false\n if (newValue.length > lastCompositionString.length) {\n if (newValue.startsWith(lastCompositionString)) {\n // characters have been added at the end\n input.sendString(newValue.substr(lastCompositionString.length))\n } else resend = true\n } else if (newValue.length < lastCompositionString.length) {\n if (lastCompositionString.startsWith(newValue)) {\n // characters have been removed at the end\n input.sendString('\\b'.repeat(lastCompositionString.length -\n newValue.length))\n } else resend = true\n } else if (newValue !== lastCompositionString) resend = true\n\n if (resend) {\n // the entire string changed; resend everything\n input.sendString('\\b'.repeat(lastCompositionString.length) +\n newValue)\n }\n lastCompositionString = newValue\n }\n\n keyInput.addEventListener('keydown', e => {\n if (e.key === 'Unidentified') return\n\n keyInput.value = ''\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n input.sendString('\\b')\n } else if (e.key === 'Enter') {\n e.preventDefault()\n input.sendString('\\x0d')\n }\n })\n\n keyInput.addEventListener('keypress', e => {\n // prevent key duplication on iOS (because Safari *does* send proper events)\n e.stopPropagation()\n })\n\n keyInput.addEventListener('input', e => {\n e.stopPropagation()\n\n if (e.isComposing) {\n sendInputDelta(e.data)\n } else {\n if (e.inputType === 'insertCompositionText') input.sendString(e.data)\n else if (e.inputType === 'deleteContentBackward') {\n lastCompositionString = ''\n sendInputDelta('')\n } else if (e.inputType === 'insertText') {\n input.sendString(e.data)\n }\n }\n })\n\n keyInput.addEventListener('compositionstart', e => {\n lastCompositionString = ''\n compositing = true\n })\n\n keyInput.addEventListener('compositionend', e => {\n lastCompositionString = ''\n compositing = false\n keyInput.value = ''\n })\n\n screen.on('open-soft-keyboard', () => keyInput.focus())\n}\n","/** Init the terminal sub-module - called from HTML */\nwindow.termInit = function ({ labels, theme, allFn }) {\n const screen = new TermScreen()\n const conn = Conn(screen)\n const input = Input(conn)\n const termUpload = TermUpl(conn, input, screen)\n screen.input = input\n\n conn.init()\n input.init({ allFn })\n termUpload.init()\n Notify.init()\n\n window.onerror = function (errorMsg, file, line, col) {\n Notify.show(`JS ERROR!
${errorMsg}
at ${file}:${line}:${col}`, 10000, true)\n return false\n }\n\n qs('#screen').appendChild(screen.canvas)\n screen.load(labels, theme) // load labels and theme\n\n window.initSoftKeyboard(screen, input)\n if (window.attachDebugScreen) window.attachDebugScreen(screen)\n\n let isFullscreen = false\n let fitScreen = false\n let fitScreenIfNeeded = function fitScreenIfNeeded () {\n if (isFullscreen) {\n screen.window.fitIntoWidth = window.screen.width\n screen.window.fitIntoHeight = window.screen.height\n } else {\n screen.window.fitIntoWidth = fitScreen ? window.innerWidth - 20 : 0\n screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0\n }\n }\n fitScreenIfNeeded()\n window.addEventListener('resize', fitScreenIfNeeded)\n\n let toggleFitScreen = function () {\n fitScreen = !fitScreen\n const resizeButtonIcon = qs('#resize-button-icon')\n if (fitScreen) {\n resizeButtonIcon.classList.remove('icn-resize-small')\n resizeButtonIcon.classList.add('icn-resize-full')\n } else {\n resizeButtonIcon.classList.remove('icn-resize-full')\n resizeButtonIcon.classList.add('icn-resize-small')\n }\n fitScreenIfNeeded()\n }\n\n qs('#term-fit-screen').addEventListener('click', function () {\n toggleFitScreen()\n return false\n })\n\n // add fullscreen mode & button\n if (Element.prototype.requestFullscreen || Element.prototype.webkitRequestFullscreen) {\n let checkForFullscreen = function () {\n // document.fullscreenElement is not really supported yet, so here's a hack\n if (isFullscreen && (innerWidth !== window.screen.width || innerHeight !== window.screen.height)) {\n isFullscreen = false\n fitScreenIfNeeded()\n }\n }\n setInterval(checkForFullscreen, 500)\n\n // (why are the buttons anchors?)\n let button = mk('a')\n button.href = '#'\n button.addEventListener('click', e => {\n e.preventDefault()\n\n isFullscreen = true\n fitScreenIfNeeded()\n screen.updateSize()\n\n if (screen.canvas.requestFullscreen) screen.canvas.requestFullscreen()\n else screen.canvas.webkitRequestFullscreen()\n })\n let icon = mk('i')\n icon.classList.add('icn-resize-full') // TODO: less confusing icons\n button.appendChild(icon)\n let span = mk('span')\n span.textContent = 'Fullscreen'\n button.appendChild(span)\n qs('#term-nav').insertBefore(button, qs('#term-nav').firstChild)\n }\n\n // for debugging\n window.termScreen = screen\n window.conn = conn\n window.input = input\n window.termUpl = termUpload\n}\n"]} \ No newline at end of file diff --git a/js/app.d7551c3.js b/js/app.d7551c3.js deleted file mode 100644 index e14d658..0000000 --- a/js/app.d7551c3.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict';var _typeof='function'==typeof Symbol&&'symbol'==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&'function'==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?'symbol':typeof a};(function(){'use strict';function a(){var a;for(p=!0,a=0;a":'>','"':'"',"'":''',"/":'/',"`":'`',"=":'='};m.htmlEscape=function(a){return(a+'').replace(/[&<>"'`=\/]/g,function(a){return t[a]})},d.$=m})(); -'use strict';(function(a){function b(a,b){for(var c=a.length;c--;)if(a[c]===b)return c;return-1}function c(a,b){if(a.length!=b.length)return!1;for(var c=0;cj;j++)p['f'+j]=111+j;var s={16:'shiftKey',17:'ctrlKey',18:'altKey',91:'metaKey'};for(j in o)f[j]=!1;i(document,'keydown',function(a){e(a)}),i(document,'keyup',function(a){var c,d=a.keyCode,e=b(r,d);if(0<=e&&r.splice(e,1),(93==d||224==d)&&(d=91),d in n)for(c in n[d]=!1,o)o[c]==d&&(f[c]=!1)}),i(window,'focus',function(){for(j in n)n[j]=!1;for(j in o)f[j]=!1});var t=a.key;a.key=f,a.key.setScope=function(a){k=a||'all'},a.key.getScope=g,a.key.deleteScope=function(a){var b,c,d;for(b in m)for(c=m[b],d=0;di||1114111=i?a.push(i):(i-=65536,d=(i>>10)+55296,e=i%1024+56320,a.push(d,e)),(f+1==g||a.length>16384)&&(h+=b.apply(null,a),a.length=0)}return h};a?a(String,'fromCodePoint',{value:d,configurable:!0,writable:!0}):String.fromCodePoint=d}(); -'use strict';function mk(a){return document.createElement(a)}function qs(a){return document.querySelector(a)}function qsa(a){return document.querySelectorAll(a)}function bool(a){return 1===a||'1'===a||!0===a||'true'===a}function cr(a){return function(b){(10===b.which||13===b.which||32===b.which)&&a()}}function esc(a){return $.htmlEscape(a)}function undef(a){return'undefined'==typeof a}function jsp(a){try{return JSON.parse(a)}catch(a){return console.error(a),null}}function Chr(a){return String.fromCharCode(a)}function parse2B(a){var b=1=e)&&(e=2500),d=setTimeout(a.hide,e),g=!1,f=setTimeout(function(){g=!0},500)},a.hide=function(){var a=$(b);a.removeClass('visible'),e=setTimeout(function(){a.addClass('hidden')},250)},a.init=function(){c=$(b),$(document).on('click',function(){g&&a.hide(this)}),c.on('click',function(a){return a.stopImmediatePropagation(),!1}),c.on('mouseenter',function(){h(),c.removeClass('hidden').addClass('visible')})},a}(); -'use strict';$.ready(function(){$('.Row.checkbox').forEach(function(a){var b=a.querySelector('input');var c=a.querySelector('.box');$(c).toggleClass('checked',b.value);var d=function(){b.value=1-b.value,$(c).toggleClass('checked',b.value)};$(a).on('click',d).on('keypress',cr(d))}),$('.Box.mobcol,.Box.fold').forEach(function(a){var b=a.querySelector('h2');var c=function(){$(a).toggleClass('expanded')};$(b).on('click',c).on('keypress',cr(c))}),$('form').forEach(function(a){$(a).on('keypress',function(b){(10===b.keyCode||13===b.keyCode)&&b.ctrlKey&&a.submit()})}),setInterval(function(){$('.anim-dots').each(function(a){var b=$(a);var c=b.html()+'.';5===c.length&&(c='.'),b.html(c)})},1e3),$('input[type=number]').on('mousewheel',function(a){var b=$(this);var c=+b.val();isNaN(c)&&(c=1);var d=+(b.attr('step')||1);var e=+b.attr('min');var f=+b.attr('max');if(0=b)this.handler('move-cursor-'+('B'>=b?'y':'x'),('B'===b||'C'===b?1:-1)*e);else if('E'===b||'F'===b)this.handler('move-cursor-line',('E'===b?1:-1)*e);else if('G'===b)this.handler('set-cursor-x',e-1);else if('J'===b){var f=d.length?d[0]:2;2===f&&this.handler('clear')}else if('P'===b)this.handler('delete',e);else if('@'===b)this.handler('insert-blanks',e);else if('q'===b)this.handler('set-cursor-style',e);else if('m'===b){if(!d.length||0===d[0])return void this.handler('reset-style');var g=d[0];if(1===g)this.handler('add-attrs',1);else if(2===g)this.handler('add-attrs',2);else if(3===g)this.handler('add-attrs',4);else if(4===g)this.handler('add-attrs',8);else if(5===g||6===g)this.handler('add-attrs',16);else if(7===g)this.handler('add-attrs',-1);else if(9===g)this.handler('add-attrs',64);else if(20===g)this.handler('add-attrs',32);else if(30<=g&&37>=g)this.handler('set-color-fg',g%10);else if(40<=g&&47>=g)this.handler('set-color-bg',g%10);else if(39===g)this.handler('set-color-fg',7);else if(49===g)this.handler('set-color-bg',0);else if(90<=g&&98>=g)this.handler('set-color-fg',g%10+8);else if(100<=g&&108>=g)this.handler('set-color-bg',g%10+8);else if((38===g||48===g)&&5===d[1]){var h=255&(0|d[2]);38===g&&this.handler('set-color-fg',h),48===g&&this.handler('set-color-bg',h)}}else('h'===b||'l'===b)&&'?25'===c&&('h'===b?this.handler('show-cursor'):'l'===b&&this.handler('hide-cursor'))}}},{key:'write',value:function write(a){var b=!0;var c=!1;var d=void 0;try{for(var e,f=a.toString()[Symbol.iterator]();!(b=(e=f.next()).done);b=!0){var g=e.value;var h=g.codePointAt(0);27===h?this.currentSequence=1:1===this.currentSequence&&'['===g?(this.currentSequence=2,this.sequence+='['):this.currentSequence&&g.match(/[\x40-\x7e]/)?(this.parseSequence(this.sequence+g),this.currentSequence=0,this.sequence=''):1=this.height&&this.scroll()}},{key:'writeChar',value:function writeChar(a){this.screen[this.cursor.y*this.width+this.cursor.x]=[a,this.style],this.cursor.x++,this.cursor.x>=this.width&&(this.cursor.x=0,this.newLine())}},{key:'moveBack',value:function moveBack(){var a=0this.cursor.x&&(this.cursor.x=0=this.width&&(this.cursor.x=0,this.cursor.y++,this.cursor.y>=this.height&&this.scroll())}},{key:'deleteChar',value:function deleteChar(){this.moveBack(),this.screen.splice((this.cursor.y+1)*this.width,0,[' ',TERM_DEFAULT_STYLE]),this.screen.splice(this.cursor.y*this.width+this.cursor.x,1)}},{key:'deleteForward',value:function deleteForward(a){a=b(this.width,a);for(var c=0;cthis.cursor.x&&(this.cursor.x=0),0>this.cursor.y&&(this.cursor.y=0),this.cursor.x>this.width-1&&(this.cursor.x=this.width-1),this.cursor.y>this.height-1&&(this.cursor.y=this.height-1)}},{key:'handleParsed',value:function handleParsed(a){'write'===a?this.writeChar(1>=arguments.length?void 0:arguments[1]):'delete'===a?this.deleteForward(1>=arguments.length?void 0:arguments[1]):'insert-blanks'===a?this.insertBlanks(1>=arguments.length?void 0:arguments[1]):'clear'===a?this.clear():'bell'===a?this.terminal.load('B'):'back'===a?this.moveBack():'new-line'===a?this.newLine():'return'===a?this.cursor.x=0:'set-cursor'===a?(this.cursor.x=1>=arguments.length?void 0:arguments[1],this.cursor.y=2>=arguments.length?void 0:arguments[2],this.clampCursor()):'move-cursor-y'===a?(this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-x'===a?(this.cursor.x+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-line'===a?(this.cursor.x=0,this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'set-cursor-x'===a?this.cursor.x=1>=arguments.length?void 0:arguments[1]:'set-cursor-style'===a?this.cursor.style=c(0,b(6,1>=arguments.length?void 0:arguments[1])):'reset-style'===a?this.style=TERM_DEFAULT_STYLE:'add-attrs'===a?-1===(1>=arguments.length?void 0:arguments[1])?this.style=16711680&this.style|255&this.style>>8|(255&this.style)<<8:this.style|=(1>=arguments.length?void 0:arguments[1])<<16:'set-color-fg'===a?this.style=16776960&this.style|(1>=arguments.length?void 0:arguments[1]):'set-color-bg'===a?this.style=16711935&this.style|(1>=arguments.length?void 0:arguments[1])<<8:'hide-cursor'===a?this.cursor.visible=!1:'show-cursor'===a&&(this.cursor.visible=!0)}},{key:'write',value:function write(a){this.parser.write(a),this.scheduleLoad()}},{key:'serialize',value:function serialize(){var a='S';a+=encode2B(this.height)+encode2B(this.width),a+=encode2B(this.cursor.y)+encode2B(this.cursor.x);var b=+this.cursor.visible;b|=96*+this.trackMouse,b|=384,b|=this.cursor.style<<9,a+=encode3B(b);var c=null;var d=0;var e=!0;var f=!1;var g=void 0;try{for(var h,i=this.screen[Symbol.iterator]();!(e=(h=i.next()).done);e=!0){var j=h.value;var k=j[1];if(this.rainbow){var l=d%this.width;var m=Math.floor(d/this.width);k=16711680&k|getRainbowColor((l+m)/10+Date.now()/1e3),d++}if(k!==c){var n=255&k;var o=255&k>>8;var p=255&k>>16;var q=n!=(255&c);var r=o!=(255&c>>8);var s=p!=(255&c>>16);q&&r?a+='\x03'+encode3B(65535&k):q?a+='\x05'+encode2B(n):r&&(a+='\x06'+encode2B(o)),s&&(a+='\x04'+encode2B(p)),c=k}a+=j[0]}}catch(a){f=!0,g=a}finally{try{!e&&i.return&&i.return()}finally{if(f)throw g}}return a}},{key:'scheduleLoad',value:function scheduleLoad(){var a=this;clearTimeout(this._scheduledLoad),this._lastLoadf;f++)c+=b[e][f]?'\x1B[38;5;'+getRainbowColor((f+e)/10)+'m'+b[e][f]:' ';this.emit('write','\r\n\x1B[?25l');var d=function(){a.emit('write',c.substr(0,80)),c=c.substr(80),c.length?setTimeout(d,50):(a.emit('write','\r\n\x1B[?25h'),a.destroy())};d()}}]),b}(Process),"local-echo":function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;cb[h].length&&(b[h]+=' '.repeat(79-b[h].length));this.emit('write','\r\n'.repeat(b.length+1)),this.emit('write','\x1B[A'.repeat(b.length)),this.emit('write','\x1B[?25l');var d=0;var e=0;var f=function(b,c){var f=Math.abs;var g=b-d;var h=c-e;a.emit('write','\x1B['+f(g)+(0++d?3<=++e?(setTimeout(h,20),e=0):h():(f(0,b.length),a.emit('write','\x1B[m\x1B[?25h'),c())};h()})}},{key:'printText',value:function printText(){var a=0a;a++)this.emit('write','\x1B['+(8>a?'3'+a:'9'+(a-8))+'m'),this.emit('write','foreground-color'[a]+' ');this.emit('write','\r\n ');for(var c=0;16>c;c++)this.emit('write','\x1B['+(8>c?'4'+c:'10'+(c-8))+'m ');this.emit('write','\x1B[m\r\n');for(var d=0;6>d;d++){this.emit('write',' ');for(var e=0;6>e;e++){for(var f=0;6>f;f++)this.emit('write','\x1B[48;5;'+(16+36*d+6*e+f)+'m ');this.emit('write','\x1B[m')}this.emit('write','\r\n')}this.emit('write',' ');for(var b=0;24>b;b++)this.emit('write','\x1B[48;5;'+(232+b)+'m ');this.emit('write','\x1B[m\r\n\n'),this.destroy()}}]),b}(Process),ls:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a in this.emit('write','\x1B[92mList of demo commands\x1B[m\r\n'),demoshIndex)'string'!=typeof demoshIndex[a]&&this.emit('write',a+'\r\n');this.destroy()}}]),b}(Process),theme:function(a){function b(a){_classCallCheck(this,b);var c=_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).call(this));return c.shell=a,c}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){var a=0|(0>=arguments.length?void 0:arguments[0]);return!arguments.length||!Number.isFinite(a)||0>a||5=arguments.length?void 0:arguments[1])+this.input.substr(this.cursorPos),this.cursorPos++;else if('back'===a)this.input=this.input.substr(0,this.cursorPos-1)+this.input.substr(this.cursorPos),this.cursorPos--,0>this.cursorPos&&(this.cursorPos=0);else if('move-cursor-x'===a)this.cursorPos=Math.max(0,Math.min(this.input.length,this.cursorPos+(1>=arguments.length?void 0:arguments[1])));else if('delete-line'===a)this.input='',this.cursorPos=0;else if('delete-word'===a){var b=this.input.substr(0,this.cursorPos).split(' ');b.pop(),this.input=b.join(' ')+this.input.substr(this.cursorPos),this.cursorPos=b.join(' ').length}this.terminal.write(this.input),this.terminal.write('\b'.repeat(this.input.length)),this.terminal.moveForward(this.cursorPos),this.terminal.write(''),'return'===a&&(this.terminal.write('\r\n'),this.parse(this.input))}},{key:'parse',value:function parse(a){'help'===a&&(a='info'),this.run(a)}},{key:'run',value:function run(a){var b=[''];var c=!1;var d=!0;var e=!1;var f=void 0;try{for(var g,h=a.trim()[Symbol.iterator]();!(d=(g=h.next()).done);d=!0){var j=g.value;c&&j!==c?b[b.length-1]+=j:c?c=!1:'"'===j||'\''===j?c=j:j.match(/\s/)?b[b.length-1]&&b.push(''):b[b.length-1]+=j}}catch(a){e=!0,f=a}finally{try{!d&&h.return&&h.return()}finally{if(e)throw f}}var i=b.shift();i in this.index?this.spawn(i,b):(this.terminal.write('demosh: Unknown command: '+i+'\r\n'),this.prompt(!1))}},{key:'spawn',value:function spawn(a){var b=this;var c=1'+a.rssi_perc+'
').htmlAppend('
'+i+'
').htmlAppend('
'+g[a.enc]+'
'),d.on('click',function(){var a=$(this);var b=a.data('ssid');var d='';+a.data('pwd')&&(d=prompt(tr('wifi.enter_passwd').replace(':ssid:',b)),!d)||($('#sta_password').val(d),$('#sta_ssid').val(b),c(b,d,''))}),b.appendChild(f),e[0].appendChild(b)}})}}function e(){_demo?d(_demo_aps,200):$.get('http://'+_root+'/cfg/wifi/scan',d)}function f(a){setTimeout(e,a)}var g=['Open','WEP','WPA','WPA2','WPA/WPA2'];var h;a.init=function(a){$('.Row.range').forEach(function(a){var c=a.querySelector('input');var d=a.querySelector('.x-disp1');var e=a.querySelector('.x-disp2');var f=b(c);$(d).html(f),$(e).html(f),$(c).on('input',function(){f=b(c),$(d).html(f),$(e).html(f)})}),$('#forget-sta').on('click',function(){return c('','',''),!1}),c(a.sta_ssid,a.sta_password,a.sta_active_ip),h=a.sta_active_ssid},a.startScanning=function(){$('#ap-loader').removeClass('hidden'),$('#ap-scan').addClass('hidden'),$('#ap-loader .anim-dots').html('.'),e()}})(window.WiFi={}); -'use strict';window.Conn=function(a){function b(){console.log('CONNECTED'),g(),e('i')}function c(a){console.warn('SOCKET CLOSED, code '+a.code+'. Reconnecting...'),clearTimeout(n),n=setTimeout(function(){f()},2e3)}function d(b){try{switch(b.data.charAt(0)){case'.':break;case'-':l=!0,m=setTimeout(function(){l=!1},250);break;case'+':l=!1,clearTimeout(m);break;default:a.load(b.data),o||(showPage(),o=!0);}g()}catch(a){console.error(a)}}function e(a){return _demo?('undefined'==typeof demoInterface?console.log('TX: '+JSON.stringify(a)):demoInterface.input(a),!0):l?(console.log('Can\'t send, flood control.'),!1):!!i&&(1===i.readyState?('string'!=typeof a&&(a=JSON.stringify(a)),i.send(a),!0):(console.error('Socket not ready'),!1))}function f(){return window._demo?void('undefined'==typeof demoInterface?alert('Demoing non-demo demo!'):(demoInterface.init(a),showPage())):void(clearTimeout(n),clearTimeout(j),i=new WebSocket('ws://'+_root+'/term/update.ws'),i.onopen=b,i.onclose=c,i.onmessage=d,console.log('Opening socket.'),g())}function g(){clearTimeout(j),j=setTimeout(h,2e3)}function h(){console.error('Heartbeat lost, probing server...'),k=setInterval(function(){console.log('> ping'),$.get('http://'+_root+'/system/ping',function(a,b){200===b&&(clearInterval(k),console.info('Server ready, reloading page...'),location.reload())},{timeout:100})},1e3)}var i;var j;var k;var l=!1;var m;var n;var o=!1;return{ws:null,init:f,send:e,canSend:function(){return!l}}}; -'use strict';window.Input=function(a){function b(b){return a.send('s'+b)}function c(b){a.send('b'+Chr(b))}function d(a,b){return l.fn_alt?a:b}function e(a,b){return l.cu_alt?a:b}function f(a,b){return l.np_alt?a:b}function g(a){var b={tab:'\t',backspace:'\b',enter:l.crlf_mode?'\r\n':'\r',"ctrl+enter":'\n',esc:'\x1B',up:e('\x1BOA','\x1B[A'),down:e('\x1BOB','\x1B[B'),right:e('\x1BOC','\x1B[C'),left:e('\x1BOD','\x1B[D'),home:e('\x1BOH',d('\x1B[H','\x1B[1~')),insert:'\x1B[2~',delete:'\x1B[3~',end:e('\x1BOF',d('\x1B[F','\x1B[4~')),pageup:'\x1B[5~',pagedown:'\x1B[6~',f1:d('\x1BOP','\x1B[11~'),f2:d('\x1BOQ','\x1B[12~'),f3:d('\x1BOR','\x1B[13~'),f4:d('\x1BOS','\x1B[14~'),f5:'\x1B[15~',f6:'\x1B[17~',f7:'\x1B[18~',f8:'\x1B[19~',f9:'\x1B[20~',f10:'\x1B[21~',f11:'\x1B[23~',f12:'\x1B[24~',"shift+f1":d('\x1BO1;2P','\x1B[25~'),"shift+f2":d('\x1BO1;2Q','\x1B[26~'),"shift+f3":d('\x1BO1;2R','\x1B[28~'),"shift+f4":d('\x1BO1;2S','\x1B[29~'),"shift+f5":d('\x1B[15;2~','\x1B[31~'),"shift+f6":d('\x1B[17;2~','\x1B[32~'),"shift+f7":d('\x1B[18;2~','\x1B[33~'),"shift+f8":d('\x1B[19;2~','\x1B[34~'),"shift+f9":d('\x1B[20;2~','\x1B[35~'),"shift+f10":d('\x1B[21;2~','\x1B[36~'),"shift+f11":d('\x1B[22;2~','\x1B[37~'),"shift+f12":d('\x1B[23;2~','\x1B[38~'),np_0:f('\x1BOp','0'),np_1:f('\x1BOq','1'),np_2:f('\x1BOr','2'),np_3:f('\x1BOs','3'),np_4:f('\x1BOt','4'),np_5:f('\x1BOu','5'),np_6:f('\x1BOv','6'),np_7:f('\x1BOw','7'),np_8:f('\x1BOx','8'),np_9:f('\x1BOy','9'),np_mul:f('\x1BOR','*'),np_add:f('\x1BOl','+'),np_sub:f('\x1BOS','-'),np_point:f('\x1BOn','.'),np_div:f('\x1BOQ','/')};var c=['f5','f11','f12','shift+f5'];for(var g in b)(a||!c.includes(g))&&b.hasOwnProperty(g)&&h(g,b[g])}function h(a,c){-1!==a.indexOf('ctrl+')&&(a+=','+a.replace('ctrl','command')),key.unbind(a),key(a,function(a){l.no_keys||(a.preventDefault(),b(c))})}function i(a){var c=String.fromCharCode;var d=a.allFn;window.addEventListener('keypress',function(a){if(!l.no_keys){var c='';a.key?c=a.key:a.which&&(c=String.fromCodePoint(a.which)),0=e;e++)h('ctrl+'+c(96+e),c(e));h('ctrl+]','\x1B'),h('ctrl+\\','\x1C'),h('ctrl+[','\x1D'),h('ctrl+^','\x1E'),h('ctrl+_','\x1F'),h('ctrl+left','\x1F[1;5D'),h('ctrl+right','\x1F[1;5C'),h('ctrl+up','\x1F[1;5A'),h('ctrl+down','\x1F[1;5B'),h('ctrl+home','\x1F[1;5H'),h('ctrl+end','\x1F[1;5F'),h('shift+left','\x1F[1;2D'),h('shift+right','\x1F[1;2C'),h('shift+up','\x1F[1;2A'),h('shift+down','\x1F[1;2B'),h('shift+home','\x1F[1;2H'),h('shift+end','\x1F[1;2F'),h('\u2325+left','\x1Bb'),h('\u2325+right','\x1Bf'),h('\u2318+left','\x01'),h('\u2318+right','\x05'),h('\u2325+backspace','\x17'),h('\u2318+backspace','\x15'),g(d)}function j(){return(key.isModifier('ctrl')?1:0)|(key.isModifier('shift')?2:0)|(key.isModifier('alt')?4:0)|(key.isModifier('meta')?8:0)}var l={np_alt:!1,cu_alt:!1,fn_alt:!1,mt_click:!1,mt_move:!1,no_keys:!1,crlf_mode:!1};var k=0;var n=0;var o=0;return{init:function(a){i(a),$('#action-buttons button').forEach(function(a){a.addEventListener('click',function(){c(+this.dataset.n)})}),window.addEventListener('mousedown',function(a){0===a.button&&(k=1),1===a.button&&(n=1),2===a.button&&(o=1)}),window.addEventListener('mouseup',function(a){0===a.button&&(k=0),1===a.button&&(n=0),2===a.button&&(o=0)})},sendString:b,setAlts:function setAlts(a,b,c,d){(l.cu_alt!==a||l.np_alt!==b||l.fn_alt!==c||l.crlf_mode!==d)&&(l.cu_alt=a,l.np_alt=b,l.fn_alt=c,l.crlf_mode=d,g())},setMouseMode:function setMouseMode(a,b){l.mt_click=a,l.mt_move=b},onMouseMove:function onMouseMove(c,d){if(l.mt_move){var e=k?1:n?2:o?3:0;var b=j();a.send('m'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseDown:function onMouseDown(c,d,e){if(l.mt_click&&!(3e)){var b=j();a.send('p'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseUp:function onMouseUp(c,d,e){if(l.mt_click&&!(3e)){var b=j();a.send('r'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseWheel:function onMouseWheel(c,d,e){if(l.mt_click){var f=j();var g=0>e?4:5;a.send('p'+encode2B(d)+encode2B(c)+encode2B(g)+encode2B(f))}},mouseTracksClicks:function mouseTracksClicks(){return l.mt_click},blockKeys:function blockKeys(a){l.no_keys=a}}}; -'use strict';var _slicedToArray=function(){function a(a,b){var c=[];var d=!0;var e=!1;var f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!(b&&c.length===b));d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h['return']&&h['return']()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError('Invalid attempt to destructure non-iterable instance')}}();var _createClass=function(){function a(a,b){for(var c=0;cred;red++)for(var green=0;6>green;green++)for(var blue=0;6>blue;blue++){var redValue=40*red+(red?55:0);var greenValue=40*green+(green?55:0);var blueValue=40*blue+(blue?55:0);colorTable256.push('rgb('+redValue+', '+greenValue+', '+blueValue+')')}for(var gray=0;24>gray;gray++){var value=10*gray+8;colorTable256.push('rgb('+value+', '+value+', '+value+')')}window.TermScreen=function(){function a(){var b=this;_classCallCheck(this,a),this.canvas=mk('canvas'),this.ctx=this.canvas.getContext('2d'),'AudioContext'in window||'webkitAudioContext'in window?this.audioCtx=new(window.AudioContext||window.webkitAudioContext):console.warn('No AudioContext!'),this.input=new Proxy({},{get:function get(){return function(){return console.warn('TermScreen#input not set!')}}}),this.cursor={x:0,y:0,blinkOn:!1,blinking:!0,visible:!0,hanging:!1,style:'block',blinkInterval:null},this._palette=null,this._window={width:0,height:0,devicePixelRatio:1,fontFamily:'"DejaVu Sans Mono", "Liberation Mono", "Inconsolata", "Menlo", monospace',fontSize:20,gridScaleX:1,gridScaleY:1.2,blinkStyleOn:!0,blinkInterval:null,fitIntoWidth:0,fitIntoHeight:0,debug:!1,graphics:0},this._windowScale=1,this.windowState={width:0,height:0,devicePixelRatio:0,gridScaleX:0,gridScaleY:0,fontFamily:'',fontSize:0,fitIntoWidth:0,fitIntoHeight:0},this.selection={selectable:!0,start:[0,0],end:[0,0]},this.mouseMode={clicks:!1,movement:!1},this._listeners={};var c=this;this.window=new Proxy(this._window,{set:function set(a,b,d){return a[b]=d,c.scheduleSizeUpdate(),c.scheduleDraw('window:'+b+'='+d),!0}}),this.bracketedPaste=!1,this.blinkingCellCount=0,this.screen=[],this.screenFG=[],this.screenBG=[],this.screenAttrs=[],this.drawnScreen=[],this.drawnScreenFG=[],this.drawnScreenBG=[],this.drawnScreenAttrs=[],this.drawnCursor=[-1,-1,''],this.resetBlink(),this.resetCursorBlink();var d=!1;var f=function(a,c){d||(d=!0,b.selection.start=b.selection.end=b.screenToGrid(a,c),b.scheduleDraw('select-start'))};var g=function(a,c){d&&(b.selection.end=b.screenToGrid(a,c),b.scheduleDraw('select-move'))};var h=function(a,c){d&&(d=!1,b.selection.end=b.screenToGrid(a,c),b.scheduleDraw('select-end'),Object.assign(b.selection,b.getNormalizedSelection()))};this.canvas.addEventListener('mousedown',function(a){if((b.selection.selectable||a.altKey)&&0===a.button)f(a.offsetX,a.offsetY);else{var c;(c=b.input).onMouseDown.apply(c,_toConsumableArray(b.screenToGrid(a.offsetX,a.offsetY)).concat([a.button+1]))}}),window.addEventListener('mousemove',function(a){g(a.offsetX,a.offsetY)}),window.addEventListener('mouseup',function(a){h(a.offsetX,a.offsetY)});var i=null;var j=0;var k=!1;var l=function(a){var c=b.canvas.getBoundingClientRect();return[a.clientX-c.left,a.clientY-c.top]};this.canvas.addEventListener('touchstart',function(a){i=l(a.touches[0]),k=!1,j=Date.now()}),this.canvas.addEventListener('touchmove',function(a){i=l(a.touches[0]),d||!1!=k?d&&(a.preventDefault(),g.apply(void 0,_toConsumableArray(i))):ja)return colorTable256[a];if(255>16;var c=255&a>>8;var d=255&a;return'rgb('+b+', '+c+', '+d+')'}return'rgba(0, 0, 0, 0)'}},{key:'scheduleSizeUpdate',value:function scheduleSizeUpdate(){var a=this;clearTimeout(this._scheduledSizeUpdate),this._scheduledSizeUpdate=setTimeout(function(){return a.updateSize()},1)}},{key:'scheduleDraw',value:function scheduleDraw(a){var b=this;var c=1=a.blinkingCellCount||(b++,4<=b&&a.window.blinkStyleOn?(a.window.blinkStyleOn=!1,b=0):1<=b&&!a.window.blinkStyleOn&&(a.window.blinkStyleOn=!0,b=0))},200)}},{key:'getNormalizedSelection',value:function getNormalizedSelection(){var a=this.selection,b=a.start,c=a.end;if(b[1]>c[1]||b[1]===c[1]&&b[0]>c[0]){var d=[c,b];b=d[0],c=d[1]}return{start:b,end:c}}},{key:'isInSelection',value:function isInSelection(a,b){var c=this.getNormalizedSelection(),d=c.start,e=c.end;var f=d[0]<=a;var g=a=m+0.05};var s=function(a){var c=p.get(a)||q.get(a);var d=b.screen[a];var e=r(d);var f=e?2:1;if(!c){var l=!1;var g=!0;var h=!1;var i=void 0;try{for(var j,k=b.getAdjacentCells(a,f)[Symbol.iterator]();!(g=(j=k.next()).done);g=!0){var m=j.value;if(p.get(m)){l=!0;break}}}catch(a){h=!0,i=a}finally{try{!g&&k.return&&k.return()}finally{if(h)throw i}}l&&(c=!0)}q.set(a,c)};var t=!0;var u=!1;var v=void 0;try{for(var w,z=p.keys()[Symbol.iterator]();!(t=(w=z.next()).done);t=!0){var xa=w.value;s(xa)}}catch(a){u=!0,v=a}finally{try{!t&&z.return&&z.return()}finally{if(u)throw v}}if(1<=this.window.graphics){d.save(),d.beginPath();for(var ya=0;ya>9;0>1;var q=!(1&o);0==p?this.cursor.style='block':1==p?this.cursor.style='line':2==p&&(this.cursor.style='bar'),this.cursor.blinking!==q&&(this.cursor.blinking=q,this.resetCursorBlink()),this.input.setMouseMode(m,n),this.selection.selectable=!n,$(this.canvas).toggleClass('selectable',!n),this.mouseMode={clicks:m,movement:n};$('.x-term-conf-btn').toggleClass('hidden',!!!(256&l)),$('#action-buttons').toggleClass('hidden',!!!(128&l)),this.bracketedPaste=!!(8192&l);var r=7;var s=0;var t=0;var u=0;var v=' ';var w=this.window.width*this.window.height;f&&(this.updateSize(),this.blinkingCellCount=0,this.screen=Array(w).fill(' '),this.screenFG=Array(w).fill(' '),this.screenBG=Array(w).fill(' '),this.screenAttrs=Array(w).fill(' '));var x=Array(256).fill(0);var y=undef(Array.from)?a.split(''):Array.from(a);var z=16;for(var C=function(){var a=t;0!=(a&z)&&(' '==v&&0==(a&200)||r==s)&&(a^=z),(b.screenAttrs[u]&z)!=(a&z)&&(a&z?b.blinkingCellCount++:b.blinkingCellCount--),x[s]++,b.screen[u]=v,b.screenFG[u]=r,b.screenBG[u]=s,b.screenAttrs[u]=a};cw));H++);break;case SEQ_SET_COLORS:F=parse3B(y[c]+y[c+1]+y[c+2]),c+=3,r=255&F,s=255&F>>8;break;case SEQ_SET_ATTRS:F=parse2B(y[c]+y[c+1]),c+=2,t=255&F;break;case SEQ_SET_FG:F=parse2B(y[c]+y[c+1]),c+=2,r=255&F;break;case SEQ_SET_BG:F=parse2B(y[c]+y[c+1]),c+=2,s=255&F;break;default:32>E&&(D='\uFFFD'),v=D,C(u),u++;}}this.window.debug&&console.log('Blinky cells = '+this.blinkingCellCount);var A=0;var B=0;for(var j=255;0<=j;j--)x[j]>A&&(A=x[j],B=j);this.canvas.style.backgroundColor=this.getColor(B),this.scheduleDraw('load',16),this.emit('load')}},{key:'loadLabels',value:function loadLabels(a){var b=a.split('\x01');qs('#screen-title').textContent=b[0],$('#action-buttons button').forEach(function(a,c){var d=b[c+1].trim();a.innerHTML=d?esc(d):' ',a.style.opacity=d?1:0.2})}},{key:'showNotification',value:function showNotification(a){if(console.info('Notification: '+a),Notification&&'granted'===Notification.permission){var b=new Notification('ESPTerm',{body:a});b.addEventListener('click',function(){return window.focus()})}else Notification&&'denied'!==Notification.permission?Notification.requestPermission():Notify.show(a)}},{key:'load',value:function load(a){var b=1Date.now()-50)){this._lastBeep=Date.now();var b,c;b=a.createOscillator(),c=a.createGain(),b.connect(c),c.connect(a.destination),c.gain.value=0.5,b.frequency.value=750,b.type='sine',b.start(),b.stop(a.currentTime+0.05),b=a.createOscillator(),c=a.createGain(),b.connect(c),c.connect(a.destination),c.gain.value=0.2,b.frequency.value=400,b.type='sine',b.start(a.currentTime+0.05),b.stop(a.currentTime+0.08)}}},{key:'palette',get:function get(){return this._palette||themes[0]},set:function set(a){this._palette!==a&&(this._palette=a,this.scheduleDraw('palette'))}}],[{key:'alphaToFraktur',value:function alphaToFraktur(a){var b=String.fromCodePoint;return'a'<=a&&'z'>=a?a=b(119997+a.charCodeAt(0)):'A'<=a&&'Z'>=a&&(a=frakturExceptions[a]||b(120003+a.charCodeAt(0))),a}}]),a}(); -'use strict';window.TermUpl=function(a,b,c){function d(){f('Ready...'),Modal.show('#fu_modal',e),$('#fu_form').toggleClass('busy',!1),b.blockKeys(!0)}function e(){console.log('Upload modal closed.'),clearTimeout(m),l=0,b.blockKeys(!1)}function f(a){qs('#fu_prog').textContent=a}function g(){var a=qs('#fu_text').value;return a.length?void(k=a.split('\n'),l=0,q=0,n=qs('#fu_delay').value,0>n&&(n=0,qs('#fu_delay').value=n),o={CR:'\r',LF:'\n',CRLF:'\r\n'}[qs('#fu_crlf').value],$('#fu_form').toggleClass('busy',!0),f('Starting...'),h()):void j()}function h(){if($('#fu_modal').hasClass('visible')){if(!a.canSend())return void(m=setTimeout(h,1));0===q&&(p='',0===l&&c.bracketedPaste&&(p='\x1B[200~'),p+=k[l++]+o,l===k.length&&c.bracketedPaste&&(p+='\x1B[201~'));var d;if(p.length-q<=r?(d=p.substr(q,r),q=0):(d=p.substr(q,r),q+=r),console.log(d),!b.sendString(d))return void f('FAILED!');var e=Math.round(1e3*(l/k.length))/10;f(l+' / '+k.length+' ('+e+'%)'),k.length>l||0g.length?a.startsWith(g)?b.sendString(a.substr(g.length)):c=!0:a.lengthJS ERROR!
'+a+'
at '+b+':'+c+':'+d,1e4,!0),!1},qs('#screen').appendChild(f.canvas),f.load(b,c),window.initSoftKeyboard(f,g),window.attachDebugScreen&&window.attachDebugScreen(f);var i=!1;var j=!1;var k=function(){i?(f.window.fitIntoWidth=window.screen.width,f.window.fitIntoHeight=window.screen.height):(f.window.fitIntoWidth=j?window.innerWidth-20:0,f.window.fitIntoHeight=j?window.innerHeight:0)};k(),window.addEventListener('resize',k);var l=function(){j=!j;var a=qs('#resize-button-icon');j?(a.classList.remove('icn-resize-small'),a.classList.add('icn-resize-full')):(a.classList.remove('icn-resize-full'),a.classList.add('icn-resize-small')),k()};if(qs('#term-fit-screen').addEventListener('click',function(){return l(),!1}),Element.prototype.requestFullscreen||Element.prototype.webkitRequestFullscreen){setInterval(function checkForFullscreen(){i&&(innerWidth!==window.screen.width||innerHeight!==window.screen.height)&&(i=!1,k())},500);var m=mk('a');m.href='#',m.addEventListener('click',function(a){a.preventDefault(),i=!0,k(),f.updateSize(),f.canvas.requestFullscreen?f.canvas.requestFullscreen():f.canvas.webkitRequestFullscreen()});var n=mk('i');n.classList.add('icn-resize-full'),m.appendChild(n);var o=mk('span');o.textContent='Fullscreen',m.appendChild(o),qs('#term-nav').insertBefore(m,qs('#term-nav').firstChild)}window.termScreen=f,window.conn=e,window.input=g,window.termUpl=h}; - -//# sourceMappingURL=app.d7551c3.js.map \ No newline at end of file diff --git a/js/app.d7551c3.js.map b/js/app.d7551c3.js.map deleted file mode 100644 index 9682f57..0000000 --- a/js/app.d7551c3.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../js/lib/chibi.js","../../js/lib/keymaster.js","../../js/lib/polyfills.js","../../js/utils.js","../../js/modal.js","../../js/notif.js","../../js/appcommon.js","../../js/demo.js","../../js/lang.js","../../js/wifi.js","../../js/term_conn.js","../../js/term_input.js","../../js/term_screen.js","../../js/term_upload.js","../../js/debug_screen.js","../../js/soft_keyboard.js","../../js/term.js"],"names":[],"mappings":"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","file":"app.d7551c3.js","sourcesContent":["/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */\n\n// MODIFIED VERSION.\n(function () {\n\t'use strict';\n\n\tvar readyfn = [],\n\t\tloadedfn = [],\n\t\tdomready = false,\n\t\tpageloaded = false,\n\t\td = document,\n\t\tw = window;\n\n\t// Fire any function calls on ready event\n\tfunction fireReady() {\n\t\tvar i;\n\t\tdomready = true;\n\t\tfor (i = 0; i < readyfn.length; i += 1) {\n\t\t\treadyfn[i]();\n\t\t}\n\t\treadyfn = [];\n\t}\n\n\t// Fire any function calls on loaded event\n\tfunction fireLoaded() {\n\t\tvar i;\n\t\tpageloaded = true;\n\t\t// For browsers with no DOM loaded support\n\t\tif (!domready) {\n\t\t\tfireReady();\n\t\t}\n\t\tfor (i = 0; i < loadedfn.length; i += 1) {\n\t\t\tloadedfn[i]();\n\t\t}\n\t\tloadedfn = [];\n\t}\n\n\t// Check DOM ready, page loaded\n\tif (d.addEventListener) {\n\t\t// Standards\n\t\td.addEventListener('DOMContentLoaded', fireReady, false);\n\t\tw.addEventListener('load', fireLoaded, false);\n\t} else if (d.attachEvent) {\n\t\t// IE\n\t\td.attachEvent('onreadystatechange', fireReady);\n\t\t// IE < 9\n\t\tw.attachEvent('onload', fireLoaded);\n\t} else {\n\t\t// Anything else\n\t\tw.onload = fireLoaded;\n\t}\n\n\t// Utility functions\n\n\t// Loop through node array\n\tfunction nodeLoop(fn, nodes) {\n\t\tvar i;\n\t\t// Good idea to walk up the DOM\n\t\tfor (i = nodes.length - 1; i >= 0; i -= 1) {\n\t\t\tfn(nodes[i]);\n\t\t}\n\t}\n\n\t// Convert to camel case\n\tfunction cssCamel(property) {\n\t\treturn property.replace(/-\\w/g, function (result) {\n\t\t\treturn result.charAt(1).toUpperCase();\n\t\t});\n\t}\n\n\t// Get computed style\n\tfunction computeStyle(elm, property) {\n\t\t// IE, everything else or null\n\t\treturn (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null;\n\n\t}\n\n\t// Returns URI encoded query string pair\n\tfunction queryPair(name, value) {\n\t\treturn encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+');\n\t}\n\n\t// Set CSS, important to wrap in try to prevent error thown on unsupported property\n\tfunction setCss(elm, property, value) {\n\t\ttry {\n\t\t\telm.style[cssCamel(property)] = value;\n\t\t} catch (e) {\n\t\t}\n\t}\n\n\t// Show CSS\n\tfunction showCss(elm) {\n\t\telm.style.display = '';\n\t\t// For elements still hidden by style block\n\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\telm.style.display = 'block';\n\t\t}\n\t}\n\n\t// Serialize form & JSON values\n\tfunction serializeData(nodes) {\n\t\tvar querystring = '', subelm, i, j;\n\t\tif (nodes.constructor === Object) { // Serialize JSON data\n\t\t\tfor (subelm in nodes) {\n\t\t\t\tif (nodes.hasOwnProperty(subelm)) {\n\t\t\t\t\tif (nodes[subelm].constructor === Array) {\n\t\t\t\t\t\tfor (i = 0; i < nodes[subelm].length; i += 1) {\n\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm][i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else { // Serialize node data\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (elm.nodeName === 'FORM') {\n\t\t\t\t\tfor (i = 0; i < elm.elements.length; i += 1) {\n\t\t\t\t\t\tsubelm = elm.elements[i];\n\n\t\t\t\t\t\tif (!subelm.disabled) {\n\t\t\t\t\t\t\tswitch (subelm.type) {\n\t\t\t\t\t\t\t\t// Ignore buttons, unsupported XHR 1 form fields\n\t\t\t\t\t\t\t\tcase 'button':\n\t\t\t\t\t\t\t\tcase 'image':\n\t\t\t\t\t\t\t\tcase 'file':\n\t\t\t\t\t\t\t\tcase 'submit':\n\t\t\t\t\t\t\t\tcase 'reset':\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-one':\n\t\t\t\t\t\t\t\t\tif (subelm.length > 0) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-multiple':\n\t\t\t\t\t\t\t\t\tfor (j = 0; j < subelm.length; j += 1) {\n\t\t\t\t\t\t\t\t\t\tif (subelm[j].selected) {\n\t\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm[j].value);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'checkbox':\n\t\t\t\t\t\t\t\tcase 'radio':\n\t\t\t\t\t\t\t\t\tif (subelm.checked) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t// Everything else including shinny new HTML5 input types\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\t// Tidy up first &\n\t\treturn (querystring.length > 0) ? querystring.substring(1) : '';\n\t}\n\n\t// Class helper\n\tfunction classHelper(classes, action, nodes) {\n\t\tvar classarray, search, i, replace, has = false;\n\t\tif (classes) {\n\t\t\t// Trim any whitespace\n\t\t\tclassarray = classes.split(/\\s+/);\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tfor (i = 0; i < classarray.length; i += 1) {\n\t\t\t\t\tvar clz = classarray[i];\n\t\t\t\t\tif (action === 'remove') {\n\t\t\t\t\t\telm.classList.remove(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'add') {\n\t\t\t\t\t\telm.classList.add(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'toggle') {\n\t\t\t\t\t\telm.classList.toggle(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'has') {\n\t\t\t\t\t\tif (elm.classList.contains(clz)) {\n\t\t\t\t\t\t\thas = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// search = new RegExp('\\\\b' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// replace = new RegExp(' *' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// if (action === 'remove') {\n\t\t\t\t\t// \telm.className = elm.className.replace(search, '');\n\t\t\t\t\t// } else if (action === 'toggle') {\n\t\t\t\t\t// \telm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i];\n\t\t\t\t\t// } else if (action === 'has') {\n\t\t\t\t\t// \tif (elm.className.match(search)) {\n\t\t\t\t\t// \t\thas = true;\n\t\t\t\t\t// \t\tbreak;\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\treturn has;\n\t}\n\n\t// HTML insertion helper\n\tfunction insertHtml(value, position, nodes) {\n\t\tvar tmpnodes, tmpnode;\n\t\tif (value) {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead\n\t\t\t\t// Convert string to node. We can't innerHTML on a document fragment\n\t\t\t\ttmpnodes = d.createElement('div');\n\t\t\t\ttmpnodes.innerHTML = value;\n\t\t\t\twhile ((tmpnode = tmpnodes.lastChild) !== null) {\n\t\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (position === 'before') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm);\n\t\t\t\t\t\t} else if (position === 'after') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm.nextSibling);\n\t\t\t\t\t\t} else if (position === 'append') {\n\t\t\t\t\t\t\telm.appendChild(tmpnode);\n\t\t\t\t\t\t} else if (position === 'prepend') {\n\t\t\t\t\t\t\telm.insertBefore(tmpnode, elm.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t}\n\n\t// Get nodes and return chibi\n\tfunction chibi(selector) {\n\t\tvar cb, nodes = [], json = false, nodelist, i;\n\n\t\tif (selector) {\n\n\t\t\t// Element node, would prefer to use (selector instanceof HTMLElement) but no IE support\n\t\t\tif (selector.nodeType && selector.nodeType === 1) {\n\t\t\t\tnodes = [selector]; // return element as node list\n\t\t\t} else if (typeof selector === 'object') {\n\t\t\t\t// JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support\n\t\t\t\tjson = (typeof selector.length !== 'number');\n\t\t\t\tnodes = selector;\n\t\t\t} else if (typeof selector === 'string') {\n\t\t\t\tnodelist = d.querySelectorAll(selector);\n\n\t\t\t\t// Convert node list to array so results have full access to array methods\n\t\t\t\t// Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway\n\t\t\t\tfor (i = 0; i < nodelist.length; i += 1) {\n\t\t\t\t\tnodes[i] = nodelist[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Only attach nodes if not JSON\n\t\tcb = json ? {} : nodes;\n\n\t\t// Public functions\n\n\t\t// Executes a function on nodes\n\t\tcb.each = function (fn) {\n\t\t\tif (typeof fn === 'function') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply\n\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Find first\n\t\tcb.first = function () {\n\t\t\treturn chibi(nodes.shift());\n\t\t};\n\t\t// Find last\n\t\tcb.last = function () {\n\t\t\treturn chibi(nodes.pop());\n\t\t};\n\t\t// Find odd\n\t\tcb.odd = function () {\n\t\t\tvar odds = [], i;\n\t\t\tfor (i = 0; i < nodes.length; i += 2) {\n\t\t\t\todds.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(odds);\n\t\t};\n\t\t// Find even\n\t\tcb.even = function () {\n\t\t\tvar evens = [], i;\n\t\t\tfor (i = 1; i < nodes.length; i += 2) {\n\t\t\t\tevens.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(evens);\n\t\t};\n\t\t// Hide node\n\t\tcb.hide = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\telm.style.display = 'none';\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Show node\n\t\tcb.show = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tshowCss(elm);\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle node display\n\t\tcb.toggle = function (state) {\n\t\t\tif (typeof state != 'undefined') { // ADDED\n\t\t\t\tif (state)\n\t\t\t\t\tcb.show();\n\t\t\t\telse\n\t\t\t\t\tcb.hide();\n\t\t\t} else {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// computeStyle instead of style.display == 'none' catches elements that are hidden via style block\n\t\t\t\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\t\t\t\tshowCss(elm);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telm.style.display = 'none';\n\t\t\t\t\t}\n\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove node\n\t\tcb.remove = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\ttry {\n\t\t\t\t\telm.parentNode.removeChild(elm);\n\t\t\t\t} catch (e) {\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn chibi();\n\t\t};\n\t\t// Get/Set CSS\n\t\tcb.css = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tif (value || value === '') {\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tsetCss(elm, property, value);\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (nodes[0].style[cssCamel(property)]) {\n\t\t\t\t\t\treturn nodes[0].style[cssCamel(property)];\n\t\t\t\t\t}\n\t\t\t\t\tif (computeStyle(nodes[0], property)) {\n\t\t\t\t\t\treturn computeStyle(nodes[0], property);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get class(es)\n\t\tcb.getClass = function () {\n\t\t\tif (nodes[0] && nodes[0].className.length > 0) {\n\t\t\t\t// Weak IE trim support\n\t\t\t\treturn nodes[0].className.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '').replace(/\\s+/, ' ');\n\t\t\t}\n\t\t};\n\t\t// Set (replaces) classes\n\t\tcb.setClass = function (classes) {\n\t\t\tif (classes || classes === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.className = classes;\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Add class\n\t\tcb.addClass = function (classes) {\n\t\t\tclassHelper(classes, 'add', nodes);\n\t\t\t// if (classes) {\n\t\t\t// \tnodeLoop(function (elm) {\n\t\t\t// \t\telm.className += ' ' + classes;\n\t\t\t// \t}, nodes);\n\t\t\t// }\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove class\n\t\tcb.removeClass = function (classes) {\n\t\t\tclassHelper(classes, 'remove', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle class\n\t\tcb.toggleClass = function (classes, set) {\n\t\t\tvar method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove'));\n\t\t\tclassHelper(classes, method, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Has class\n\t\tcb.hasClass = function (classes) {\n\t\t\treturn classHelper(classes, 'has', nodes);\n\t\t};\n\t\t// Get/set HTML\n\t\tcb.html = function (value) {\n\t\t\tif (value || value === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.innerHTML = value;\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\treturn nodes[0].innerHTML;\n\t\t\t}\n\t\t};\n\t\t// Insert HTML before selector\n\t\tcb.htmlBefore = function (value) {\n\t\t\tinsertHtml(value, 'before', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector\n\t\tcb.htmlAfter = function (value) {\n\t\t\tinsertHtml(value, 'after', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector innerHTML\n\t\tcb.htmlAppend = function (value) {\n\t\t\tinsertHtml(value, 'append', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML before selector innerHTML\n\t\tcb.htmlPrepend = function (value) {\n\t\t\tinsertHtml(value, 'prepend', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Get/Set HTML attributes\n\t\tcb.attr = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tproperty = property.toLowerCase();\n\t\t\t\t// IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway\n\t\t\t\tif (typeof value !== 'undefined') {//FIXED BUG HERE\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\t\telm.style.cssText = value;\n\t\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\t\telm.className = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telm.setAttribute(property, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\tif (nodes[0].style.cssText) {\n\t\t\t\t\t\t\treturn nodes[0].style.cssText;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\tif (nodes[0].className) {\n\t\t\t\t\t\t\treturn nodes[0].className;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (nodes[0].getAttribute(property)) {\n\t\t\t\t\t\t\treturn nodes[0].getAttribute(property);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get/Set HTML data property\n\t\tcb.data = function (key, value) {\n\t\t\tif (key) {\n\t\t\t\treturn cb.attr('data-' + key, value);\n\t\t\t}\n\t\t};\n\t\t// Get/Set form element values\n\t\tcb.val = function (value) {\n\t\t\tvar values, i, j;\n\t\t\tif (typeof value != 'undefined') { // FIXED A BUG HERE\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tswitch (elm.nodeName) {\n\t\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\t\t\t\tvalue = [value];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (i = 0; i < elm.length; i += 1) {\n\t\t\t\t\t\t\t\t// Multiple select\n\t\t\t\t\t\t\t\tfor (j = 0; j < value.length; j += 1) {\n\t\t\t\t\t\t\t\t\telm[i].selected = '';\n\t\t\t\t\t\t\t\t\tif (elm[i].value === \"\"+value[j]) {\n\t\t\t\t\t\t\t\t\t\telm[i].selected = 'selected';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\t\telm.value = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\tswitch (nodes[0].nodeName) {\n\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\tvalues = [];\n\t\t\t\t\t\tfor (i = 0; i < nodes[0].length; i += 1) {\n\t\t\t\t\t\t\tif (nodes[0][i].selected) {\n\t\t\t\t\t\t\t\tvalues.push(nodes[0][i].value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (values.length > 1) ? values : values[0];\n\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\treturn nodes[0].value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Return matching checked checkbox or radios\n\t\tcb.checked = function (check) {\n\t\t\tif (typeof check === 'boolean') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tif (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) {\n\t\t\t\t\t\telm.checked = check;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) {\n\t\t\t\treturn (!!nodes[0].checked);\n\t\t\t}\n\t\t};\n\t\t// Add event handler\n\t\tcb.on = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.addEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions)\n\t\t\t\t\telm[event + fn] = function () {\n\t\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t\t};\n\t\t\t\t\telm.attachEvent('on' + event, elm[event + fn]);\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove event handler\n\t\tcb.off = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.removeEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\telm.detachEvent('on' + event, elm[event + fn]);\n\t\t\t\t\t// Tidy up\n\t\t\t\t\telm[event + fn] = null;\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\treturn cb;\n\t}\n\n\t// Basic XHR\n\tchibi.ajax = function (options) { // if options is a number, it's timeout in ms\n\t\tvar opts = Object.assign({\n\t\t\tmethod: 'GET',\n\t\t\tnocache: true,\n\t\t\ttimeout: 5000,\n\t\t\tloader: true,\n\t\t\tcallback: null\n\t\t}, options);\n\t\topts.method = opts.method.toUpperCase();\n\n\t\tvar loaderFn = opts.loader ? chibi._loader : function(){};\n\t\tvar url = opts.url;\n\t\tvar method = opts.method;\n\t\tvar query = null;\n\n\t\tif (opts.data) {\n\t\t\tquery = serializeData(opts.data);\n\t\t}\n\n\t\tif (query && (method === 'GET')) {\n\t\t\turl += (url.indexOf('?') === -1) ? '?' + query : '&' + query;\n\t\t\tquery = null;\n\t\t}\n\n\t\tvar xhr = new XMLHttpRequest();\n\n\t\t// prevent caching\n\t\tif (opts.nocache) {\n\t\t\tvar ts = (+(new Date())).toString(36);\n\t\t\turl += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts;\n\t\t}\n\n\t\tloaderFn(true);\n\n\t\txhr.open(method, url, true);\n\t\txhr.timeout = opts.timeout;\n\n\t\t// Abort after given timeout\n\t\tvar abortTmeo = setTimeout(function () {\n\t\t\tconsole.error(\"XHR timed out.\");\n\t\t\txhr.abort();\n\t\t\tloaderFn(false);\n\t\t}, opts.timeout + 10);\n\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tloaderFn(false);\n\n\t\t\t\topts.callback && opts.callback(xhr.responseText, xhr.status);\n\n\t\t\t\tclearTimeout(abortTmeo);\n\t\t\t}\n\t\t};\n\n\t\txhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\tif (method === 'POST') {\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t}\n\n\t\txhr.send(query);\n\t\treturn xhr;\n\t};\n\n\tchibi._loader = function(){};\n\n\t// Alias to cb.ajax(url, 'get', callback)\n\tchibi.get = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'GET';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Alias to cb.ajax(url, 'post', callback)\n\tchibi.post = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'POST';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Fire on DOM ready\n\tchibi.ready = function (fn) {\n\t\tif (fn) {\n\t\t\tif (domready) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\treadyfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\t// Fire on page loaded\n\tchibi.loaded = function (fn) {\n\t\tif (fn) {\n\t\t\tif (pageloaded) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\tloadedfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar entityMap = {\n\t\t'&': '&',\n\t\t'<': '<',\n\t\t'>': '>',\n\t\t'\"': '"',\n\t\t\"'\": ''',\n\t\t'/': '/',\n\t\t'`': '`',\n\t\t'=': '='\n\t};\n\n\tchibi.htmlEscape = function(string) {\n\t\treturn String(string).replace(/[&<>\"'`=\\/]/g, function (s) {\n\t\t\treturn entityMap[s];\n\t\t});\n\t};\n\n\t// Set Chibi's global namespace here ($)\n\tw.$ = chibi;\n}());\n","// keymaster.js\n// (c) 2011-2013 Thomas Fuchs\n// keymaster.js may be freely distributed under the MIT license.\n\n;(function(global){\n var k,\n _handlers = {},\n _mods = { 16: false, 18: false, 17: false, 91: false },\n _scope = 'all',\n // modifier keys\n _MODIFIERS = {\n '⇧': 16, shift: 16,\n '⌥': 18, alt: 18, option: 18,\n '⌃': 17, ctrl: 17, control: 17,\n '⌘': 91, command: 91\n },\n // special keys\n _MAP = {\n backspace: 8, tab: 9, clear: 12,\n enter: 13, 'return': 13,\n esc: 27, escape: 27, space: 32,\n left: 37, up: 38,\n right: 39, down: 40,\n del: 46, 'delete': 46,\n home: 36, end: 35,\n pageup: 33, pagedown: 34,\n ',': 188, '.': 190, '/': 191,\n '`': 192, '-': 189, '=': 187,\n ';': 186, '\\'': 222,\n '[': 219, ']': 221, '\\\\': 220,\n // added:\n insert: 45,\n np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101,\n\t np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106,\n\t np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144,\n },\n code = function(x){\n return _MAP[x] || x.toUpperCase().charCodeAt(0);\n },\n _downKeys = [];\n\n for(k=1;k<20;k++) _MAP['f'+k] = 111+k;\n\n // IE doesn't support Array#indexOf, so have a simple replacement\n function index(array, item){\n var i = array.length;\n while(i--) if(array[i]===item) return i;\n return -1;\n }\n\n // for comparing mods before unassignment\n function compareArray(a1, a2) {\n if (a1.length != a2.length) return false;\n for (var i = 0; i < a1.length; i++) {\n if (a1[i] !== a2[i]) return false;\n }\n return true;\n }\n\n var modifierMap = {\n 16:'shiftKey',\n 18:'altKey',\n 17:'ctrlKey',\n 91:'metaKey'\n };\n function updateModifierKey(event) {\n for(k in _mods) _mods[k] = event[modifierMap[k]];\n };\n\n function isModifierPressed(mod) {\n if (mod=='control'||mod=='ctrl') return _mods[17];\n\tif (mod=='shift') return _mods[16];\n\tif (mod=='meta') return _mods[91];\n\tif (mod=='alt') return _mods[18];\n\treturn false;\n }\n\n // handle keydown event\n function dispatch(event) {\n var key, handler, k, i, modifiersMatch, scope;\n key = event.keyCode;\n\n if (index(_downKeys, key) == -1) {\n _downKeys.push(key);\n }\n\n // if a modifier key, set the key. property to true and return\n if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko\n if(key in _mods) {\n _mods[key] = true;\n // 'assignKey' from inside this closure is exported to window.key\n for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true;\n return;\n }\n updateModifierKey(event);\n\n // see if we need to ignore the keypress (filter() can can be overridden)\n // by default ignore key presses if a select, textarea, or input is focused\n if(!assignKey.filter.call(this, event)) return;\n\n // abort if no potentially matching shortcuts found\n if (!(key in _handlers)) return;\n\n scope = getScope();\n\n // for each potential shortcut\n for (i = 0; i < _handlers[key].length; i++) {\n handler = _handlers[key][i];\n\n // see if it's in the current scope\n if(handler.scope == scope || handler.scope == 'all'){\n // check if modifiers match if any\n modifiersMatch = handler.mods.length > 0;\n for(k in _mods)\n if((!_mods[k] && index(handler.mods, +k) > -1) ||\n (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false;\n // call the handler and stop the event if neccessary\n if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){\n if(handler.method(event, handler)===false){\n if(event.preventDefault) event.preventDefault();\n else event.returnValue = false;\n if(event.stopPropagation) event.stopPropagation();\n if(event.cancelBubble) event.cancelBubble = true;\n }\n }\n }\n }\n };\n\n // unset modifier keys on keyup\n function clearModifier(event){\n var key = event.keyCode, k,\n i = index(_downKeys, key);\n\n // remove key from _downKeys\n if (i >= 0) {\n _downKeys.splice(i, 1);\n }\n\n if(key == 93 || key == 224) key = 91;\n if(key in _mods) {\n _mods[key] = false;\n for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false;\n }\n };\n\n function resetModifiers() {\n for(k in _mods) _mods[k] = false;\n for(k in _MODIFIERS) assignKey[k] = false;\n };\n\n // parse and assign shortcut\n function assignKey(key, scope, method){\n var keys, mods;\n keys = getKeys(key);\n if (method === undefined) {\n method = scope;\n scope = 'all';\n }\n\n // for each shortcut\n for (var i = 0; i < keys.length; i++) {\n // set modifier keys if any\n mods = [];\n key = keys[i].split('+');\n if (key.length > 1){\n mods = getMods(key);\n key = [key[key.length-1]];\n }\n // convert to keycode and...\n key = key[0]\n key = code(key);\n // ...store handler\n if (!(key in _handlers)) _handlers[key] = [];\n _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods });\n }\n };\n\n // unbind all handlers for given key in current scope\n function unbindKey(key, scope) {\n var multipleKeys, keys,\n mods = [],\n i, j, obj;\n\n multipleKeys = getKeys(key);\n\n for (j = 0; j < multipleKeys.length; j++) {\n keys = multipleKeys[j].split('+');\n\n if (keys.length > 1) {\n mods = getMods(keys);\n }\n\n key = keys[keys.length - 1];\n key = code(key);\n\n if (scope === undefined) {\n scope = getScope();\n }\n if (!_handlers[key]) {\n return;\n }\n for (i = 0; i < _handlers[key].length; i++) {\n obj = _handlers[key][i];\n // only clear handlers if correct scope and mods match\n if (obj.scope === scope && compareArray(obj.mods, mods)) {\n _handlers[key][i] = {};\n }\n }\n }\n };\n\n // Returns true if the key with code 'keyCode' is currently down\n // Converts strings into key codes.\n function isPressed(keyCode) {\n if (typeof(keyCode)=='string') {\n keyCode = code(keyCode);\n }\n return index(_downKeys, keyCode) != -1;\n }\n\n function getPressedKeyCodes() {\n return _downKeys.slice(0);\n }\n\n function filter(event){\n var tagName = (event.target || event.srcElement).tagName;\n // ignore keypressed in any elements that support keyboard data input\n return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');\n }\n\n // initialize key. to false\n for(k in _MODIFIERS) assignKey[k] = false;\n\n // set current scope (default 'all')\n function setScope(scope){ _scope = scope || 'all' };\n function getScope(){ return _scope || 'all' };\n\n // delete all handlers for a given scope\n function deleteScope(scope){\n var key, handlers, i;\n\n for (key in _handlers) {\n handlers = _handlers[key];\n for (i = 0; i < handlers.length; ) {\n if (handlers[i].scope === scope) handlers.splice(i, 1);\n else i++;\n }\n }\n };\n\n // abstract key logic for assign and unassign\n function getKeys(key) {\n var keys;\n key = key.replace(/\\s/g, '');\n keys = key.split(',');\n if ((keys[keys.length - 1]) == '') {\n keys[keys.length - 2] += ',';\n }\n return keys;\n }\n\n // abstract mods logic for assign and unassign\n function getMods(key) {\n var mods = key.slice(0, key.length - 1);\n for (var mi = 0; mi < mods.length; mi++)\n mods[mi] = _MODIFIERS[mods[mi]];\n return mods;\n }\n\n // cross-browser events\n function addEvent(object, event, method) {\n if (object.addEventListener)\n object.addEventListener(event, method, false);\n else if(object.attachEvent)\n object.attachEvent('on'+event, function(){ method(window.event) });\n };\n\n // set the handlers globally on document\n addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48\n addEvent(document, 'keyup', clearModifier);\n\n // reset modifiers to false whenever the window is (re)focused.\n addEvent(window, 'focus', resetModifiers);\n\n // store previously defined key\n var previousKey = global.key;\n\n // restore previously defined key and return reference to our key object\n function noConflict() {\n var k = global.key;\n global.key = previousKey;\n return k;\n }\n\n // set window.key and window.key.set/get/deleteScope, and the default filter\n global.key = assignKey;\n global.key.setScope = setScope;\n global.key.getScope = getScope;\n global.key.deleteScope = deleteScope;\n global.key.filter = filter;\n global.key.isPressed = isPressed;\n global.key.isModifier = isModifierPressed;\n global.key.getPressedKeyCodes = getPressedKeyCodes;\n global.key.noConflict = noConflict;\n global.key.unbind = unbindKey;\n\n if(typeof module !== 'undefined') module.exports = assignKey;\n\n})(window);\n\n","/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\nif (!String.fromCodePoint) {\n (function () {\n var defineProperty = (function () {\n // IE 8 only supports `Object.defineProperty` on DOM elements\n try {\n var object = {};\n var $defineProperty = Object.defineProperty;\n var result = $defineProperty(object, object, object) && $defineProperty;\n } catch (error) {\n }\n return result;\n }());\n var stringFromCharCode = String.fromCharCode;\n var floor = Math.floor;\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000;\n var codeUnits = [];\n var highSurrogate;\n var lowSurrogate;\n var index = -1;\n var length = arguments.length;\n if (!length) {\n return '';\n }\n var result = '';\n while (++index < length) {\n var codePoint = Number(arguments[index]);\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) != codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint);\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint);\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n highSurrogate = (codePoint >> 10) + 0xD800;\n lowSurrogate = (codePoint % 0x400) + 0xDC00;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 == length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n if (defineProperty) {\n defineProperty(String, 'fromCodePoint', {\n 'value': fromCodePoint,\n 'configurable': true,\n 'writable': true\n });\n } else {\n String.fromCodePoint = fromCodePoint;\n }\n }());\n}\n","/** Make a node */\nfunction mk (e) {\n return document.createElement(e)\n}\n\n/** Find one by query */\nfunction qs (s) {\n return document.querySelector(s)\n}\n\n/** Find all by query */\nfunction qsa (s) {\n return document.querySelectorAll(s)\n}\n\n/** Convert any to bool safely */\nfunction bool (x) {\n return (x === 1 || x === '1' || x === true || x === 'true')\n}\n\n/**\n * Filter 'spacebar' and 'return' from keypress handler,\n * and when they're pressed, fire the callback.\n * use $(...).on('keypress', cr(handler))\n */\nfunction cr (hdl) {\n return function (e) {\n if (e.which === 10 || e.which === 13 || e.which === 32) {\n hdl()\n }\n }\n}\n\n/** HTML escape */\nfunction esc (str) {\n return $.htmlEscape(str)\n}\n\n/** Check for undefined */\nfunction undef (x) {\n return typeof x == 'undefined'\n}\n\n/** Safe json parse */\nfunction jsp (str) {\n try {\n return JSON.parse(str)\n } catch (e) {\n console.error(e)\n return null\n }\n}\n\n/** Create a character from ASCII code */\nfunction Chr (n) {\n return String.fromCharCode(n)\n}\n\n/** Decode number from 2B encoding */\nfunction parse2B (s, i = 0) {\n return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127\n}\n\n/** Decode number from 3B encoding */\nfunction parse3B (s, i = 0) {\n return (s.charCodeAt(i) - 1) + (s.charCodeAt(i + 1) - 1) * 127 + (s.charCodeAt(i + 2) - 1) * 127 * 127\n}\n\n/** Encode using 2B encoding, returns string. */\nfunction encode2B (n) {\n let lsb, msb\n lsb = (n % 127)\n n = ((n - lsb) / 127)\n lsb += 1\n msb = (n + 1)\n return Chr(lsb) + Chr(msb)\n}\n\n/** Encode using 3B encoding, returns string. */\nfunction encode3B (n) {\n let lsb, msb, xsb\n lsb = (n % 127)\n n = (n - lsb) / 127\n lsb += 1\n msb = (n % 127)\n n = (n - msb) / 127\n msb += 1\n xsb = (n + 1)\n return Chr(lsb) + Chr(msb) + Chr(xsb)\n}\n","/** Module for toggling a modal overlay */\n(function () {\n let modal = {}\n let curCloseCb = null\n\n modal.show = function (sel, closeCb) {\n let $m = $(sel)\n $m.removeClass('hidden visible')\n setTimeout(function () {\n $m.addClass('visible')\n }, 1)\n curCloseCb = closeCb\n }\n\n modal.hide = function (sel) {\n let $m = $(sel)\n $m.removeClass('visible')\n setTimeout(function () {\n $m.addClass('hidden')\n if (curCloseCb) curCloseCb()\n }, 500) // transition time\n }\n\n modal.init = function () {\n // close modal by click outside the dialog\n $('.Modal').on('click', function () {\n if ($(this).hasClass('no-close')) return // this is a no-close modal\n modal.hide(this)\n })\n\n $('.Dialog').on('click', function (e) {\n e.stopImmediatePropagation()\n })\n\n // Hide all modals on esc\n $(window).on('keydown', function (e) {\n if (e.which === 27) {\n modal.hide('.Modal')\n }\n })\n }\n\n window.Modal = modal\n})()\n","window.Notify = (function () {\n let nt = {}\n const sel = '#notif'\n let $balloon\n\n let timerHideBegin // timeout to start hiding (transition)\n let timerHideEnd // timeout to add the hidden class\n let timerCanCancel\n let canCancel = false\n\n let stopTimeouts = function () {\n clearTimeout(timerHideBegin)\n clearTimeout(timerHideEnd)\n }\n\n nt.show = function (message, timeout, isError) {\n $balloon.toggleClass('error', isError === true)\n $balloon.html(message)\n Modal.show($balloon)\n stopTimeouts()\n\n if (undef(timeout) || timeout === null || timeout <= 0) {\n timeout = 2500\n }\n\n timerHideBegin = setTimeout(nt.hide, timeout)\n\n canCancel = false\n timerCanCancel = setTimeout(function () {\n canCancel = true\n }, 500)\n }\n\n nt.hide = function () {\n let $m = $(sel)\n $m.removeClass('visible')\n timerHideEnd = setTimeout(function () {\n $m.addClass('hidden')\n }, 250) // transition time\n }\n\n nt.init = function () {\n $balloon = $(sel)\n\n // close by click outside\n $(document).on('click', function () {\n if (!canCancel) return\n nt.hide(this)\n })\n\n // click caused by selecting, prevent it from bubbling\n $balloon.on('click', function (e) {\n e.stopImmediatePropagation()\n return false\n })\n\n // stop fading if moused\n $balloon.on('mouseenter', function () {\n stopTimeouts()\n $balloon.removeClass('hidden').addClass('visible')\n })\n }\n\n return nt\n})()\n","/** Global generic init */\n$.ready(function () {\n // Checkbox UI (checkbox CSS and hidden input with int value)\n $('.Row.checkbox').forEach(function (x) {\n let inp = x.querySelector('input')\n let box = x.querySelector('.box')\n\n $(box).toggleClass('checked', inp.value)\n\n let hdl = function () {\n inp.value = 1 - inp.value\n $(box).toggleClass('checked', inp.value)\n }\n\n $(x).on('click', hdl).on('keypress', cr(hdl))\n })\n\n // Expanding boxes on mobile\n $('.Box.mobcol,.Box.fold').forEach(function (x) {\n let h = x.querySelector('h2')\n\n let hdl = function () {\n $(x).toggleClass('expanded')\n }\n $(h).on('click', hdl).on('keypress', cr(hdl))\n })\n\n $('form').forEach(function (x) {\n $(x).on('keypress', function (e) {\n if ((e.keyCode === 10 || e.keyCode === 13) && e.ctrlKey) {\n x.submit()\n }\n })\n })\n\n // loader dots...\n setInterval(function () {\n $('.anim-dots').each(function (x) {\n let $x = $(x)\n let dots = $x.html() + '.'\n if (dots.length === 5) dots = '.'\n $x.html(dots)\n })\n }, 1000)\n\n // flipping number boxes with the mouse wheel\n $('input[type=number]').on('mousewheel', function (e) {\n let $this = $(this)\n let val = +$this.val()\n if (isNaN(val)) val = 1\n\n const step = +($this.attr('step') || 1)\n const min = +$this.attr('min')\n const max = +$this.attr('max')\n if (e.wheelDelta > 0) {\n val += step\n } else {\n val -= step\n }\n\n if (undef(min)) val = Math.max(val, +min)\n if (undef(max)) val = Math.min(val, +max)\n $this.val(val)\n\n if ('createEvent' in document) {\n let evt = document.createEvent('HTMLEvents')\n evt.initEvent('change', false, true)\n $this[0].dispatchEvent(evt)\n } else {\n $this[0].fireEvent('onchange')\n }\n\n e.preventDefault()\n })\n\n // populate the form errors box from GET arg ?err=...\n // (a way to pass errors back from server via redirect)\n let errAt = location.search.indexOf('err=')\n if (errAt !== -1 && qs('.Box.errors')) {\n let errs = location.search.substr(errAt + 4).split(',')\n let humanReadableErrors = []\n errs.forEach(function (er) {\n let lbl = qs('label[for=\"' + er + '\"]')\n if (lbl) {\n lbl.classList.add('error')\n humanReadableErrors.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, ''))\n }\n // else {\n // hres.push(er)\n // }\n })\n\n qs('.Box.errors .list').innerHTML = humanReadableErrors.join(', ')\n qs('.Box.errors').classList.remove('hidden')\n }\n\n Modal.init()\n Notify.init()\n\n // remove tabindixes from h2 if wide\n if (window.innerWidth > 550) {\n $('.Box h2').forEach(function (x) {\n x.removeAttribute('tabindex')\n })\n\n // brand works as a link back to term in widescreen mode\n let br = qs('#brand')\n br && br.addEventListener('click', function () {\n location.href = '/' // go to terminal\n })\n }\n})\n\n// setup the ajax loader\n$._loader = function (vis) {\n $('#loader').toggleClass('show', vis)\n}\n\n// reveal content on load\nfunction showPage () {\n $('#content').addClass('load')\n}\n\n// Auto reveal pages other than the terminal (sets window.noAutoShow)\n$.ready(function () {\n if (window.noAutoShow !== true) {\n setTimeout(function () {\n showPage()\n }, 1)\n }\n})\n","class ANSIParser {\n constructor (handler) {\n this.reset()\n this.handler = handler\n this.joinChunks = true\n }\n reset () {\n this.currentSequence = 0\n this.sequence = ''\n }\n parseSequence (sequence) {\n if (sequence[0] === '[') {\n let type = sequence[sequence.length - 1]\n let content = sequence.substring(1, sequence.length - 1)\n\n let numbers = content ? content.split(';').map(i => +i.replace(/\\D/g, '')) : []\n let numOr1 = numbers.length ? numbers[0] : 1\n if (type === 'H') {\n this.handler('set-cursor', (numbers[0] | 0) - 1, (numbers[1] | 0) - 1)\n } else if (type >= 'A' && type <= 'D') {\n this.handler(`move-cursor-${type <= 'B' ? 'y' : 'x'}`, ((type === 'B' || type === 'C') ? 1 : -1) * numOr1)\n } else if (type === 'E' || type === 'F') {\n this.handler('move-cursor-line', (type === 'E' ? 1 : -1) * numOr1)\n } else if (type === 'G') {\n this.handler('set-cursor-x', numOr1 - 1)\n } else if (type === 'J') {\n let number = numbers.length ? numbers[0] : 2\n if (number === 2) this.handler('clear')\n } else if (type === 'P') {\n this.handler('delete', numOr1)\n } else if (type === '@') {\n this.handler('insert-blanks', numOr1)\n } else if (type === 'q') this.handler('set-cursor-style', numOr1)\n else if (type === 'm') {\n if (!numbers.length || numbers[0] === 0) {\n this.handler('reset-style')\n return\n }\n let type = numbers[0]\n if (type === 1) this.handler('add-attrs', 1) // bold\n else if (type === 2) this.handler('add-attrs', 1 << 1) // faint\n else if (type === 3) this.handler('add-attrs', 1 << 2) // italic\n else if (type === 4) this.handler('add-attrs', 1 << 3) // underline\n else if (type === 5 || type === 6) this.handler('add-attrs', 1 << 4) // blink\n else if (type === 7) this.handler('add-attrs', -1) // invert\n else if (type === 9) this.handler('add-attrs', 1 << 6) // strike\n else if (type === 20) this.handler('add-attrs', 1 << 5) // fraktur\n else if (type >= 30 && type <= 37) this.handler('set-color-fg', type % 10)\n else if (type >= 40 && type <= 47) this.handler('set-color-bg', type % 10)\n else if (type === 39) this.handler('set-color-fg', 7)\n else if (type === 49) this.handler('set-color-bg', 0)\n else if (type >= 90 && type <= 98) this.handler('set-color-fg', (type % 10) + 8)\n else if (type >= 100 && type <= 108) this.handler('set-color-bg', (type % 10) + 8)\n else if (type === 38 || type === 48) {\n if (numbers[1] === 5) {\n let color = (numbers[2] | 0) & 0xFF\n if (type === 38) this.handler('set-color-fg', color)\n if (type === 48) this.handler('set-color-bg', color)\n }\n }\n } else if (type === 'h' || type === 'l') {\n if (content === '?25') {\n if (type === 'h') this.handler('show-cursor')\n else if (type === 'l') this.handler('hide-cursor')\n }\n }\n }\n }\n write (text) {\n for (let character of text.toString()) {\n let code = character.codePointAt(0)\n if (code === 0x1b) this.currentSequence = 1\n else if (this.currentSequence === 1 && character === '[') {\n this.currentSequence = 2\n this.sequence += '['\n } else if (this.currentSequence && character.match(/[\\x40-\\x7e]/)) {\n this.parseSequence(this.sequence + character)\n this.currentSequence = 0\n this.sequence = ''\n } else if (this.currentSequence > 1) this.sequence += character\n else if (this.currentSequence === 1) {\n // something something nothing\n this.currentSequence = 0\n this.handler('write', character)\n } else if (code === 0x07) this.handler('bell')\n else if (code === 0x08) this.handler('back')\n else if (code === 0x0a) this.handler('new-line')\n else if (code === 0x0d) this.handler('return')\n else if (code === 0x15) this.handler('delete-line')\n else if (code === 0x17) this.handler('delete-word')\n else this.handler('write', character)\n }\n if (!this.joinChunks) this.reset()\n }\n}\nconst TERM_DEFAULT_STYLE = 7\nconst TERM_MIN_DRAW_DELAY = 10\n\nlet getRainbowColor = t => {\n let r = Math.floor(Math.sin(t) * 2.5 + 2.5)\n let g = Math.floor(Math.sin(t + 2 / 3 * Math.PI) * 2.5 + 2.5)\n let b = Math.floor(Math.sin(t + 4 / 3 * Math.PI) * 2.5 + 2.5)\n return 16 + 36 * r + 6 * g + b\n}\n\nclass ScrollingTerminal {\n constructor (screen) {\n this.width = 80\n this.height = 25\n this.termScreen = screen\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n\n this.reset()\n\n this._lastLoad = Date.now()\n this.termScreen.load(this.serialize(), 0)\n }\n reset () {\n this.style = TERM_DEFAULT_STYLE\n this.cursor = { x: 0, y: 0, style: 1, visible: true }\n this.trackMouse = false\n this.theme = 0\n this.rainbow = false\n this.parser.reset()\n this.clear()\n }\n clear () {\n this.screen = []\n for (let i = 0; i < this.width * this.height; i++) {\n this.screen.push([' ', this.style])\n }\n }\n scroll () {\n this.screen.splice(0, this.width)\n for (let i = 0; i < this.width; i++) {\n this.screen.push([' ', TERM_DEFAULT_STYLE])\n }\n this.cursor.y--\n }\n newLine () {\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n writeChar (character) {\n this.screen[this.cursor.y * this.width + this.cursor.x] = [character, this.style]\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.newLine()\n }\n }\n moveBack (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x--\n if (this.cursor.x < 0) {\n if (this.cursor.y > 0) this.cursor.x = this.width - 1\n else this.cursor.x = 0\n this.cursor.y = Math.max(0, this.cursor.y - 1)\n }\n }\n }\n moveForward (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n }\n }\n deleteChar () {\n this.moveBack()\n this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, 1)\n }\n deleteForward (n) {\n n = Math.min(this.width, n)\n for (let i = 0; i < n; i++) this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, n)\n }\n clampCursor () {\n if (this.cursor.x < 0) this.cursor.x = 0\n if (this.cursor.y < 0) this.cursor.y = 0\n if (this.cursor.x > this.width - 1) this.cursor.x = this.width - 1\n if (this.cursor.y > this.height - 1) this.cursor.y = this.height - 1\n }\n handleParsed (action, ...args) {\n if (action === 'write') {\n this.writeChar(args[0])\n } else if (action === 'delete') {\n this.deleteForward(args[0])\n } else if (action === 'insert-blanks') {\n this.insertBlanks(args[0])\n } else if (action === 'clear') {\n this.clear()\n } else if (action === 'bell') {\n this.terminal.load('B')\n } else if (action === 'back') {\n this.moveBack()\n } else if (action === 'new-line') {\n this.newLine()\n } else if (action === 'return') {\n this.cursor.x = 0\n } else if (action === 'set-cursor') {\n this.cursor.x = args[0]\n this.cursor.y = args[1]\n this.clampCursor()\n } else if (action === 'move-cursor-y') {\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-x') {\n this.cursor.x += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-line') {\n this.cursor.x = 0\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'set-cursor-x') {\n this.cursor.x = args[0]\n } else if (action === 'set-cursor-style') {\n this.cursor.style = Math.max(0, Math.min(6, args[0]))\n } else if (action === 'reset-style') {\n this.style = TERM_DEFAULT_STYLE\n } else if (action === 'add-attrs') {\n if (args[0] === -1) {\n this.style = (this.style & 0xFF0000) | ((this.style >> 8) & 0xFF) | ((this.style & 0xFF) << 8)\n } else {\n this.style |= (args[0] << 16)\n }\n } else if (action === 'set-color-fg') {\n this.style = (this.style & 0xFFFF00) | args[0]\n } else if (action === 'set-color-bg') {\n this.style = (this.style & 0xFF00FF) | (args[0] << 8)\n } else if (action === 'hide-cursor') {\n this.cursor.visible = false\n } else if (action === 'show-cursor') {\n this.cursor.visible = true\n }\n }\n write (text) {\n this.parser.write(text)\n this.scheduleLoad()\n }\n serialize () {\n let serialized = 'S'\n serialized += encode2B(this.height) + encode2B(this.width)\n serialized += encode2B(this.cursor.y) + encode2B(this.cursor.x)\n\n let attributes = +this.cursor.visible\n attributes |= (3 << 5) * +this.trackMouse // track mouse controls both\n attributes |= 3 << 7 // buttons/links always visible\n attributes |= (this.cursor.style << 9)\n serialized += encode3B(attributes)\n\n let lastStyle = null\n let index = 0\n for (let cell of this.screen) {\n let style = cell[1]\n if (this.rainbow) {\n let x = index % this.width\n let y = Math.floor(index / this.width)\n style = (style & 0xFF0000) | getRainbowColor((x + y) / 10 + Date.now() / 1000)\n index++\n }\n if (style !== lastStyle) {\n let foreground = style & 0xFF\n let background = (style >> 8) & 0xFF\n let attributes = (style >> 16) & 0xFF\n let setForeground = foreground !== (lastStyle & 0xFF)\n let setBackground = background !== ((lastStyle >> 8) & 0xFF)\n let setAttributes = attributes !== ((lastStyle >> 16) & 0xFF)\n\n if (setForeground && setBackground) serialized += '\\x03' + encode3B(style & 0xFFFF)\n else if (setForeground) serialized += '\\x05' + encode2B(foreground)\n else if (setBackground) serialized += '\\x06' + encode2B(background)\n if (setAttributes) serialized += '\\x04' + encode2B(attributes)\n\n lastStyle = style\n }\n serialized += cell[0]\n }\n return serialized\n }\n scheduleLoad () {\n clearTimeout(this._scheduledLoad)\n if (this._lastLoad < Date.now() - TERM_MIN_DRAW_DELAY) {\n this.termScreen.load(this.serialize(), this.theme)\n } else {\n this._scheduledLoad = setTimeout(() => {\n this.termScreen.load(this.serialize())\n }, TERM_MIN_DRAW_DELAY - this._lastLoad)\n }\n }\n rainbowTimer () {\n if (!this.rainbow) return\n clearInterval(this._rainbowTimer)\n this._rainbowTimer = setInterval(() => {\n if (this.rainbow) this.scheduleLoad()\n }, 50)\n }\n}\n\nclass Process {\n constructor (args) {\n // event listeners\n this._listeners = {}\n }\n on (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener })\n }\n once (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener, once: true })\n }\n off (event, listener) {\n let listeners = this._listeners[event]\n if (listeners) {\n for (let i in listeners) {\n if (listeners[i].listener === listener) {\n listeners.splice(i, 1)\n break\n }\n }\n }\n }\n emit (event, ...args) {\n let listeners = this._listeners[event]\n if (listeners) {\n let remove = []\n for (let listener of listeners) {\n try {\n listener.listener(...args)\n if (listener.once) remove.push(listener)\n } catch (err) {\n console.error(err)\n }\n }\n for (let listener of remove) {\n listeners.splice(listeners.indexOf(listener), 1)\n }\n }\n }\n write (data) {\n this.emit('in', data)\n }\n destroy () {\n // death.\n this.emit('exit', 0)\n }\n run () {\n // noop\n }\n}\n\nlet demoData = {\n buttons: {\n 1: '',\n 2: '',\n 3: '',\n 4: '',\n 5: function (terminal, shell) {\n if (shell.child) shell.child.destroy()\n let chars = 'info\\r'\n let loop = function () {\n shell.write(chars[0])\n chars = chars.substr(1)\n if (chars) setTimeout(loop, 100)\n }\n setTimeout(loop, 200)\n }\n }\n}\n\nlet demoshIndex = {\n clear: class Clear extends Process {\n run () {\n this.emit('write', '\\x1b[2J\\x1b[1;1H')\n this.destroy()\n }\n },\n screenfetch: class Screenfetch extends Process {\n run () {\n let image = `\n ###. ESPTerm Demo\n '###. Hostname: ${window.location.hostname}\n '###. Shell: ESPTerm Demo Shell\n '###. Resolution: 80x25@${window.devicePixelRatio}x\n :###-\n .###'\n .###'\n .###' ###############\n ###' ###############\n `.split('\\n').filter(line => line.trim())\n\n let chars = ''\n for (let y = 0; y < image.length; y++) {\n for (let x = 0; x < 80; x++) {\n if (image[y][x]) {\n chars += `\\x1b[38;5;${getRainbowColor((x + y) / 10)}m${image[y][x]}`\n } else chars += ' '\n }\n }\n\n this.emit('write', '\\r\\n\\x1b[?25l')\n let loop = () => {\n this.emit('write', chars.substr(0, 80))\n chars = chars.substr(80)\n if (chars.length) setTimeout(loop, 50)\n else {\n this.emit('write', '\\r\\n\\x1b[?25h')\n this.destroy()\n }\n }\n loop()\n }\n },\n 'local-echo': class LocalEcho extends Process {\n run (...args) {\n if (!args.includes('--suppress-note')) {\n this.emit('write', '\\x1b[38;5;239mNote: not all terminal features are supported or and may not work as expected in this demo\\x1b[0m\\r\\n')\n }\n }\n write (data) {\n this.emit('write', data)\n }\n },\n 'info': class Info extends Process {\n run (...args) {\n let fast = args.includes('--fast')\n this.showSplash().then(() => {\n this.printText(fast)\n })\n }\n showSplash () {\n let splash = `\n -#####- -###*..#####- ######-\n -#* -#- .## .##. *#-\n -##### .-###*..#####- *#- -*##*- #*-#--#**#-*##-\n -#* -#-.##. *#- *##@#* ##. -#* *# .#*\n -#####--####- .##. *#- -*#@@- ##. -#* *# .#*\n `.split('\\n').filter(line => line.trim())\n let levels = {\n ' ': -231,\n '.': 4,\n '-': 8,\n '*': 17,\n '#': 24\n }\n for (let i in splash) {\n if (splash[i].length < 79) splash[i] += ' '.repeat(79 - splash[i].length)\n }\n this.emit('write', '\\r\\n'.repeat(splash.length + 1))\n this.emit('write', '\\x1b[A'.repeat(splash.length))\n this.emit('write', '\\x1b[?25l')\n\n let cursorX = 0\n let cursorY = 0\n let moveTo = (x, y) => {\n let moveX = x - cursorX\n let moveY = y - cursorY\n this.emit('write', `\\x1b[${Math.abs(moveX)}${moveX > 0 ? 'C' : 'D'}`)\n this.emit('write', `\\x1b[${Math.abs(moveY)}${moveY > 0 ? 'B' : 'A'}`)\n cursorX = x\n cursorY = y\n }\n let drawCell = (x, y) => {\n moveTo(x, y)\n if (splash[y][x] === '@') {\n this.emit('write', '\\x1b[48;5;8m\\x1b[38;5;255m▄\\b')\n } else {\n this.emit('write', `\\x1b[48;5;${231 + levels[splash[y][x]]}m \\b`)\n }\n }\n return new Promise((resolve, reject) => {\n const self = this\n let x = 14\n let cycles = 0\n let loop = function () {\n for (let y = 0; y < splash.length; y++) {\n let dx = x - y\n if (dx > 0) drawCell(dx, y)\n }\n\n if (++x < 79) {\n if (++cycles >= 3) {\n setTimeout(loop, 20)\n cycles = 0\n } else loop()\n } else {\n moveTo(0, splash.length)\n self.emit('write', '\\x1b[m\\x1b[?25h')\n resolve()\n }\n }\n loop()\n })\n }\n printText (fast = false) {\n // lots of printing\n let parts = [\n '',\n ' ESPTerm is a VT100-like terminal emulator running on the ESP8266 WiFi chip.',\n '',\n ' \\x1b[93mThis is an online demo of the web user interface, simulating a simple ',\n ' terminal in your browser.\\x1b[m',\n '',\n ' Type \\x1b[92mls\\x1b[m to list available commands.',\n ' Use the \\x1b[94mlinks\\x1b[m below this screen for a demo of the options and more info.',\n ''\n ]\n\n if (fast) {\n this.emit('write', parts.join('\\r\\n') + '\\r\\n')\n this.destroy()\n } else {\n const self = this\n let loop = function () {\n self.emit('write', parts.shift() + '\\r\\n')\n if (parts.length) setTimeout(loop, 17)\n else self.destroy()\n }\n loop()\n }\n }\n },\n colors: class PrintColors extends Process {\n run () {\n this.emit('write', '\\r\\n')\n let fgtext = 'foreground-color'\n this.emit('write', ' ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `3${i}` : `9${i - 8}`) + 'm')\n this.emit('write', fgtext[i] + ' ')\n }\n this.emit('write', '\\r\\n ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `4${i}` : `10${i - 8}`) + 'm ')\n }\n this.emit('write', '\\x1b[m\\r\\n')\n for (let r = 0; r < 6; r++) {\n this.emit('write', ' ')\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n this.emit('write', `\\x1b[48;5;${16 + r * 36 + g * 6 + b}m `)\n }\n this.emit('write', '\\x1b[m')\n }\n this.emit('write', '\\r\\n')\n }\n this.emit('write', ' ')\n for (let g = 0; g < 24; g++) {\n this.emit('write', `\\x1b[48;5;${232 + g}m `)\n }\n this.emit('write', '\\x1b[m\\r\\n\\n')\n this.destroy()\n }\n },\n ls: class ListCommands extends Process {\n run () {\n this.emit('write', '\\x1b[92mList of demo commands\\x1b[m\\r\\n')\n for (let i in demoshIndex) {\n if (typeof demoshIndex[i] === 'string') continue\n this.emit('write', i + '\\r\\n')\n }\n this.destroy()\n }\n },\n theme: class SetTheme extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run (...args) {\n let theme = args[0] | 0\n if (!args.length || !Number.isFinite(theme) || theme < 0 || theme > 5) {\n this.emit('write', '\\x1b[31mUsage: theme [0–5]\\r\\n')\n this.destroy()\n return\n }\n this.shell.terminal.theme = theme\n // HACK: reset drawn screen to prevent only partly redrawn screen\n this.shell.terminal.termScreen.drawnScreenFG = []\n this.emit('write', '')\n this.destroy()\n }\n },\n cursor: class SetCursor extends Process {\n run (...args) {\n let steady = args.includes('--steady')\n if (args.includes('block')) {\n this.emit('write', `\\x1b[${0 + 2 * steady} q`)\n } else if (args.includes('line')) {\n this.emit('write', `\\x1b[${3 + steady} q`)\n } else if (args.includes('bar') || args.includes('beam')) {\n this.emit('write', `\\x1b[${5 + steady} q`)\n } else {\n this.emit('write', '\\x1b[31mUsage: cursor [block|line|bar] [--steady]\\r\\n')\n }\n this.destroy()\n }\n },\n rainbow: class ToggleRainbow extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.rainbow = !this.shell.terminal.rainbow\n this.shell.terminal.rainbowTimer()\n this.emit('write', '')\n this.destroy()\n }\n },\n pwd: '/this/is/a/demo\\r\\n',\n cd: '\\x1b[38;5;239mNo directories to change to\\r\\n',\n whoami: `${window.navigator.userAgent}\\r\\n`,\n hostname: `${window.location.hostname}`,\n uname: 'ESPTerm Demo\\r\\n',\n mkdir: '\\x1b[38;5;239mDid not create a directory because this is a demo.\\r\\n',\n rm: '\\x1b[38;5;239mDid not delete anything because this is a demo.\\r\\n',\n cp: '\\x1b[38;5;239mNothing to copy because this is a demo.\\r\\n',\n mv: '\\x1b[38;5;239mNothing to move because this is a demo.\\r\\n',\n ln: '\\x1b[38;5;239mNothing to link because this is a demo.\\r\\n',\n touch: '\\x1b[38;5;239mNothing to touch\\r\\n',\n exit: '\\x1b[38;5;239mNowhere to go\\r\\n'\n}\n\nclass DemoShell {\n constructor (terminal, printInfo) {\n this.terminal = terminal\n this.terminal.reset()\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n this.input = ''\n this.cursorPos = 0\n this.child = null\n this.index = demoshIndex\n\n if (printInfo) this.run('info')\n else this.prompt()\n }\n write (text) {\n if (this.child) {\n if (text.codePointAt(0) === 3) this.child.destroy()\n else this.child.write(text)\n } else this.parser.write(text)\n }\n prompt (success = true) {\n if (this.terminal.cursor.x !== 0) this.terminal.write('\\x1b[m\\x1b[38;5;238m⏎\\r\\n')\n this.terminal.write('\\x1b[34;1mdemosh \\x1b[m')\n if (!success) this.terminal.write('\\x1b[31m')\n this.terminal.write('$ \\x1b[m')\n this.input = ''\n this.cursorPos = 0\n }\n handleParsed (action, ...args) {\n this.terminal.write('\\b\\x1b[P'.repeat(this.cursorPos))\n if (action === 'write') {\n this.input = this.input.substr(0, this.cursorPos) + args[0] + this.input.substr(this.cursorPos)\n this.cursorPos++\n } else if (action === 'back') {\n this.input = this.input.substr(0, this.cursorPos - 1) + this.input.substr(this.cursorPos)\n this.cursorPos--\n if (this.cursorPos < 0) this.cursorPos = 0\n } else if (action === 'move-cursor-x') {\n this.cursorPos = Math.max(0, Math.min(this.input.length, this.cursorPos + args[0]))\n } else if (action === 'delete-line') {\n this.input = ''\n this.cursorPos = 0\n } else if (action === 'delete-word') {\n let words = this.input.substr(0, this.cursorPos).split(' ')\n words.pop()\n this.input = words.join(' ') + this.input.substr(this.cursorPos)\n this.cursorPos = words.join(' ').length\n }\n\n this.terminal.write(this.input)\n this.terminal.write('\\b'.repeat(this.input.length))\n this.terminal.moveForward(this.cursorPos)\n this.terminal.write('') // dummy. Apply the moveFoward\n\n if (action === 'return') {\n this.terminal.write('\\r\\n')\n this.parse(this.input)\n }\n }\n parse (input) {\n if (input === 'help') input = 'info'\n // TODO: basic chaining (i.e. semicolon)\n this.run(input)\n }\n run (command) {\n let parts = ['']\n\n let inQuote = false\n for (let character of command.trim()) {\n if (inQuote && character !== inQuote) {\n parts[parts.length - 1] += character\n } else if (inQuote) {\n inQuote = false\n } else if (character === '\"' || character === \"'\") {\n inQuote = character\n } else if (character.match(/\\s/)) {\n if (parts[parts.length - 1]) parts.push('')\n } else parts[parts.length - 1] += character\n }\n\n let name = parts.shift()\n if (name in this.index) {\n this.spawn(name, parts)\n } else {\n this.terminal.write(`demosh: Unknown command: ${name}\\r\\n`)\n this.prompt(false)\n }\n }\n spawn (name, args = []) {\n let Process = this.index[name]\n if (Process instanceof Function) {\n this.child = new Process(this)\n let write = data => this.terminal.write(data)\n this.child.on('write', write)\n this.child.on('exit', code => {\n if (this.child) this.child.off('write', write)\n this.child = null\n this.prompt(!code)\n })\n this.child.run(...args)\n } else {\n this.terminal.write(Process)\n this.prompt()\n }\n }\n}\n\nwindow.demoInterface = {\n input (data) {\n let type = data[0]\n let content = data.substr(1)\n\n if (type === 's') {\n this.shell.write(content)\n } else if (type === 'b') {\n let button = content.charCodeAt(0)\n let action = demoData.buttons[button]\n if (action) {\n if (typeof action === 'string') this.shell.write(action)\n else if (action instanceof Function) action(this.terminal, this.shell)\n }\n } else if (type === 'm' || type === 'p' || type === 'r') {\n console.log(JSON.stringify(data))\n }\n },\n init (screen) {\n this.terminal = new ScrollingTerminal(screen)\n this.shell = new DemoShell(this.terminal, true)\n }\n}\n","// Generated from PHP locale file\nlet _tr = {\n \"wifi.connected_ip_is\": \"Connected, IP is \",\n \"wifi.not_conn\": \"Not connected.\",\n \"wifi.enter_passwd\": \"Enter password for \\\":ssid:\\\"\"\n};\n\nfunction tr (key) { return _tr[key] || '?' + key + '?' }\n","(function (w) {\n const authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']\n let curSSID\n\n // Get XX % for a slider input\n function rangePt (inp) {\n return Math.round(((inp.value / inp.max) * 100)) + '%'\n }\n\n // Display selected STA SSID etc\n function selectSta (name, password, ip) {\n $('#sta_ssid').val(name)\n $('#sta_password').val(password)\n\n $('#sta-nw').toggleClass('hidden', name.length === 0)\n $('#sta-nw-nil').toggleClass('hidden', name.length > 0)\n\n $('#sta-nw .essid').html(esc(name))\n const nopw = undef(password) || password.length === 0\n $('#sta-nw .passwd').toggleClass('hidden', nopw)\n $('#sta-nw .nopasswd').toggleClass('hidden', !nopw)\n $('#sta-nw .ip').html(ip.length > 0 ? tr('wifi.connected_ip_is') + ip : tr('wifi.not_conn'))\n }\n\n /** Update display for received response */\n function onScan (resp, status) {\n // var ap_json = {\n // \"result\": {\n // \"inProgress\": \"0\",\n // \"APs\": [\n // {\"essid\": \"Chlivek\", \"bssid\": \"88:f7:c7:52:b3:99\", \"rssi\": \"204\", \"enc\": \"4\", \"channel\": \"1\"},\n // {\"essid\": \"TyNikdy\", \"bssid\": \"5c:f4:ab:0d:f1:1b\", \"rssi\": \"164\", \"enc\": \"3\", \"channel\": \"1\"},\n // ]\n // }\n // };\n\n if (status !== 200) {\n // bad response\n rescan(5000) // wait 5sm then retry\n return\n }\n\n try {\n resp = JSON.parse(resp)\n } catch (e) {\n console.log(e)\n rescan(5000)\n return\n }\n\n const done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0)\n rescan(done ? 15000 : 1000)\n if (!done) return // no redraw yet\n\n // clear the AP list\n let $list = $('#ap-list')\n // remove old APs\n $('#ap-list .AP').remove()\n\n $list.toggleClass('hidden', !done)\n $('#ap-loader').toggleClass('hidden', done)\n\n // scan done\n resp.result.APs.sort(function (a, b) {\n return b.rssi - a.rssi\n }).forEach(function (ap) {\n ap.enc = parseInt(ap.enc)\n\n if (ap.enc > 4) return // hide unsupported auths\n\n let item = mk('div')\n\n let $item = $(item)\n .data('ssid', ap.essid)\n .data('pwd', ap.enc)\n .attr('tabindex', 0)\n .addClass('AP')\n\n // mark current SSID\n if (ap.essid === curSSID) {\n $item.addClass('selected')\n }\n\n let inner = mk('div')\n let escapedSSID = $.htmlEscape(ap.essid)\n $(inner).addClass('inner')\n .htmlAppend(`
${ap.rssi_perc}
`)\n .htmlAppend(`
${escapedSSID}
`)\n .htmlAppend(`
${authStr[ap.enc]}
`)\n\n $item.on('click', function () {\n let $th = $(this)\n\n const conn_ssid = $th.data('ssid')\n let conn_pass = ''\n\n if (+$th.data('pwd')) {\n // this AP needs a password\n conn_pass = prompt(tr('wifi.enter_passwd').replace(':ssid:', conn_ssid))\n if (!conn_pass) return\n }\n\n $('#sta_password').val(conn_pass)\n $('#sta_ssid').val(conn_ssid)\n selectSta(conn_ssid, conn_pass, '')\n })\n\n item.appendChild(inner)\n $list[0].appendChild(item)\n })\n }\n\n function startScanning () {\n $('#ap-loader').removeClass('hidden')\n $('#ap-scan').addClass('hidden')\n $('#ap-loader .anim-dots').html('.')\n\n scanAPs()\n }\n\n /** Ask the CGI what APs are visible (async) */\n function scanAPs () {\n if (_demo) {\n onScan(_demo_aps, 200)\n } else {\n $.get('http://' + _root + '/cfg/wifi/scan', onScan)\n }\n }\n\n function rescan (time) {\n setTimeout(scanAPs, time)\n }\n\n /** Set up the WiFi page */\n function wifiInit (cfg) {\n // Update slider value displays\n $('.Row.range').forEach(function (x) {\n let inp = x.querySelector('input')\n let disp1 = x.querySelector('.x-disp1')\n let disp2 = x.querySelector('.x-disp2')\n let t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n $(inp).on('input', function () {\n t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n })\n })\n\n // Forget STA credentials\n $('#forget-sta').on('click', function () {\n selectSta('', '', '')\n return false\n })\n\n selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip)\n curSSID = cfg.sta_active_ssid\n }\n\n w.init = wifiInit\n w.startScanning = startScanning\n})(window.WiFi = {})\n","/** Handle connections */\nwindow.Conn = function (screen) {\n let ws\n let heartbeatTout\n let pingIv\n let xoff = false\n let autoXoffTout\n let reconTout\n\n let pageShown = false\n\n function onOpen (evt) {\n console.log('CONNECTED')\n heartbeat()\n doSend('i')\n }\n\n function onClose (evt) {\n console.warn('SOCKET CLOSED, code ' + evt.code + '. Reconnecting...')\n clearTimeout(reconTout)\n reconTout = setTimeout(function () {\n init()\n }, 2000)\n // this happens when the buffer gets fucked up via invalid unicode.\n // we basically use polling instead of socket then\n }\n\n function onMessage (evt) {\n try {\n // . = heartbeat\n switch (evt.data.charAt(0)) {\n case '.':\n // heartbeat, no-op message\n break\n\n case '-':\n // console.log('xoff');\n xoff = true\n autoXoffTout = setTimeout(function () {\n xoff = false\n }, 250)\n break\n\n case '+':\n // console.log('xon');\n xoff = false\n clearTimeout(autoXoffTout)\n break\n\n default:\n screen.load(evt.data)\n if (!pageShown) {\n showPage()\n pageShown = true\n }\n break\n }\n heartbeat()\n } catch (e) {\n console.error(e)\n }\n }\n\n function canSend () {\n return !xoff\n }\n\n function doSend (message) {\n if (_demo) {\n if (typeof demoInterface !== 'undefined') {\n demoInterface.input(message)\n } else {\n console.log(`TX: ${JSON.stringify(message)}`)\n }\n return true // Simulate success\n }\n if (xoff) {\n // TODO queue\n console.log(\"Can't send, flood control.\")\n return false\n }\n\n if (!ws) return false // for dry testing\n if (ws.readyState !== 1) {\n console.error('Socket not ready')\n return false\n }\n if (typeof message != 'string') {\n message = JSON.stringify(message)\n }\n ws.send(message)\n return true\n }\n\n function init () {\n if (window._demo) {\n if (typeof demoInterface === 'undefined') {\n alert('Demoing non-demo demo!') // this will catch mistakes when deploying to the website\n } else {\n demoInterface.init(screen)\n showPage()\n }\n return\n }\n\n clearTimeout(reconTout)\n clearTimeout(heartbeatTout)\n\n ws = new WebSocket('ws://' + _root + '/term/update.ws')\n ws.onopen = onOpen\n ws.onclose = onClose\n ws.onmessage = onMessage\n console.log('Opening socket.')\n heartbeat()\n }\n\n function heartbeat () {\n clearTimeout(heartbeatTout)\n heartbeatTout = setTimeout(heartbeatFail, 2000)\n }\n\n function heartbeatFail () {\n console.error('Heartbeat lost, probing server...')\n pingIv = setInterval(function () {\n console.log('> ping')\n $.get('http://' + _root + '/system/ping', function (resp, status) {\n if (status === 200) {\n clearInterval(pingIv)\n console.info('Server ready, reloading page...')\n location.reload()\n }\n }, {\n timeout: 100\n })\n }, 1000)\n }\n\n return {\n ws: null,\n init: init,\n send: doSend,\n canSend: canSend // check flood control\n }\n}\n","/**\n * User input\n *\n * --- Rx messages: ---\n * S - screen content (binary encoding of the entire screen with simple compression)\n * T - text labels - Title and buttons, \\0x01-separated\n * B - beep\n * . - heartbeat\n *\n * --- Tx messages ---\n * s - string\n * b - action button\n * p - mb press\n * r - mb release\n * m - mouse move\n */\nwindow.Input = function (conn) {\n let cfg = {\n np_alt: false,\n cu_alt: false,\n fn_alt: false,\n mt_click: false,\n mt_move: false,\n no_keys: false,\n crlf_mode: false\n }\n\n /** Send a literal message */\n function sendStrMsg (str) {\n return conn.send('s' + str)\n }\n\n /** Send a button event */\n function sendBtnMsg (n) {\n conn.send('b' + Chr(n))\n }\n\n /** Fn alt choice for key message */\n function fa (alt, normal) {\n return cfg.fn_alt ? alt : normal\n }\n\n /** Cursor alt choice for key message */\n function ca (alt, normal) {\n return cfg.cu_alt ? alt : normal\n }\n\n /** Numpad alt choice for key message */\n function na (alt, normal) {\n return cfg.np_alt ? alt : normal\n }\n\n function _bindFnKeys (allFn) {\n const keymap = {\n 'tab': '\\x09',\n 'backspace': '\\x08',\n 'enter': cfg.crlf_mode ? '\\x0d\\x0a' : '\\x0d',\n 'ctrl+enter': '\\x0a',\n 'esc': '\\x1b',\n 'up': ca('\\x1bOA', '\\x1b[A'),\n 'down': ca('\\x1bOB', '\\x1b[B'),\n 'right': ca('\\x1bOC', '\\x1b[C'),\n 'left': ca('\\x1bOD', '\\x1b[D'),\n 'home': ca('\\x1bOH', fa('\\x1b[H', '\\x1b[1~')),\n 'insert': '\\x1b[2~',\n 'delete': '\\x1b[3~',\n 'end': ca('\\x1bOF', fa('\\x1b[F', '\\x1b[4~')),\n 'pageup': '\\x1b[5~',\n 'pagedown': '\\x1b[6~',\n 'f1': fa('\\x1bOP', '\\x1b[11~'),\n 'f2': fa('\\x1bOQ', '\\x1b[12~'),\n 'f3': fa('\\x1bOR', '\\x1b[13~'),\n 'f4': fa('\\x1bOS', '\\x1b[14~'),\n 'f5': '\\x1b[15~', // note the disconnect\n 'f6': '\\x1b[17~',\n 'f7': '\\x1b[18~',\n 'f8': '\\x1b[19~',\n 'f9': '\\x1b[20~',\n 'f10': '\\x1b[21~', // note the disconnect\n 'f11': '\\x1b[23~',\n 'f12': '\\x1b[24~',\n 'shift+f1': fa('\\x1bO1;2P', '\\x1b[25~'),\n 'shift+f2': fa('\\x1bO1;2Q', '\\x1b[26~'), // note the disconnect\n 'shift+f3': fa('\\x1bO1;2R', '\\x1b[28~'),\n 'shift+f4': fa('\\x1bO1;2S', '\\x1b[29~'), // note the disconnect\n 'shift+f5': fa('\\x1b[15;2~', '\\x1b[31~'),\n 'shift+f6': fa('\\x1b[17;2~', '\\x1b[32~'),\n 'shift+f7': fa('\\x1b[18;2~', '\\x1b[33~'),\n 'shift+f8': fa('\\x1b[19;2~', '\\x1b[34~'),\n 'shift+f9': fa('\\x1b[20;2~', '\\x1b[35~'), // 35-38 are not standard - but what is?\n 'shift+f10': fa('\\x1b[21;2~', '\\x1b[36~'),\n 'shift+f11': fa('\\x1b[22;2~', '\\x1b[37~'),\n 'shift+f12': fa('\\x1b[23;2~', '\\x1b[38~'),\n 'np_0': na('\\x1bOp', '0'),\n 'np_1': na('\\x1bOq', '1'),\n 'np_2': na('\\x1bOr', '2'),\n 'np_3': na('\\x1bOs', '3'),\n 'np_4': na('\\x1bOt', '4'),\n 'np_5': na('\\x1bOu', '5'),\n 'np_6': na('\\x1bOv', '6'),\n 'np_7': na('\\x1bOw', '7'),\n 'np_8': na('\\x1bOx', '8'),\n 'np_9': na('\\x1bOy', '9'),\n 'np_mul': na('\\x1bOR', '*'),\n 'np_add': na('\\x1bOl', '+'),\n 'np_sub': na('\\x1bOS', '-'),\n 'np_point': na('\\x1bOn', '.'),\n 'np_div': na('\\x1bOQ', '/')\n // we don't implement numlock key (should change in numpad_alt mode, but it's even more useless than the rest)\n }\n\n const blacklist = [\n 'f5', 'f11', 'f12', 'shift+f5'\n ]\n\n for (let k in keymap) {\n if (!allFn && blacklist.includes(k)) continue\n if (keymap.hasOwnProperty(k)) {\n bind(k, keymap[k])\n }\n }\n }\n\n /** Bind a keystroke to message */\n function bind (combo, str) {\n // mac fix - allow also cmd\n if (combo.indexOf('ctrl+') !== -1) {\n combo += ',' + combo.replace('ctrl', 'command')\n }\n\n // unbind possible old binding\n key.unbind(combo)\n\n key(combo, function (e) {\n if (cfg.no_keys) return\n e.preventDefault()\n sendStrMsg(str)\n })\n }\n\n /** Bind/rebind key messages */\n function _initKeys (opts) {\n let { allFn } = opts\n\n // This takes care of text characters typed\n window.addEventListener('keypress', function (evt) {\n if (cfg.no_keys) return\n let str = ''\n if (evt.key) str = evt.key\n else if (evt.which) str = String.fromCodePoint(evt.which)\n if (str.length > 0 && str.charCodeAt(0) >= 32) {\n // console.log(\"Typed \", str);\n // prevent space from scrolling\n if (evt.which === 32) evt.preventDefault()\n sendStrMsg(str)\n }\n })\n\n // ctrl-letter codes are sent as simple low ASCII codes\n for (let i = 1; i <= 26; i++) {\n bind('ctrl+' + String.fromCharCode(96 + i), String.fromCharCode(i))\n }\n /* eslint-disable */\n bind('ctrl+]', '\\x1b') // alternate way to enter ESC\n bind('ctrl+\\\\', '\\x1c')\n bind('ctrl+[', '\\x1d')\n bind('ctrl+^', '\\x1e')\n bind('ctrl+_', '\\x1f')\n\n // extra ctrl-\n bind('ctrl+left', '\\x1f[1;5D')\n bind('ctrl+right', '\\x1f[1;5C')\n bind('ctrl+up', '\\x1f[1;5A')\n bind('ctrl+down', '\\x1f[1;5B')\n bind('ctrl+home', '\\x1f[1;5H')\n bind('ctrl+end', '\\x1f[1;5F')\n\n // extra shift-\n bind('shift+left', '\\x1f[1;2D')\n bind('shift+right', '\\x1f[1;2C')\n bind('shift+up', '\\x1f[1;2A')\n bind('shift+down', '\\x1f[1;2B')\n bind('shift+home', '\\x1f[1;2H')\n bind('shift+end', '\\x1f[1;2F')\n\n // macOS editing commands\n bind('⌥+left', '\\x1bb') // ⌥← to go back a word (^[b)\n bind('⌥+right', '\\x1bf') // ⌥→ to go forward one word (^[f)\n bind('⌘+left', '\\x01') // ⌘← to go to the beginning of a line (^A)\n bind('⌘+right', '\\x05') // ⌘→ to go to the end of a line (^E)\n bind('⌥+backspace', '\\x17') // ⌥⌫ to delete a word (^W, I think)\n bind('⌘+backspace', '\\x15') // ⌘⌫ to delete to the beginning of a line (possibly ^U)\n /* eslint-enable */\n\n _bindFnKeys(allFn)\n }\n\n // mouse button states\n let mb1 = 0\n let mb2 = 0\n let mb3 = 0\n\n /** Init the Input module */\n function init (opts) {\n _initKeys(opts)\n\n // Button presses\n $('#action-buttons button').forEach(function (s) {\n s.addEventListener('click', function () {\n sendBtnMsg(+this.dataset['n'])\n })\n })\n\n // global mouse state tracking - for motion reporting\n window.addEventListener('mousedown', function (evt) {\n if (evt.button === 0) mb1 = 1\n if (evt.button === 1) mb2 = 1\n if (evt.button === 2) mb3 = 1\n })\n\n window.addEventListener('mouseup', function (evt) {\n if (evt.button === 0) mb1 = 0\n if (evt.button === 1) mb2 = 0\n if (evt.button === 2) mb3 = 0\n })\n }\n\n /** Prepare modifiers byte for mouse message */\n function packModifiersForMouse () {\n return (key.isModifier('ctrl') ? 1 : 0) |\n (key.isModifier('shift') ? 2 : 0) |\n (key.isModifier('alt') ? 4 : 0) |\n (key.isModifier('meta') ? 8 : 0)\n }\n\n return {\n /** Init the Input module */\n init: init,\n\n /** Send a literal string message */\n sendString: sendStrMsg,\n\n /** Enable alternate key modes (cursors, numpad, fn) */\n setAlts: function (cu, np, fn, crlf) {\n if (cfg.cu_alt !== cu || cfg.np_alt !== np || cfg.fn_alt !== fn || cfg.crlf_mode !== crlf) {\n cfg.cu_alt = cu\n cfg.np_alt = np\n cfg.fn_alt = fn\n cfg.crlf_mode = crlf\n\n // rebind keys - codes have changed\n _bindFnKeys()\n }\n },\n\n setMouseMode: function (click, move) {\n cfg.mt_click = click\n cfg.mt_move = move\n },\n\n // Mouse events\n onMouseMove: function (x, y) {\n if (!cfg.mt_move) return\n const b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0\n const m = packModifiersForMouse()\n conn.send('m' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n },\n\n onMouseDown: function (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseUp: function (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('r' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseWheel: function (x, y, dir) {\n if (!cfg.mt_click) return\n // -1 ... btn 4 (away from user)\n // +1 ... btn 5 (towards user)\n const m = packModifiersForMouse()\n const b = (dir < 0 ? 4 : 5)\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n mouseTracksClicks: function () {\n return cfg.mt_click\n },\n\n blockKeys: function (yes) {\n cfg.no_keys = yes\n }\n }\n}\n","// Some non-bold Fraktur symbols are outside the contiguous block\nconst frakturExceptions = {\n 'C': '\\u212d',\n 'H': '\\u210c',\n 'I': '\\u2111',\n 'R': '\\u211c',\n 'Z': '\\u2128'\n}\n\n// constants for decoding the update blob\nconst SEQ_REPEAT = 2\nconst SEQ_SET_COLORS = 3\nconst SEQ_SET_ATTRS = 4\nconst SEQ_SET_FG = 5\nconst SEQ_SET_BG = 6\n\nconst SELECTION_BG = '#b2d7fe'\nconst SELECTION_FG = '#333'\n\nconst themes = [\n [ // Tango\n '#111213', '#CC0000', '#4E9A06', '#C4A000', '#3465A4', '#75507B', '#06989A', '#D3D7CF',\n '#555753', '#EF2929', '#8AE234', '#FCE94F', '#729FCF', '#AD7FA8', '#34E2E2', '#EEEEEC'\n ],\n [ // Linux\n '#000000', '#aa0000', '#00aa00', '#aa5500', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa',\n '#555555', '#ff5555', '#55ff55', '#ffff55', '#5555ff', '#ff55ff', '#55ffff', '#ffffff'\n ],\n [ // xterm\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5',\n '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // rxvt\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000cd', '#cd00cd', '#00cdcd', '#faebd7',\n '#404040', '#ff0000', '#00ff00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // Ambience\n '#2e3436', '#cc0000', '#4e9a06', '#c4a000', '#3465a4', '#75507b', '#06989a', '#d3d7cf',\n '#555753', '#ef2929', '#8ae234', '#fce94f', '#729fcf', '#ad7fa8', '#34e2e2', '#eeeeec'\n ],\n [ // Solarized\n '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5',\n '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3'\n ]\n]\n\n// TODO move this to the initializer so it's not run on non-terminal pages\n\n// 256color lookup table\n// should not be used to look up 0-15 (will return transparent)\nconst colorTable256 = new Array(16).fill('rgba(0, 0, 0, 0)')\n\n// fill color table\n// colors 16-231 are a 6x6x6 color cube\nfor (let red = 0; red < 6; red++) {\n for (let green = 0; green < 6; green++) {\n for (let blue = 0; blue < 6; blue++) {\n let redValue = red * 40 + (red ? 55 : 0)\n let greenValue = green * 40 + (green ? 55 : 0)\n let blueValue = blue * 40 + (blue ? 55 : 0)\n colorTable256.push(`rgb(${redValue}, ${greenValue}, ${blueValue})`)\n }\n }\n}\n// colors 232-255 are a grayscale ramp, sans black and white\nfor (let gray = 0; gray < 24; gray++) {\n let value = gray * 10 + 8\n colorTable256.push(`rgb(${value}, ${value}, ${value})`)\n}\n\nwindow.TermScreen = class TermScreen {\n constructor () {\n this.canvas = mk('canvas')\n this.ctx = this.canvas.getContext('2d')\n\n if ('AudioContext' in window || 'webkitAudioContext' in window) {\n this.audioCtx = new (window.AudioContext || window.webkitAudioContext)()\n } else {\n console.warn('No AudioContext!')\n }\n\n // dummy\n this.input = new Proxy({}, {\n get () {\n return () => console.warn('TermScreen#input not set!')\n }\n })\n\n this.cursor = {\n x: 0,\n y: 0,\n blinkOn: false,\n blinking: true,\n visible: true,\n hanging: false,\n style: 'block',\n blinkInterval: null\n }\n\n this._palette = null\n\n this._window = {\n width: 0,\n height: 0,\n devicePixelRatio: 1,\n fontFamily: '\"DejaVu Sans Mono\", \"Liberation Mono\", \"Inconsolata\", \"Menlo\", monospace',\n fontSize: 20,\n gridScaleX: 1.0,\n gridScaleY: 1.2,\n blinkStyleOn: true,\n blinkInterval: null,\n fitIntoWidth: 0,\n fitIntoHeight: 0,\n debug: false,\n graphics: 0\n }\n\n // scaling caused by fitIntoWidth/fitIntoHeight\n this._windowScale = 1\n\n // properties of this.window that require updating size and redrawing\n this.windowState = {\n width: 0,\n height: 0,\n devicePixelRatio: 0,\n gridScaleX: 0,\n gridScaleY: 0,\n fontFamily: '',\n fontSize: 0,\n fitIntoWidth: 0,\n fitIntoHeight: 0\n }\n\n // current selection\n this.selection = {\n // when false, this will prevent selection in favor of mouse events,\n // though alt can be held to override it\n selectable: true,\n\n // selection start and end (x, y) tuples\n start: [0, 0],\n end: [0, 0]\n }\n\n // mouse features\n this.mouseMode = { clicks: false, movement: false }\n\n // event listeners\n this._listeners = {}\n\n // make writing to window update size and draw\n const self = this\n this.window = new Proxy(this._window, {\n set (target, key, value, receiver) {\n target[key] = value\n self.scheduleSizeUpdate()\n self.scheduleDraw(`window:${key}=${value}`)\n return true\n }\n })\n\n this.bracketedPaste = false\n this.blinkingCellCount = 0\n\n this.screen = []\n this.screenFG = []\n this.screenBG = []\n this.screenAttrs = []\n\n // used to determine if a cell should be redrawn; storing the current state\n // as it is on screen\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n this.drawnCursor = [-1, -1, '']\n\n // start blink timers\n this.resetBlink()\n this.resetCursorBlink()\n\n let selecting = false\n\n let selectStart = (x, y) => {\n if (selecting) return\n selecting = true\n this.selection.start = this.selection.end = this.screenToGrid(x, y)\n this.scheduleDraw('select-start')\n }\n\n let selectMove = (x, y) => {\n if (!selecting) return\n this.selection.end = this.screenToGrid(x, y)\n this.scheduleDraw('select-move')\n }\n\n let selectEnd = (x, y) => {\n if (!selecting) return\n selecting = false\n this.selection.end = this.screenToGrid(x, y)\n this.scheduleDraw('select-end')\n Object.assign(this.selection, this.getNormalizedSelection())\n }\n\n // bind event listeners\n\n this.canvas.addEventListener('mousedown', e => {\n if ((this.selection.selectable || e.altKey) && e.button === 0) {\n selectStart(e.offsetX, e.offsetY)\n } else {\n this.input.onMouseDown(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n window.addEventListener('mousemove', e => {\n selectMove(e.offsetX, e.offsetY)\n })\n\n window.addEventListener('mouseup', e => {\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // touch event listeners\n\n let touchPosition = null\n let touchDownTime = 0\n let touchSelectMinTime = 500\n let touchDidMove = false\n\n let getTouchPositionOffset = touch => {\n let rect = this.canvas.getBoundingClientRect()\n return [touch.clientX - rect.left, touch.clientY - rect.top]\n }\n\n this.canvas.addEventListener('touchstart', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n touchDidMove = false\n touchDownTime = Date.now()\n })\n\n this.canvas.addEventListener('touchmove', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n\n if (!selecting && touchDidMove === false) {\n if (touchDownTime < Date.now() - touchSelectMinTime) {\n selectStart(...touchPosition)\n }\n } else if (selecting) {\n e.preventDefault()\n selectMove(...touchPosition)\n }\n\n touchDidMove = true\n })\n\n this.canvas.addEventListener('touchend', e => {\n if (e.touches[0]) {\n touchPosition = getTouchPositionOffset(e.touches[0])\n }\n\n if (selecting) {\n e.preventDefault()\n selectEnd(...touchPosition)\n\n // selection ended; show touch select menu\n let touchSelectMenu = qs('#touch-select-menu')\n touchSelectMenu.classList.add('open')\n let rect = touchSelectMenu.getBoundingClientRect()\n\n // use middle position for x and one line above for y\n let selectionPos = this.gridToScreen(\n (this.selection.start[0] + this.selection.end[0]) / 2,\n this.selection.start[1] - 1\n )\n selectionPos[0] -= rect.width / 2\n selectionPos[1] -= rect.height / 2\n touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${\n selectionPos[1]}px)`\n }\n\n if (!touchDidMove) {\n this.emit('tap', Object.assign(e, {\n x: touchPosition[0],\n y: touchPosition[1]\n }))\n }\n\n touchPosition = null\n })\n\n this.on('tap', e => {\n if (this.selection.start[0] !== this.selection.end[0] ||\n this.selection.start[1] !== this.selection.end[1]) {\n // selection is not empty\n // reset selection\n this.selection.start = this.selection.end = [0, 0]\n qs('#touch-select-menu').classList.remove('open')\n this.scheduleDraw('select-reset')\n } else {\n e.preventDefault()\n this.emit('open-soft-keyboard')\n }\n })\n\n $.ready(() => {\n let copyButton = qs('#touch-select-copy-btn')\n if (copyButton) {\n copyButton.addEventListener('click', () => {\n this.copySelectionToClipboard()\n })\n }\n })\n\n this.canvas.addEventListener('mousemove', e => {\n if (!selecting) {\n this.input.onMouseMove(...this.screenToGrid(e.offsetX, e.offsetY))\n }\n })\n\n this.canvas.addEventListener('mouseup', e => {\n if (!selecting) {\n this.input.onMouseUp(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n this.canvas.addEventListener('wheel', e => {\n if (this.mouseMode.clicks) {\n this.input.onMouseWheel(...this.screenToGrid(e.offsetX, e.offsetY),\n e.deltaY > 0 ? 1 : -1)\n\n // prevent page scrolling\n e.preventDefault()\n }\n })\n\n this.canvas.addEventListener('contextmenu', e => {\n if (this.mouseMode.clicks) {\n // prevent mouse keys getting stuck\n e.preventDefault()\n }\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // bind ctrl+shift+c to copy\n key('⌃+⇧+c', e => {\n e.preventDefault()\n this.copySelectionToClipboard()\n })\n }\n\n /**\n * Bind an event listener to an event\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n on (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener })\n }\n\n /**\n * Bind an event listener to be run only once the next time the event fires\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n once (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener, once: true })\n }\n\n /**\n * Remove an event listener\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n off (event, listener) {\n let listeners = this._listeners[event]\n if (listeners) {\n for (let i in listeners) {\n if (listeners[i].listener === listener) {\n listeners.splice(i, 1)\n break\n }\n }\n }\n }\n\n /**\n * Emits an event\n * @param {string} event - the event name\n * @param {...any} args - arguments passed to all listeners\n */\n emit (event, ...args) {\n let listeners = this._listeners[event]\n if (listeners) {\n let remove = []\n for (let listener of listeners) {\n try {\n listener.listener(...args)\n if (listener.once) remove.push(listener)\n } catch (err) {\n console.error(err)\n }\n }\n\n // this needs to be done in this roundabout way because for loops\n // do not like arrays with changing lengths\n for (let listener of remove) {\n listeners.splice(listeners.indexOf(listener), 1)\n }\n }\n }\n\n /**\n * The color palette. Should define 16 colors in an array.\n * @type {number[]}\n */\n get palette () {\n return this._palette || themes[0]\n }\n /** @type {number[]} */\n set palette (palette) {\n if (this._palette !== palette) {\n this._palette = palette\n this.scheduleDraw('palette')\n }\n }\n\n /**\n * Returns the specified color. If `i` is in the palette, it will return the\n * palette color. If `i` is between 16 and 255, it will return the 256color\n * value. If `i` is larger than 255, it will return an RGB color value. If `i`\n * is -1 (foreground) or -2 (background), it will return the selection colors.\n * @param {number} i - the color\n * @returns {string} the CSS color\n */\n getColor (i) {\n // return palette color if it exists\n if (this.palette[i]) return this.palette[i]\n\n // -1 for selection foreground, -2 for selection background\n if (i === -1) return SELECTION_FG\n if (i === -2) return SELECTION_BG\n\n // 256 color\n if (i > 15 && i < 256) return colorTable256[i]\n\n // true color, encoded as (hex) + 256 (such that #000 == 256)\n if (i > 255) {\n i -= 256\n let red = (i >> 16) & 0xFF\n let green = (i >> 8) & 0xFF\n let blue = i & 0xFF\n return `rgb(${red}, ${green}, ${blue})`\n }\n\n // default to transparent\n return 'rgba(0, 0, 0, 0)'\n }\n\n /**\n * Schedule a size update in the next millisecond\n */\n scheduleSizeUpdate () {\n clearTimeout(this._scheduledSizeUpdate)\n this._scheduledSizeUpdate = setTimeout(() => this.updateSize(), 1)\n }\n\n /**\n * Schedule a draw in the next millisecond\n * @param {string} why - the reason why the draw occured (for debugging)\n * @param {number} [aggregateTime] - time to wait for more scheduleDraw calls\n * to occur. 1 ms by default.\n */\n scheduleDraw (why, aggregateTime = 1) {\n clearTimeout(this._scheduledDraw)\n this._scheduledDraw = setTimeout(() => this.draw(why), aggregateTime)\n }\n\n /**\n * Returns a CSS font string with this TermScreen's font settings and the\n * font modifiers.\n * @param {Object} modifiers\n * @param {string} [modifiers.style] - the font style\n * @param {string} [modifiers.weight] - the font weight\n * @returns {string} a CSS font string\n */\n getFont (modifiers = {}) {\n let fontStyle = modifiers.style || 'normal'\n let fontWeight = modifiers.weight || 'normal'\n return `${fontStyle} normal ${fontWeight} ${this.window.fontSize}px ${this.window.fontFamily}`\n }\n\n /**\n * The character size, used for calculating the cell size. The space character\n * is used for measuring.\n * @returns {Object} the character size with `width` and `height` in pixels\n */\n getCharSize () {\n this.ctx.font = this.getFont()\n\n return {\n width: Math.floor(this.ctx.measureText(' ').width),\n height: this.window.fontSize\n }\n }\n\n /**\n * The cell size, which is the character size multiplied by the grid scale.\n * @returns {Object} the cell size with `width` and `height` in pixels\n */\n getCellSize () {\n let charSize = this.getCharSize()\n\n return {\n width: Math.ceil(charSize.width * this.window.gridScaleX),\n height: Math.ceil(charSize.height * this.window.gridScaleY)\n }\n }\n\n /**\n * Updates the canvas size if it changed\n */\n updateSize () {\n this._window.devicePixelRatio = this._windowScale * (window.devicePixelRatio || 1)\n\n let didChange = false\n for (let key in this.windowState) {\n if (this.windowState.hasOwnProperty(key) && this.windowState[key] !== this.window[key]) {\n didChange = true\n this.windowState[key] = this.window[key]\n }\n }\n\n if (didChange) {\n const {\n width,\n height,\n gridScaleX,\n gridScaleY,\n fitIntoWidth,\n fitIntoHeight\n } = this.window\n const cellSize = this.getCellSize()\n\n // real height of the canvas element in pixels\n let realWidth = width * cellSize.width\n let realHeight = height * cellSize.height\n\n if (fitIntoWidth && fitIntoHeight) {\n let terminalAspect = realWidth / realHeight\n let fitAspect = fitIntoWidth / fitIntoHeight\n\n if (terminalAspect < fitAspect) {\n // align heights\n realHeight = fitIntoHeight\n realWidth = realHeight * terminalAspect\n } else {\n // align widths\n realWidth = fitIntoWidth\n realHeight = realWidth / terminalAspect\n }\n } else if (fitIntoWidth) {\n realHeight = fitIntoWidth / (realWidth / realHeight)\n realWidth = fitIntoWidth\n } else if (fitIntoHeight) {\n realWidth = fitIntoHeight * (realWidth / realHeight)\n realHeight = fitIntoHeight\n }\n\n // store new window scale\n this._windowScale = realWidth / (width * cellSize.width)\n\n let devicePixelRatio = this._window.devicePixelRatio = this._windowScale * window.devicePixelRatio\n\n this.canvas.width = width * devicePixelRatio * cellSize.width\n this.canvas.style.width = `${realWidth}px`\n this.canvas.height = height * devicePixelRatio * cellSize.height\n this.canvas.style.height = `${realHeight}px`\n\n // the screen has been cleared (by changing canvas width)\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n\n // draw immediately; the canvas shouldn't flash\n this.draw('init')\n }\n }\n\n /**\n * Resets the cursor blink to on and restarts the timer\n */\n resetCursorBlink () {\n this.cursor.blinkOn = true\n clearInterval(this.cursor.blinkInterval)\n this.cursor.blinkInterval = setInterval(() => {\n this.cursor.blinkOn = this.cursor.blinking\n ? !this.cursor.blinkOn\n : true\n if (this.cursor.blinking) this.scheduleDraw('cursor-blink')\n }, 500)\n }\n\n /**\n * Resets the blink style to on and restarts the timer\n */\n resetBlink () {\n this.window.blinkStyleOn = true\n clearInterval(this.window.blinkInterval)\n let intervals = 0\n this.window.blinkInterval = setInterval(() => {\n if (this.blinkingCellCount <= 0) return\n\n intervals++\n if (intervals >= 4 && this.window.blinkStyleOn) {\n this.window.blinkStyleOn = false\n intervals = 0\n } else if (intervals >= 1 && !this.window.blinkStyleOn) {\n this.window.blinkStyleOn = true\n intervals = 0\n }\n }, 200)\n }\n\n /**\n * Returns a normalized version of the current selection, such that `start`\n * is always before `end`.\n * @returns {Object} the normalized selection, with `start` and `end`\n */\n getNormalizedSelection () {\n let { start, end } = this.selection\n // if the start line is after the end line, or if they're both on the same\n // line but the start column comes after the end column, swap\n if (start[1] > end[1] || (start[1] === end[1] && start[0] > end[0])) {\n [start, end] = [end, start]\n }\n return { start, end }\n }\n\n /**\n * Returns whether or not a given cell is in the current selection.\n * @param {number} col - the column (x)\n * @param {number} line - the line (y)\n * @returns {boolean}\n */\n isInSelection (col, line) {\n let { start, end } = this.getNormalizedSelection()\n let colAfterStart = start[0] <= col\n let colBeforeEnd = col < end[0]\n let onStartLine = line === start[1]\n let onEndLine = line === end[1]\n\n if (onStartLine && onEndLine) return colAfterStart && colBeforeEnd\n else if (onStartLine) return colAfterStart\n else if (onEndLine) return colBeforeEnd\n else return start[1] < line && line < end[1]\n }\n\n /**\n * Sweeps for selected cells and joins them in a multiline string.\n * @returns {string} the selection\n */\n getSelectedText () {\n const screenLength = this.window.width * this.window.height\n let lines = []\n let previousLineIndex = -1\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % this.window.width\n let y = Math.floor(cell / this.window.width)\n\n if (this.isInSelection(x, y)) {\n if (previousLineIndex !== y) {\n previousLineIndex = y\n lines.push('')\n }\n lines[lines.length - 1] += this.screen[cell]\n }\n }\n\n return lines.join('\\n')\n }\n\n /**\n * Copies the selection to clipboard and creates a notification balloon.\n */\n copySelectionToClipboard () {\n let selectedText = this.getSelectedText()\n // don't copy anything if nothing is selected\n if (!selectedText) return\n let textarea = mk('textarea')\n document.body.appendChild(textarea)\n textarea.value = selectedText\n textarea.select()\n if (document.execCommand('copy')) {\n Notify.show('Copied to clipboard')\n } else {\n Notify.show('Failed to copy')\n }\n document.body.removeChild(textarea)\n }\n\n /**\n * Converts screen coordinates to grid coordinates.\n * @param {number} x - x in pixels\n * @param {number} y - y in pixels\n * @returns {number[]} a tuple of (x, y) in cells\n */\n screenToGrid (x, y) {\n let cellSize = this.getCellSize()\n\n return [\n Math.floor((x + cellSize.width / 2) / cellSize.width),\n Math.floor(y / cellSize.height)\n ]\n }\n\n /**\n * Converts grid coordinates to screen coordinates.\n * @param {number} x - x in cells\n * @param {number} y - y in cells\n * @param {boolean} [withScale] - when true, will apply window scale\n * @returns {number[]} a tuple of (x, y) in pixels\n */\n gridToScreen (x, y, withScale = false) {\n let cellSize = this.getCellSize()\n\n return [x * cellSize.width, y * cellSize.height].map(v => withScale ? v * this._windowScale : v)\n }\n\n /**\n * Draws a cell's background with the given parameters.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {number} options.bg - the background color\n */\n drawCellBackground ({ x, y, cellWidth, cellHeight, bg }) {\n const ctx = this.ctx\n ctx.fillStyle = this.getColor(bg)\n ctx.clearRect(x * cellWidth, y * cellHeight, Math.ceil(cellWidth), Math.ceil(cellHeight))\n ctx.fillRect(x * cellWidth, y * cellHeight, Math.ceil(cellWidth), Math.ceil(cellHeight))\n }\n\n /**\n * Draws a cell's character with the given parameters. Won't do anything if\n * text is an empty string.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {Object} options.charSize - the character size, an object with\n * `width` and `height` in pixels\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {string} options.text - the cell content\n * @param {number} options.fg - the foreground color\n * @param {number} options.attrs - the cell's attributes\n */\n drawCell ({ x, y, charSize, cellWidth, cellHeight, text, fg, attrs }) {\n if (!text) return\n\n const ctx = this.ctx\n\n let underline = false\n let strike = false\n let overline = false\n if (attrs & (1 << 1)) ctx.globalAlpha = 0.5\n if (attrs & (1 << 3)) underline = true\n if (attrs & (1 << 5)) text = TermScreen.alphaToFraktur(text)\n if (attrs & (1 << 6)) strike = true\n if (attrs & (1 << 7)) overline = true\n\n ctx.fillStyle = this.getColor(fg)\n ctx.fillText(text, (x + 0.5) * cellWidth, (y + 0.5) * cellHeight)\n\n if (underline || strike || overline) {\n ctx.strokeStyle = this.getColor(fg)\n ctx.lineWidth = 1\n ctx.lineCap = 'round'\n ctx.beginPath()\n\n if (underline) {\n let lineY = Math.round(y * cellHeight + charSize.height) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (strike) {\n let lineY = Math.round((y + 0.5) * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (overline) {\n let lineY = Math.round(y * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n ctx.stroke()\n }\n\n ctx.globalAlpha = 1\n }\n\n /**\n * Returns all adjacent cell indices given a radius.\n * @param {number} cell - the center cell index\n * @param {number} [radius] - the radius. 1 by default\n * @returns {number[]} an array of cell indices\n */\n getAdjacentCells (cell, radius = 1) {\n const { width, height } = this.window\n const screenLength = width * height\n\n let cells = []\n\n for (let x = -radius; x <= radius; x++) {\n for (let y = -radius; y <= radius; y++) {\n if (x === 0 && y === 0) continue\n cells.push(cell + x + y * width)\n }\n }\n\n return cells.filter(cell => cell >= 0 && cell < screenLength)\n }\n\n /**\n * Updates the screen.\n * @param {string} why - the draw reason (for debugging)\n */\n draw (why) {\n const ctx = this.ctx\n const {\n width,\n height,\n devicePixelRatio,\n gridScaleX,\n gridScaleY\n } = this.window\n\n const charSize = this.getCharSize()\n const { width: cellWidth, height: cellHeight } = this.getCellSize()\n const screenWidth = width * cellWidth\n const screenHeight = height * cellHeight\n const screenLength = width * height\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n\n if (this.window.debug && this._debug) this._debug.drawStart(why)\n\n ctx.font = this.getFont()\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n\n // bits in the attr value that affect the font\n const FONT_MASK = 0b101\n\n // Map of (attrs & FONT_MASK) -> Array of cell indices\n let fontGroups = new Map()\n\n // Map of (cell index) -> boolean, whether or not a cell has updated\n let updateMap = new Map()\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % width\n let y = Math.floor(cell / width)\n let isCursor = !this.cursor.hanging &&\n this.cursor.x === x &&\n this.cursor.y === y &&\n this.cursor.blinkOn &&\n this.cursor.visible\n\n let wasCursor = x === this.drawnCursor[0] && y === this.drawnCursor[1]\n\n let inSelection = this.isInSelection(x, y)\n\n let text = this.screen[cell]\n let fg = this.screenFG[cell]\n let bg = this.screenBG[cell]\n let attrs = this.screenAttrs[cell]\n\n if (attrs & (1 << 4) && !this.window.blinkStyleOn) {\n // blinking is enabled and blink style is off\n // set text to nothing so drawCell doesn't draw anything\n text = ''\n }\n\n if (inSelection) {\n fg = -1\n bg = -2\n }\n\n let didUpdate = text !== this.drawnScreen[cell] ||\n fg !== this.drawnScreenFG[cell] ||\n bg !== this.drawnScreenBG[cell] ||\n attrs !== this.drawnScreenAttrs[cell] ||\n isCursor !== wasCursor ||\n (isCursor && this.cursor.style !== this.drawnCursor[2])\n\n let font = attrs & FONT_MASK\n if (!fontGroups.has(font)) fontGroups.set(font, [])\n\n fontGroups.get(font).push([cell, x, y, text, fg, bg, attrs, isCursor, inSelection])\n updateMap.set(cell, didUpdate)\n }\n\n // Map of (cell index) -> boolean, whether or not a cell should be redrawn\n const redrawMap = new Map()\n\n let isTextWide = text =>\n text !== ' ' && ctx.measureText(text).width >= (cellWidth + 0.05)\n\n // decide for each cell if it should be redrawn\n let updateRedrawMapAt = cell => {\n let shouldUpdate = updateMap.get(cell) || redrawMap.get(cell)\n\n // TODO: fonts (necessary?)\n let text = this.screen[cell]\n let isWideCell = isTextWide(text)\n let checkRadius = isWideCell ? 2 : 1\n\n if (!shouldUpdate) {\n // check adjacent cells\n let adjacentDidUpdate = false\n\n for (let adjacentCell of this.getAdjacentCells(cell, checkRadius)) {\n if (updateMap.get(adjacentCell)) {\n adjacentDidUpdate = true\n break\n }\n }\n\n if (adjacentDidUpdate) shouldUpdate = true\n }\n\n redrawMap.set(cell, shouldUpdate)\n }\n\n for (let cell of updateMap.keys()) updateRedrawMapAt(cell)\n\n // mask to redrawing regions only\n if (this.window.graphics >= 1) {\n ctx.save()\n ctx.beginPath()\n for (let y = 0; y < height; y++) {\n let regionStart = null\n for (let x = 0; x < width; x++) {\n let cell = y * width + x\n let redrawing = redrawMap.get(cell)\n if (redrawing && regionStart === null) regionStart = x\n if (!redrawing && regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (x - regionStart) * cellWidth, cellHeight)\n regionStart = null\n }\n }\n if (regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (width - regionStart) * cellWidth, cellHeight)\n }\n }\n ctx.clip()\n }\n\n // pass 1: backgrounds\n for (let font of fontGroups.keys()) {\n for (let data of fontGroups.get(font)) {\n let [cell, x, y, text, fg, bg, attrs, isCursor] = data\n\n if (redrawMap.get(cell)) {\n this.drawCellBackground({ x, y, cellWidth, cellHeight, bg })\n }\n }\n }\n\n // pass 2: characters\n for (let font of fontGroups.keys()) {\n // set font once because in Firefox, this is a really slow action for some\n // reason\n let modifiers = {}\n if (font & 1) modifiers.weight = 'bold'\n if (font & 1 << 2) modifiers.style = 'italic'\n ctx.font = this.getFont(modifiers)\n\n for (let data of fontGroups.get(font)) {\n let [cell, x, y, text, fg, bg, attrs, isCursor, inSelection] = data\n\n if (redrawMap.get(cell)) {\n this.drawCell({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n\n this.drawnScreen[cell] = text\n this.drawnScreenFG[cell] = fg\n this.drawnScreenBG[cell] = bg\n this.drawnScreenAttrs[cell] = attrs\n\n if (isCursor) this.drawnCursor = [x, y, this.cursor.style]\n\n if (this.window.debug && this._debug) {\n // set cell flags\n let flags = 1 // always redrawn\n flags |= (+updateMap.get(cell)) << 1\n flags |= (+isTextWide(text)) << 2\n this._debug.setCell(cell, flags)\n }\n }\n\n if (isCursor && !inSelection) {\n ctx.save()\n ctx.beginPath()\n if (this.cursor.style === 'block') {\n // block\n ctx.rect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n } else if (this.cursor.style === 'bar') {\n // vertical bar\n let barWidth = 2\n ctx.rect(x * cellWidth, y * cellHeight, barWidth, cellHeight)\n } else if (this.cursor.style === 'line') {\n // underline\n let lineHeight = 2\n ctx.rect(x * cellWidth, y * cellHeight + charSize.height, cellWidth, lineHeight)\n }\n ctx.clip()\n\n // swap foreground/background\n ;[fg, bg] = [bg, fg]\n\n // HACK: ensure cursor is visible\n if (fg === bg) bg = fg === 0 ? 7 : 0\n\n this.drawCellBackground({ x, y, cellWidth, cellHeight, bg })\n this.drawCell({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n ctx.restore()\n }\n }\n }\n\n if (this.window.graphics >= 1) ctx.restore()\n\n if (this.window.debug && this._debug) this._debug.drawEnd()\n }\n\n /**\n * Parses the content of an `S` message and schedules a draw\n * @param {string} str - the message content\n */\n loadContent (str) {\n // current index\n let i = 0\n // Uncomment to capture screen content for the demo page\n // console.log(JSON.stringify(`S${str}`))\n\n // window size\n const newHeight = parse2B(str, i)\n const newWidth = parse2B(str, i + 2)\n const resized = (this.window.height !== newHeight) || (this.window.width !== newWidth)\n this.window.height = newHeight\n this.window.width = newWidth\n i += 4\n\n // cursor position\n let [cursorY, cursorX] = [parse2B(str, i), parse2B(str, i + 2)]\n i += 4\n let cursorMoved = (cursorX !== this.cursor.x || cursorY !== this.cursor.y)\n this.cursor.x = cursorX\n this.cursor.y = cursorY\n\n if (cursorMoved) {\n this.resetCursorBlink()\n this.emit('cursor-moved')\n }\n\n // attributes\n let attributes = parse3B(str, i)\n i += 3\n\n this.cursor.visible = !!(attributes & 1)\n this.cursor.hanging = !!(attributes & (1 << 1))\n\n this.input.setAlts(\n !!(attributes & (1 << 2)), // cursors alt\n !!(attributes & (1 << 3)), // numpad alt\n !!(attributes & (1 << 4)), // fn keys alt\n !!(attributes & (1 << 12)) // crlf mode\n )\n\n let trackMouseClicks = !!(attributes & (1 << 5))\n let trackMouseMovement = !!(attributes & (1 << 6))\n\n // 0 - Block blink 2 - Block steady (1 is unused)\n // 3 - Underline blink 4 - Underline steady\n // 5 - I-bar blink 6 - I-bar steady\n let cursorShape = (attributes >> 9) & 0x07\n\n // if it's not zero, decrement such that the two most significant bits\n // are the type and the least significant bit is the blink state\n if (cursorShape > 0) cursorShape--\n\n let cursorStyle = cursorShape >> 1\n let cursorBlinking = !(cursorShape & 1)\n\n if (cursorStyle === 0) this.cursor.style = 'block'\n else if (cursorStyle === 1) this.cursor.style = 'line'\n else if (cursorStyle === 2) this.cursor.style = 'bar'\n\n if (this.cursor.blinking !== cursorBlinking) {\n this.cursor.blinking = cursorBlinking\n this.resetCursorBlink()\n }\n\n this.input.setMouseMode(trackMouseClicks, trackMouseMovement)\n this.selection.selectable = !trackMouseMovement\n $(this.canvas).toggleClass('selectable', !trackMouseMovement)\n this.mouseMode = {\n clicks: trackMouseClicks,\n movement: trackMouseMovement\n }\n\n let showButtons = !!(attributes & (1 << 7))\n let showConfigLinks = !!(attributes & (1 << 8))\n\n $('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks)\n $('#action-buttons').toggleClass('hidden', !showButtons)\n\n this.bracketedPaste = !!(attributes & (1 << 13))\n\n // content\n let fg = 7\n let bg = 0\n let attrs = 0\n let cell = 0 // cell index\n let lastChar = ' '\n let screenLength = this.window.width * this.window.height\n\n if (resized) {\n this.updateSize()\n this.blinkingCellCount = 0\n this.screen = new Array(screenLength).fill(' ')\n this.screenFG = new Array(screenLength).fill(' ')\n this.screenBG = new Array(screenLength).fill(' ')\n this.screenAttrs = new Array(screenLength).fill(' ')\n }\n\n let bgcount = new Array(256).fill(0)\n\n let strArray = !undef(Array.from) ? Array.from(str) : str.split('')\n\n const MASK_LINE_ATTR = 0xC8\n const MASK_BLINK = 1 << 4\n\n let setCellContent = () => {\n // Remove blink attribute if it wouldn't have any effect\n let myAttrs = attrs\n if ((myAttrs & MASK_BLINK) !== 0 &&\n ((lastChar === ' ' && ((myAttrs & MASK_LINE_ATTR) === 0)) || // no line styles\n fg === bg // invisible text\n )\n ) {\n myAttrs ^= MASK_BLINK\n }\n // update blinking cells counter if blink state changed\n if ((this.screenAttrs[cell] & MASK_BLINK) !== (myAttrs & MASK_BLINK)) {\n if (myAttrs & MASK_BLINK) this.blinkingCellCount++\n else this.blinkingCellCount--\n }\n\n bgcount[bg]++\n this.screen[cell] = lastChar\n this.screenFG[cell] = fg\n this.screenBG[cell] = bg\n this.screenAttrs[cell] = myAttrs\n }\n\n while (i < strArray.length && cell < screenLength) {\n let character = strArray[i++]\n let charCode = character.codePointAt(0)\n\n let data\n switch (charCode) {\n case SEQ_REPEAT:\n let count = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n for (let j = 0; j < count; j++) {\n setCellContent(cell)\n if (++cell > screenLength) break\n }\n break\n\n case SEQ_SET_COLORS:\n data = parse3B(strArray[i] + strArray[i + 1] + strArray[i + 2])\n i += 3\n fg = data & 0xFF\n bg = (data >> 8) & 0xFF\n break\n\n case SEQ_SET_ATTRS:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n attrs = data & 0xFF\n break\n\n case SEQ_SET_FG:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n fg = data & 0xFF\n break\n\n case SEQ_SET_BG:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n bg = data & 0xFF\n break\n\n default:\n if (charCode < 32) character = '\\ufffd'\n lastChar = character\n setCellContent(cell)\n cell++\n }\n }\n\n if (this.window.debug) console.log(`Blinky cells = ${this.blinkingCellCount}`)\n\n // work-around for the grid gaps bug\n // will mask the glitch if most of the screen uses the same background\n let mostCommonBg = 0\n let mcbIndex = 0\n for (let i = 255; i >= 0; i--) {\n if (bgcount[i] > mostCommonBg) {\n mostCommonBg = bgcount[i]\n mcbIndex = i\n }\n }\n this.canvas.style.backgroundColor = this.getColor(mcbIndex)\n\n this.scheduleDraw('load', 16)\n this.emit('load')\n }\n\n /**\n * Parses the content of a `T` message and updates the screen title and button\n * labels.\n * @param {string} str - the message content\n */\n loadLabels (str) {\n let pieces = str.split('\\x01')\n qs('#screen-title').textContent = pieces[0]\n $('#action-buttons button').forEach((button, i) => {\n let label = pieces[i + 1].trim()\n // if empty string, use the \"dim\" effect and put nbsp instead to\n // stretch the button vertically\n button.innerHTML = label ? esc(label) : ' '\n button.style.opacity = label ? 1 : 0.2\n })\n }\n\n /**\n * Shows an actual notification (if possible) or a notification balloon.\n * @param {string} text - the notification content\n */\n showNotification (text) {\n console.info(`Notification: ${text}`)\n if (Notification && Notification.permission === 'granted') {\n let notification = new Notification('ESPTerm', {\n body: text\n })\n notification.addEventListener('click', () => window.focus())\n } else {\n if (Notification && Notification.permission !== 'denied') {\n Notification.requestPermission()\n } else {\n // Fallback using the built-in notification balloon\n Notify.show(text)\n }\n }\n }\n\n /**\n * Loads a message from the server, and optionally a theme.\n * @param {string} str - the message\n * @param {number} [theme] - the new theme index\n */\n load (str, theme = -1) {\n const content = str.substr(1)\n if (theme >= 0 && theme < themes.length) {\n this.palette = themes[theme]\n }\n\n switch (str[0]) {\n case 'S':\n this.loadContent(content)\n break\n\n case 'T':\n this.loadLabels(content)\n break\n\n case 'B':\n this.beep()\n break\n\n case 'G':\n this.showNotification(content)\n break\n\n default:\n console.warn(`Bad data message type; ignoring.\\n${JSON.stringify(str)}`)\n }\n }\n\n /**\n * Creates a beep sound.\n */\n beep () {\n const audioCtx = this.audioCtx\n if (!audioCtx) return\n\n // prevent screeching\n if (this._lastBeep && this._lastBeep > Date.now() - 50) return\n this._lastBeep = Date.now()\n\n let osc, gain\n\n // main beep\n osc = audioCtx.createOscillator()\n gain = audioCtx.createGain()\n osc.connect(gain)\n gain.connect(audioCtx.destination)\n gain.gain.value = 0.5\n osc.frequency.value = 750\n osc.type = 'sine'\n osc.start()\n osc.stop(audioCtx.currentTime + 0.05)\n\n // surrogate beep (making it sound like 'oops')\n osc = audioCtx.createOscillator()\n gain = audioCtx.createGain()\n osc.connect(gain)\n gain.connect(audioCtx.destination)\n gain.gain.value = 0.2\n osc.frequency.value = 400\n osc.type = 'sine'\n osc.start(audioCtx.currentTime + 0.05)\n osc.stop(audioCtx.currentTime + 0.08)\n }\n\n /**\n * Converts an alphabetic character to its fraktur variant.\n * @param {string} character - the character\n * @returns {string} the converted character\n */\n static alphaToFraktur (character) {\n if (character >= 'a' && character <= 'z') {\n character = String.fromCodePoint(0x1d51e - 0x61 + character.charCodeAt(0))\n } else if (character >= 'A' && character <= 'Z') {\n character = frakturExceptions[character] || String.fromCodePoint(\n 0x1d504 - 0x41 + character.charCodeAt(0))\n }\n return character\n }\n}\n","/** File upload utility */\nwindow.TermUpl = function (conn, input, screen) {\n let lines, // array of lines without newlines\n line_i, // current line index\n fuTout, // timeout handle for line sending\n send_delay_ms, // delay between lines (ms)\n nl_str, // newline string to use\n curLine, // current line (when using fuOil)\n inline_pos // Offset in line (for long lines)\n\n // lines longer than this are split to chunks\n // sending a super-ling string through the socket is not a good idea\n const MAX_LINE_LEN = 128\n\n function openUploadDialog () {\n updateStatus('Ready...')\n Modal.show('#fu_modal', onDialogClose)\n $('#fu_form').toggleClass('busy', false)\n input.blockKeys(true)\n }\n\n function onDialogClose () {\n console.log('Upload modal closed.')\n clearTimeout(fuTout)\n line_i = 0\n input.blockKeys(false)\n }\n\n function updateStatus (msg) {\n qs('#fu_prog').textContent = msg\n }\n\n function startUpload () {\n let v = qs('#fu_text').value\n if (!v.length) {\n fuClose()\n return\n }\n\n lines = v.split('\\n')\n line_i = 0\n inline_pos = 0 // offset in line\n send_delay_ms = qs('#fu_delay').value\n\n // sanitize - 0 causes overflows\n if (send_delay_ms < 0) {\n send_delay_ms = 0\n qs('#fu_delay').value = send_delay_ms\n }\n\n nl_str = {\n 'CR': '\\r',\n 'LF': '\\n',\n 'CRLF': '\\r\\n'\n }[qs('#fu_crlf').value]\n\n $('#fu_form').toggleClass('busy', true)\n updateStatus('Starting...')\n uploadLine()\n }\n\n function uploadLine () {\n if (!$('#fu_modal').hasClass('visible')) {\n // Modal is closed, cancel\n return\n }\n\n if (!conn.canSend()) {\n // postpone\n fuTout = setTimeout(uploadLine, 1)\n return\n }\n\n if (inline_pos === 0) {\n curLine = ''\n if (line_i === 0) {\n if (screen.bracketedPaste) {\n curLine = '\\x1b[200~'\n }\n }\n\n curLine += lines[line_i++] + nl_str\n\n if (line_i === lines.length) {\n if (screen.bracketedPaste) {\n curLine += '\\x1b[201~'\n }\n }\n }\n\n let chunk\n if ((curLine.length - inline_pos) <= MAX_LINE_LEN) {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos = 0\n } else {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos += MAX_LINE_LEN\n }\n\n console.log(chunk)\n if (!input.sendString(chunk)) {\n updateStatus('FAILED!')\n return\n }\n\n let pt = Math.round((line_i / lines.length) * 1000) / 10\n updateStatus(`${line_i} / ${lines.length} (${pt}%)`)\n\n if (lines.length > line_i || inline_pos > 0) {\n fuTout = setTimeout(uploadLine, send_delay_ms)\n } else {\n closeWhenReady()\n }\n }\n\n function closeWhenReady () {\n if (!conn.canSend()) {\n // stuck in XOFF still, wait to process...\n updateStatus('Waiting for Tx buffer...')\n setTimeout(closeWhenReady, 100)\n } else {\n updateStatus('Done.')\n // delay to show it\n fuClose()\n }\n }\n\n function fuClose () {\n Modal.hide('#fu_modal')\n }\n\n return {\n init: function () {\n qs('#fu_file').addEventListener('change', function (evt) {\n let reader = new FileReader()\n let file = evt.target.files[0]\n console.log('Selected file type: ' + file.type)\n if (!file.type.match(/text\\/.*|application\\/(json|csv|.*xml.*|.*script.*)/)) {\n // Deny load of blobs like img - can crash browser and will get corrupted anyway\n if (!confirm('This does not look like a text file: ' + file.type + '\\nReally load?')) {\n qs('#fu_file').value = ''\n return\n }\n }\n reader.onload = function (e) {\n const txt = e.target.result.replace(/[\\r\\n]+/, '\\n')\n qs('#fu_text').value = txt\n }\n console.log('Loading file...')\n reader.readAsText(file)\n }, false)\n\n qs('#term-fu-open').addEventListener('click', function () {\n openUploadDialog()\n return false\n })\n\n qs('#term-fu-start').addEventListener('click', function () {\n startUpload()\n return false\n })\n\n qs('#term-fu-close').addEventListener('click', function () {\n fuClose()\n return false\n })\n }\n }\n}\n","window.attachDebugScreen = function (screen) {\n const debugCanvas = mk('canvas')\n const ctx = debugCanvas.getContext('2d')\n\n debugCanvas.style.position = 'absolute'\n // hackity hack should probably set this in CSS\n debugCanvas.style.top = '6px'\n debugCanvas.style.left = '6px'\n debugCanvas.style.pointerEvents = 'none'\n\n let addCanvas = function () {\n if (!debugCanvas.parentNode) screen.canvas.parentNode.appendChild(debugCanvas)\n }\n let removeCanvas = function () {\n if (debugCanvas.parentNode) debugCanvas.parentNode.removeChild(debugCanvas)\n }\n let updateCanvasSize = function () {\n let { width, height, devicePixelRatio } = screen.window\n let cellSize = screen.getCellSize()\n debugCanvas.width = width * cellSize.width * devicePixelRatio\n debugCanvas.height = height * cellSize.height * devicePixelRatio\n debugCanvas.style.width = `${width * cellSize.width}px`\n debugCanvas.style.height = `${height * cellSize.height}px`\n }\n\n let startTime, endTime, lastReason\n let cells = new Map()\n\n let startDrawing\n\n screen._debug = {\n drawStart (reason) {\n lastReason = reason\n startTime = Date.now()\n },\n drawEnd () {\n endTime = Date.now()\n console.log(`Draw: ${lastReason} (${(endTime - startTime)} ms) with fancy graphics: ${screen.window.graphics}`)\n startDrawing()\n },\n setCell (cell, flags) {\n cells.set(cell, [flags, Date.now()])\n }\n }\n\n let isDrawing = false\n\n let drawLoop = function () {\n if (isDrawing) requestAnimationFrame(drawLoop)\n\n let { devicePixelRatio, width, height } = screen.window\n let { width: cellWidth, height: cellHeight } = screen.getCellSize()\n let screenLength = width * height\n let now = Date.now()\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n ctx.clearRect(0, 0, width * cellWidth, height * cellHeight)\n\n let activeCells = 0\n for (let cell = 0; cell < screenLength; cell++) {\n if (!cells.has(cell) || cells.get(cell)[0] === 0) continue\n\n let [flags, timestamp] = cells.get(cell)\n let elapsedTime = (now - timestamp) / 1000\n\n if (elapsedTime > 1) continue\n\n activeCells++\n ctx.globalAlpha = 0.5 * Math.max(0, 1 - elapsedTime)\n\n let x = cell % width\n let y = Math.floor(cell / width)\n\n if (flags & 1) {\n // redrawn\n ctx.fillStyle = '#f0f'\n }\n if (flags & 2) {\n // updated\n ctx.fillStyle = '#0f0'\n }\n\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n\n if (flags & 4) {\n // wide cell\n ctx.lineWidth = 2\n ctx.strokeStyle = '#f00'\n ctx.strokeRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n }\n\n if (activeCells === 0) {\n isDrawing = false\n removeCanvas()\n }\n }\n\n startDrawing = function () {\n if (isDrawing) return\n addCanvas()\n updateCanvasSize()\n isDrawing = true\n drawLoop()\n }\n}\n","window.initSoftKeyboard = function (screen, input) {\n const keyInput = qs('#softkb-input')\n if (!keyInput) return // abort, we're not on the terminal page\n\n let keyboardOpen = false\n\n let updateInputPosition = function () {\n if (!keyboardOpen) return\n\n let [x, y] = screen.gridToScreen(screen.cursor.x, screen.cursor.y, true)\n keyInput.style.transform = `translate(${x}px, ${y}px)`\n }\n\n keyInput.addEventListener('focus', () => {\n keyboardOpen = true\n updateInputPosition()\n })\n\n keyInput.addEventListener('blur', () => (keyboardOpen = false))\n\n screen.on('cursor-moved', updateInputPosition)\n\n let kbOpen = function (open) {\n keyboardOpen = open\n updateInputPosition()\n if (open) keyInput.focus()\n else keyInput.blur()\n }\n\n qs('#term-kb-open').addEventListener('click', function () {\n kbOpen(true)\n return false\n })\n\n // Chrome for Android doesn't send proper keydown/keypress events with\n // real key values instead of 229 “Unidentified,” so here's a workaround\n // that deals with the input composition events.\n\n let lastCompositionString = ''\n let compositing = false\n\n // sends the difference between the last and the new composition string\n let sendInputDelta = function (newValue) {\n let resend = false\n if (newValue.length > lastCompositionString.length) {\n if (newValue.startsWith(lastCompositionString)) {\n // characters have been added at the end\n input.sendString(newValue.substr(lastCompositionString.length))\n } else resend = true\n } else if (newValue.length < lastCompositionString.length) {\n if (lastCompositionString.startsWith(newValue)) {\n // characters have been removed at the end\n input.sendString('\\b'.repeat(lastCompositionString.length -\n newValue.length))\n } else resend = true\n } else if (newValue !== lastCompositionString) resend = true\n\n if (resend) {\n // the entire string changed; resend everything\n input.sendString('\\b'.repeat(lastCompositionString.length) +\n newValue)\n }\n lastCompositionString = newValue\n }\n\n keyInput.addEventListener('keydown', e => {\n if (e.key === 'Unidentified') return\n\n keyInput.value = ''\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n input.sendString('\\b')\n } else if (e.key === 'Enter') {\n e.preventDefault()\n input.sendString('\\x0d')\n }\n })\n\n keyInput.addEventListener('keypress', e => {\n // prevent key duplication on iOS (because Safari *does* send proper events)\n e.stopPropagation()\n })\n\n keyInput.addEventListener('input', e => {\n e.stopPropagation()\n\n if (e.isComposing) {\n sendInputDelta(e.data)\n } else {\n if (e.inputType === 'insertCompositionText') input.sendString(e.data)\n else if (e.inputType === 'deleteContentBackward') {\n lastCompositionString = ''\n sendInputDelta('')\n } else if (e.inputType === 'insertText') {\n input.sendString(e.data)\n }\n }\n })\n\n keyInput.addEventListener('compositionstart', e => {\n lastCompositionString = ''\n compositing = true\n })\n\n keyInput.addEventListener('compositionend', e => {\n lastCompositionString = ''\n compositing = false\n keyInput.value = ''\n })\n\n screen.on('open-soft-keyboard', () => keyInput.focus())\n}\n","/** Init the terminal sub-module - called from HTML */\nwindow.termInit = function (opts) {\n let { labels, theme, allFn } = opts\n\n const screen = new TermScreen()\n const conn = Conn(screen)\n const input = Input(conn)\n const termUpload = TermUpl(conn, input, screen)\n screen.input = input\n\n conn.init()\n input.init({ allFn })\n termUpload.init()\n Notify.init()\n\n window.onerror = function (errorMsg, file, line, col) {\n Notify.show(`JS ERROR!
${errorMsg}
at ${file}:${line}:${col}`, 10000, true)\n return false\n }\n\n qs('#screen').appendChild(screen.canvas)\n screen.load(labels, theme) // load labels and theme\n\n window.initSoftKeyboard(screen, input)\n if (window.attachDebugScreen) window.attachDebugScreen(screen)\n\n let isFullscreen = false\n let fitScreen = false\n let fitScreenIfNeeded = function fitScreenIfNeeded () {\n if (isFullscreen) {\n screen.window.fitIntoWidth = window.screen.width\n screen.window.fitIntoHeight = window.screen.height\n } else {\n screen.window.fitIntoWidth = fitScreen ? window.innerWidth - 20 : 0\n screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0\n }\n }\n fitScreenIfNeeded()\n window.addEventListener('resize', fitScreenIfNeeded)\n\n let toggleFitScreen = function () {\n fitScreen = !fitScreen\n const resizeButtonIcon = qs('#resize-button-icon')\n if (fitScreen) {\n resizeButtonIcon.classList.remove('icn-resize-small')\n resizeButtonIcon.classList.add('icn-resize-full')\n } else {\n resizeButtonIcon.classList.remove('icn-resize-full')\n resizeButtonIcon.classList.add('icn-resize-small')\n }\n fitScreenIfNeeded()\n }\n\n qs('#term-fit-screen').addEventListener('click', function () {\n toggleFitScreen()\n return false\n })\n\n // add fullscreen mode & button\n if (Element.prototype.requestFullscreen || Element.prototype.webkitRequestFullscreen) {\n let checkForFullscreen = function () {\n // document.fullscreenElement is not really supported yet, so here's a hack\n if (isFullscreen && (innerWidth !== window.screen.width || innerHeight !== window.screen.height)) {\n isFullscreen = false\n fitScreenIfNeeded()\n }\n }\n setInterval(checkForFullscreen, 500)\n\n // (why are the buttons anchors?)\n let button = mk('a')\n button.href = '#'\n button.addEventListener('click', e => {\n e.preventDefault()\n\n isFullscreen = true\n fitScreenIfNeeded()\n screen.updateSize()\n\n if (screen.canvas.requestFullscreen) screen.canvas.requestFullscreen()\n else screen.canvas.webkitRequestFullscreen()\n })\n let icon = mk('i')\n icon.classList.add('icn-resize-full') // TODO: less confusing icons\n button.appendChild(icon)\n let span = mk('span')\n span.textContent = 'Fullscreen'\n button.appendChild(span)\n qs('#term-nav').insertBefore(button, qs('#term-nav').firstChild)\n }\n\n // for debugging\n window.termScreen = screen\n window.conn = conn\n window.input = input\n window.termUpl = termUpload\n}\n"]} \ No newline at end of file diff --git a/js/app.e3b21ad.js b/js/app.e3b21ad.js deleted file mode 100644 index f29b687..0000000 --- a/js/app.e3b21ad.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict';var _typeof='function'==typeof Symbol&&'symbol'==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&'function'==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?'symbol':typeof a};(function(){'use strict';function a(){var a;for(p=!0,a=0;a":'>','"':'"',"'":''',"/":'/',"`":'`',"=":'='};m.htmlEscape=function(a){return(a+'').replace(/[&<>"'`=\/]/g,function(a){return t[a]})},d.$=m})(); -'use strict';(function(a){function b(a,b){for(var c=a.length;c--;)if(a[c]===b)return c;return-1}function c(a,b){if(a.length!=b.length)return!1;for(var c=0;cj;j++)p['f'+j]=111+j;var s={16:'shiftKey',17:'ctrlKey',18:'altKey',91:'metaKey'};for(j in o)f[j]=!1;i(document,'keydown',function(a){e(a)}),i(document,'keyup',function(a){var c,d=a.keyCode,e=b(r,d);if(0<=e&&r.splice(e,1),(93==d||224==d)&&(d=91),d in n)for(c in n[d]=!1,o)o[c]==d&&(f[c]=!1)}),i(window,'focus',function(){for(j in n)n[j]=!1;for(j in o)f[j]=!1});var t=a.key;a.key=f,a.key.setScope=function(a){k=a||'all'},a.key.getScope=g,a.key.deleteScope=function(a){var b,c,d;for(b in m)for(c=m[b],d=0;di||1114111=i?a.push(i):(i-=65536,d=(i>>10)+55296,e=i%1024+56320,a.push(d,e)),(f+1==g||a.length>16384)&&(h+=b.apply(null,a),a.length=0)}return h};a?a(String,'fromCodePoint',{value:d,configurable:!0,writable:!0}):String.fromCodePoint=d}(); -'use strict';function mk(a){return document.createElement(a)}function qs(a){return document.querySelector(a)}function qsa(a){return document.querySelectorAll(a)}function bool(a){return 1===a||'1'===a||!0===a||'true'===a}function cr(a){return function(b){(10===b.which||13===b.which||32===b.which)&&a()}}function esc(a){return $.htmlEscape(a)}function undef(a){return'undefined'==typeof a}function jsp(a){try{return JSON.parse(a)}catch(a){return console.error(a),null}}function Chr(a){return String.fromCharCode(a)}function parse2B(a){var b=1=e)&&(e=2500),d=setTimeout(a.hide,e),g=!1,f=setTimeout(function(){g=!0},500)},a.hide=function(){var a=$(b);a.removeClass('visible'),e=setTimeout(function(){a.addClass('hidden')},250)},a.init=function(){c=$(b),$(document).on('click',function(){g&&a.hide(this)}),c.on('click',function(a){return a.stopImmediatePropagation(),!1}),c.on('mouseenter',function(){h(),c.removeClass('hidden').addClass('visible')})},a}(); -'use strict';$.ready(function(){$('.Row.checkbox').forEach(function(a){var b=a.querySelector('input');var c=a.querySelector('.box');$(c).toggleClass('checked',b.value);var d=function(){b.value=1-b.value,$(c).toggleClass('checked',b.value)};$(a).on('click',d).on('keypress',cr(d))}),$('.Box.mobcol,.Box.fold').forEach(function(a){var b=a.querySelector('h2');var c=function(){$(a).toggleClass('expanded')};$(b).on('click',c).on('keypress',cr(c))}),$('form').forEach(function(a){$(a).on('keypress',function(b){(10===b.keyCode||13===b.keyCode)&&b.ctrlKey&&a.submit()})}),setInterval(function(){$('.anim-dots').each(function(a){var b=$(a);var c=b.html()+'.';5===c.length&&(c='.'),b.html(c)})},1e3),$('input[type=number]').on('mousewheel',function(a){var b=$(this);var c=+b.val();isNaN(c)&&(c=1);var d=+(b.attr('step')||1);var e=+b.attr('min');var f=+b.attr('max');if(0=b)this.handler('move-cursor-'+('B'>=b?'y':'x'),('B'===b||'C'===b?1:-1)*e);else if('E'===b||'F'===b)this.handler('move-cursor-line',('E'===b?1:-1)*e);else if('G'===b)this.handler('set-cursor-x',e-1);else if('J'===b){var f=d.length?d[0]:2;2===f&&this.handler('clear')}else if('P'===b)this.handler('delete',e);else if('@'===b)this.handler('insert-blanks',e);else if('q'===b)this.handler('set-cursor-style',e);else if('m'===b){if(!d.length||0===d[0])return void this.handler('reset-style');var g=d[0];if(1===g)this.handler('add-attrs',1);else if(2===g)this.handler('add-attrs',2);else if(3===g)this.handler('add-attrs',4);else if(4===g)this.handler('add-attrs',8);else if(5===g||6===g)this.handler('add-attrs',16);else if(7===g)this.handler('add-attrs',-1);else if(9===g)this.handler('add-attrs',64);else if(20===g)this.handler('add-attrs',32);else if(30<=g&&37>=g)this.handler('set-color-fg',g%10);else if(40<=g&&47>=g)this.handler('set-color-bg',g%10);else if(39===g)this.handler('set-color-fg',7);else if(49===g)this.handler('set-color-bg',0);else if(90<=g&&98>=g)this.handler('set-color-fg',g%10+8);else if(100<=g&&108>=g)this.handler('set-color-bg',g%10+8);else if((38===g||48===g)&&5===d[1]){var h=255&(0|d[2]);38===g&&this.handler('set-color-fg',h),48===g&&this.handler('set-color-bg',h)}}else('h'===b||'l'===b)&&'?25'===c&&('h'===b?this.handler('show-cursor'):'l'===b&&this.handler('hide-cursor'))}}},{key:'write',value:function write(a){var b=!0;var c=!1;var d=void 0;try{for(var e,f=a.toString()[Symbol.iterator]();!(b=(e=f.next()).done);b=!0){var g=e.value;var h=g.codePointAt(0);27===h?this.currentSequence=1:1===this.currentSequence&&'['===g?(this.currentSequence=2,this.sequence+='['):this.currentSequence&&g.match(/[\x40-\x7e]/)?(this.parseSequence(this.sequence+g),this.currentSequence=0,this.sequence=''):1h?this.handler('_null'):3===h?this.handler('sigint'):6>=h?this.handler('_null'):7===h?this.handler('bell'):8===h?this.handler('back'):10===h?this.handler('new-line'):13===h?this.handler('return'):21===h?this.handler('delete-line'):23===h?this.handler('delete-word'):this.handler('write',g)}}catch(a){c=!0,d=a}finally{try{!b&&f.return&&f.return()}finally{if(c)throw d}}this.joinChunks||this.reset()}}]),a}();var TERM_DEFAULT_STYLE=7;var TERM_MIN_DRAW_DELAY=10;var getRainbowColor=function(a){var c=Math.PI;var d=Math.floor;var e=Math.sin;var f=d(2.5*e(a)+2.5);var h=d(2.5*e(a+2/3*c)+2.5);var g=d(2.5*e(a+4/3*c)+2.5);return 16+36*f+6*h+g};var ScrollingTerminal=function(){function a(b){var c=this;_classCallCheck(this,a),this.width=80,this.height=25,this.termScreen=b,this.parser=new ANSIParser(function(){return c.handleParsed.apply(c,arguments)}),this.reset(),this._lastLoad=Date.now(),this.termScreen.load(this.serialize(),0)}var b=Math.min;var c=Math.max;return _createClass(a,[{key:'reset',value:function reset(){this.style=TERM_DEFAULT_STYLE,this.cursor={x:0,y:0,style:1,visible:!0},this.trackMouse=!1,this.theme=0,this.rainbow=!1,this.parser.reset(),this.clear()}},{key:'clear',value:function clear(){this.screen=[];for(var a=0;a=this.height&&this.scroll()}},{key:'writeChar',value:function writeChar(a){this.screen[this.cursor.y*this.width+this.cursor.x]=[a,this.style],this.cursor.x++,this.cursor.x>=this.width&&(this.cursor.x=0,this.newLine())}},{key:'moveBack',value:function moveBack(){var a=0this.cursor.x&&(this.cursor.x=0=this.width&&(this.cursor.x=0,this.cursor.y++,this.cursor.y>=this.height&&this.scroll())}},{key:'deleteChar',value:function deleteChar(){this.moveBack(),this.screen.splice((this.cursor.y+1)*this.width,0,[' ',TERM_DEFAULT_STYLE]),this.screen.splice(this.cursor.y*this.width+this.cursor.x,1)}},{key:'deleteForward',value:function deleteForward(a){a=b(this.width,a);for(var c=0;cthis.cursor.x&&(this.cursor.x=0),0>this.cursor.y&&(this.cursor.y=0),this.cursor.x>this.width-1&&(this.cursor.x=this.width-1),this.cursor.y>this.height-1&&(this.cursor.y=this.height-1)}},{key:'handleParsed',value:function handleParsed(a){'write'===a?this.writeChar(1>=arguments.length?void 0:arguments[1]):'delete'===a?this.deleteForward(1>=arguments.length?void 0:arguments[1]):'insert-blanks'===a?this.insertBlanks(1>=arguments.length?void 0:arguments[1]):'clear'===a?this.clear():'bell'===a?this.terminal.load('B'):'back'===a?this.moveBack():'new-line'===a?this.newLine():'return'===a?this.cursor.x=0:'set-cursor'===a?(this.cursor.x=2>=arguments.length?void 0:arguments[2],this.cursor.y=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-y'===a?(this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-x'===a?(this.cursor.x+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-line'===a?(this.cursor.x=0,this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'set-cursor-x'===a?this.cursor.x=1>=arguments.length?void 0:arguments[1]:'set-cursor-style'===a?this.cursor.style=c(0,b(6,1>=arguments.length?void 0:arguments[1])):'reset-style'===a?this.style=TERM_DEFAULT_STYLE:'add-attrs'===a?-1===(1>=arguments.length?void 0:arguments[1])?this.style=16711680&this.style|255&this.style>>8|(255&this.style)<<8:this.style|=(1>=arguments.length?void 0:arguments[1])<<16:'set-color-fg'===a?this.style=16776960&this.style|(1>=arguments.length?void 0:arguments[1]):'set-color-bg'===a?this.style=16711935&this.style|(1>=arguments.length?void 0:arguments[1])<<8:'hide-cursor'===a?this.cursor.visible=!1:'show-cursor'===a&&(this.cursor.visible=!0)}},{key:'write',value:function write(a){this.parser.write(a),this.scheduleLoad()}},{key:'serialize',value:function serialize(){var a='S';a+=encode2B(this.height)+encode2B(this.width),a+=encode2B(this.cursor.y)+encode2B(this.cursor.x);var b=+this.cursor.visible;b|=96*+this.trackMouse,b|=384,b|=this.cursor.style<<9,a+=encode3B(b);var c=null;var d=0;var e=!0;var f=!1;var g=void 0;try{for(var h,i=this.screen[Symbol.iterator]();!(e=(h=i.next()).done);e=!0){var j=h.value;var k=j[1];if(this.rainbow){var l=d%this.width;var m=Math.floor(d/this.width);k=16711680&k|getRainbowColor((l+m)/10+Date.now()/1e3),d++}if(k!==c){var n=255&k;var o=255&k>>8;var p=255&k>>16;var q=n!=(255&c);var r=o!=(255&c>>8);var s=p!=(255&c>>16);q&&r?a+='\x03'+encode3B(65535&k):q?a+='\x05'+encode2B(n):r&&(a+='\x06'+encode2B(o)),s&&(a+='\x04'+encode2B(p)),c=k}a+=j[0]}}catch(a){f=!0,g=a}finally{try{!e&&i.return&&i.return()}finally{if(f)throw g}}return a}},{key:'scheduleLoad',value:function scheduleLoad(){var a=this;clearTimeout(this._scheduledLoad),this._lastLoadf;f++)c+=b[e][f]?'\x1B[38;5;'+getRainbowColor((f+e)/10)+'m'+b[e][f]:' ';this.emit('write','\r\n\x1B[?25l');var d=function(){a.emit('write',c.substr(0,80)),c=c.substr(80),c.length?setTimeout(d,50):(a.emit('write','\r\n\x1B[?25h'),a.destroy())};d()}}]),b}(Process),"local-echo":function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;cb[h].length&&(b[h]+=' '.repeat(79-b[h].length));this.emit('write','\r\n'.repeat(b.length+1)),this.emit('write','\x1B[A'.repeat(b.length)),this.emit('write','\x1B[?25l');var d=0;var e=0;var f=function(b,c){var f=Math.abs;var g=b-d;var h=c-e;a.emit('write','\x1B['+f(g)+(0++d?3<=++e?(setTimeout(h,20),e=0):h():(f(0,b.length),a.emit('write','\x1B[m\x1B[?25h'),c())};h()})}},{key:'printText',value:function printText(){var a=0a;a++)this.emit('write','\x1B['+(8>a?'3'+a:'9'+(a-8))+'m'),this.emit('write','foreground-color'[a]+' ');this.emit('write','\r\n ');for(var c=0;16>c;c++)this.emit('write','\x1B['+(8>c?'4'+c:'10'+(c-8))+'m ');this.emit('write','\x1B[m\r\n');for(var d=0;6>d;d++){this.emit('write',' ');for(var e=0;6>e;e++){for(var f=0;6>f;f++)this.emit('write','\x1B[48;5;'+(16+36*d+6*e+f)+'m ');this.emit('write','\x1B[m')}this.emit('write','\r\n')}this.emit('write',' ');for(var b=0;24>b;b++)this.emit('write','\x1B[48;5;'+(232+b)+'m ');this.emit('write','\x1B[m\r\n\n'),this.destroy()}}]),b}(Process),ls:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a in this.emit('write','\x1B[92mList of demo commands\x1B[m\r\n'),demoshIndex)'string'!=typeof demoshIndex[a]&&this.emit('write',a+'\r\n');this.destroy()}}]),b}(Process),theme:function(a){function b(a){_classCallCheck(this,b);var c=_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).call(this));return c.shell=a,c}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){var a=0|(0>=arguments.length?void 0:arguments[0]);return!arguments.length||!Number.isFinite(a)||0>a||5b;b++){var c='';for(var d=0;79>d;d++)c+=a[Math.floor(a.length*Math.random())];this.randomData.push(c)}this.scrollOffset=0,this.render()}},{key:'render',value:function render(){this.emit('write','\x1B[m\x1B[2J\x1B[1;1H'),this.emit('write','\x1B[97m\x1B[1mMouse Demo\r\n\x1B[mMouse movement, clicking and scrolling!');for(var a=0;23>a;a++){var b=a+this.scrollOffset;b=(b%this.randomData.length+this.randomData.length)%this.randomData.length;var c=this.randomData[b];var d='\x1B['+(3+a)+';1H\x1B[38;5;239m';for(var e in c)this.highlighted[80*(a+2)+ +e]&&(d+='\x1B[97m'),d+=c[e],this.highlighted[80*(a+2)+ +e]&&(d+='\x1B[38;5;239m');this.emit('write',d)}this.mouse&&this.emit('write','\x1B['+(this.mouse.y+1)+';'+(this.mouse.x+1)+'H')}},{key:'mouseMove',value:function mouseMove(a,b){this.mouse={x:a,y:b},this.render()}},{key:'mouseDown',value:function mouseDown(a,b,c){4===c?this.scrollOffset--:5===c?this.scrollOffset++:this.highlighted[80*b+a]=!this.highlighted[80*b+a],this.render()}},{key:'mouseUp',value:function mouseUp(){}},{key:'destroy',value:function destroy(){this.shell.terminal.write('\x1B[2J\x1B[1;1H'),this.shell.terminal.trackMouse=!1,demoData.mouseReceiver===this&&(demoData.mouseReceiver=null),_get(b.prototype.__proto__||Object.getPrototypeOf(b.prototype),'destroy',this).call(this)}}]),b}(Process),sudo:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,d=Array(a),e=0;e\x1B[0m\n');else if(4===d.length&&'make me a sandwich'===d.join(' ').toLowerCase()){var f='\x1B[33m';var b='\x1B[32m';var g='\x1B[38;5;229m';var c='\x1B[38;5;225m';this.emit('write',' '+f+'_.---._\r\n _.-~ ~-._\r\n _.-~ ~-._\r\n _.-~ ~---._\r\n _.-~ ~\\\r\n .-~ _.;\r\n :-._ _.-~ ./\r\n `-._~-._ _..__.-~ _.-~\r\n'+(' '+g+'/ '+f+'~-._~-._ / .__..--'+g+'~-'+b+'---._\r\n')+(g+' \\_____(_'+f+';-._\\. _.-~_/'+g+' ~)'+b+'.. . \\\r\n')+(b+' /(_____ '+f+'\\`--...--~_.-~'+g+'______..-+'+b+'_______)\r\n')+(b+' .(_________/'+f+'`--...--~/'+b+' _/ '+c+' '+f+'/\\\r\n')+(f+' /-._'+c+' \\_ '+b+'(___./_..-~'+c+'__.....'+f+'__..-~./\r\n')+(f+' `-._~-._'+c+' ~\\--------~ .-~'+f+'_..__.-~ _.-~\r\n')+(f+' ~-._~-._ '+c+'~---------` '+f+'/ .__..--~\r\n')+(f+' ~-._\\. _.-~_/\r\n')+(f+' \\`--...--~_.-~\r\n')+(f+' `--...--~'+'\x1B[0m'+'\r\n'))}else return void this.emit('exec',d.join(' '));this.destroy()}}]),b}(Process),make:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;c=arguments.length?void 0:arguments[1])+this.history[0].substr(this.cursorPos),this.cursorPos++;else if('back'===a)this.copyFromHistoryIndex(),this.history[0]=this.history[0].substr(0,this.cursorPos-1)+this.history[0].substr(this.cursorPos),this.cursorPos--,0>this.cursorPos&&(this.cursorPos=0);else if('move-cursor-x'===a)this.cursorPos=Math.max(0,Math.min(this.history[0].length,this.cursorPos+(1>=arguments.length?void 0:arguments[1])));else if('delete-line'===a)this.copyFromHistoryIndex(),this.history[0]='',this.cursorPos=0;else if('delete-word'===a){this.copyFromHistoryIndex();var b=this.history[0].substr(0,this.cursorPos).split(' ');b.pop(),this.history[0]=b.join(' ')+this.history[0].substr(this.cursorPos),this.cursorPos=b.join(' ').length}else'move-cursor-y'===a&&(this.historyIndex-=1>=arguments.length?void 0:arguments[1],0>this.historyIndex&&(this.historyIndex=0),this.historyIndex>=this.history.length&&(this.historyIndex=this.history.length-1),this.cursorPos=this.history[this.historyIndex].length);this.terminal.write(this.history[this.historyIndex]),this.terminal.write('\b'.repeat(this.history[this.historyIndex].length)),this.terminal.moveForward(this.cursorPos),this.terminal.write(''),'return'===a&&(this.terminal.write('\r\n'),this.parse(this.history[this.historyIndex]))}},{key:'parse',value:function parse(a){'help'===a&&(a='info'),this.run(a)}},{key:'run',value:function run(a){var b=[''];var c=!1;var d=!0;var e=!1;var f=void 0;try{for(var g,h=a.trim()[Symbol.iterator]();!(d=(g=h.next()).done);d=!0){var j=g.value;c&&j!==c?b[b.length-1]+=j:c?c=!1:'"'===j||'\''===j?c=j:j.match(/\s/)?b[b.length-1]&&b.push(''):b[b.length-1]+=j}}catch(a){e=!0,f=a}finally{try{!d&&h.return&&h.return()}finally{if(e)throw f}}var i=b.shift();i in this.index?this.spawn(i,b):(this.terminal.write('demosh: Unknown command: '+i+'\r\n'),this.prompt(!1))}},{key:'spawn',value:function spawn(a){var b=this;var c=1'+a.rssi_perc+'').htmlAppend('
'+i+'
').htmlAppend('
'+g[a.enc]+'
'),d.on('click',function(){var a=$(this);var b=a.data('ssid');var d='';+a.data('pwd')&&(d=prompt(tr('wifi.enter_passwd').replace(':ssid:',b)),!d)||($('#sta_password').val(d),$('#sta_ssid').val(b),c(b,d,''))}),b.appendChild(f),e[0].appendChild(b)}})}}function e(){_demo?d(_demo_aps,200):$.get('http://'+_root+'/cfg/wifi/scan',d)}function f(a){setTimeout(e,a)}var g=['Open','WEP','WPA','WPA2','WPA/WPA2'];var h;a.init=function(a){$('.Row.range').forEach(function(a){var c=a.querySelector('input');var d=a.querySelector('.x-disp1');var e=a.querySelector('.x-disp2');var f=b(c);$(d).html(f),$(e).html(f),$(c).on('input',function(){f=b(c),$(d).html(f),$(e).html(f)})}),$('#forget-sta').on('click',function(){return c('','',''),!1}),c(a.sta_ssid,a.sta_password,a.sta_active_ip),h=a.sta_active_ssid},a.startScanning=function(){$('#ap-loader').removeClass('hidden'),$('#ap-scan').addClass('hidden'),$('#ap-loader .anim-dots').html('.'),e()}})(window.WiFi={}); -'use strict';window.Conn=function(a){function b(){console.log('CONNECTED'),g(),e('i')}function c(a){console.warn('SOCKET CLOSED, code '+a.code+'. Reconnecting...'),clearTimeout(n),n=setTimeout(function(){f()},2e3)}function d(b){try{switch(b.data.charAt(0)){case'.':break;case'-':l=!0,m=setTimeout(function(){l=!1},250);break;case'+':l=!1,clearTimeout(m);break;default:a.load(b.data),o||(showPage(),o=!0);}g()}catch(a){console.error(a)}}function e(a){return _demo?('undefined'==typeof demoInterface?console.log('TX: '+JSON.stringify(a)):demoInterface.input(a),!0):l?(console.log('Can\'t send, flood control.'),!1):!!i&&(1===i.readyState?('string'!=typeof a&&(a=JSON.stringify(a)),i.send(a),!0):(console.error('Socket not ready'),!1))}function f(){return window._demo?void('undefined'==typeof demoInterface?alert('Demoing non-demo demo!'):(demoInterface.init(a),showPage())):void(clearTimeout(n),clearTimeout(j),i=new WebSocket('ws://'+_root+'/term/update.ws'),i.onopen=b,i.onclose=c,i.onmessage=d,console.log('Opening socket.'),g())}function g(){clearTimeout(j),j=setTimeout(h,2e3)}function h(){console.error('Heartbeat lost, probing server...'),k=setInterval(function(){console.log('> ping'),$.get('http://'+_root+'/system/ping',function(a,b){200===b&&(clearInterval(k),console.info('Server ready, reloading page...'),location.reload())},{timeout:100})},1e3)}var i;var j;var k;var l=!1;var m;var n;var o=!1;return{ws:null,init:f,send:e,canSend:function(){return!l}}}; -'use strict';window.Input=function(a){function b(b){return a.send('s'+b)}function c(b){a.send('b'+k(b))}function d(a,b){return l.fn_alt?a:b}function e(a,b){return l.cu_alt?a:b}function f(a,b){return l.np_alt?a:b}function g(a){var b={tab:'\t',backspace:'\b',enter:l.crlf_mode?'\r\n':'\r',"ctrl+enter":'\n',esc:'\x1B',up:e('\x1BOA','\x1B[A'),down:e('\x1BOB','\x1B[B'),right:e('\x1BOC','\x1B[C'),left:e('\x1BOD','\x1B[D'),home:e('\x1BOH',d('\x1B[H','\x1B[1~')),insert:'\x1B[2~',delete:'\x1B[3~',end:e('\x1BOF',d('\x1B[F','\x1B[4~')),pageup:'\x1B[5~',pagedown:'\x1B[6~',f1:d('\x1BOP','\x1B[11~'),f2:d('\x1BOQ','\x1B[12~'),f3:d('\x1BOR','\x1B[13~'),f4:d('\x1BOS','\x1B[14~'),f5:'\x1B[15~',f6:'\x1B[17~',f7:'\x1B[18~',f8:'\x1B[19~',f9:'\x1B[20~',f10:'\x1B[21~',f11:'\x1B[23~',f12:'\x1B[24~',"shift+f1":d('\x1BO1;2P','\x1B[25~'),"shift+f2":d('\x1BO1;2Q','\x1B[26~'),"shift+f3":d('\x1BO1;2R','\x1B[28~'),"shift+f4":d('\x1BO1;2S','\x1B[29~'),"shift+f5":d('\x1B[15;2~','\x1B[31~'),"shift+f6":d('\x1B[17;2~','\x1B[32~'),"shift+f7":d('\x1B[18;2~','\x1B[33~'),"shift+f8":d('\x1B[19;2~','\x1B[34~'),"shift+f9":d('\x1B[20;2~','\x1B[35~'),"shift+f10":d('\x1B[21;2~','\x1B[36~'),"shift+f11":d('\x1B[22;2~','\x1B[37~'),"shift+f12":d('\x1B[23;2~','\x1B[38~'),np_0:f('\x1BOp','0'),np_1:f('\x1BOq','1'),np_2:f('\x1BOr','2'),np_3:f('\x1BOs','3'),np_4:f('\x1BOt','4'),np_5:f('\x1BOu','5'),np_6:f('\x1BOv','6'),np_7:f('\x1BOw','7'),np_8:f('\x1BOx','8'),np_9:f('\x1BOy','9'),np_mul:f('\x1BOR','*'),np_add:f('\x1BOl','+'),np_sub:f('\x1BOS','-'),np_point:f('\x1BOn','.'),np_div:f('\x1BOQ','/')};var c=['f5','f11','f12','shift+f5'];for(var g in b)(a||!c.includes(g))&&b.hasOwnProperty(g)&&h(g,b[g])}function h(a,c){-1!==a.indexOf('ctrl+')&&(a+=','+a.replace('ctrl','command')),key.unbind(a),key(a,function(a){l.no_keys||(a.preventDefault(),b(c))})}function i(a){var c=a.allFn;window.addEventListener('keypress',function(a){if(!l.no_keys){var c='';a.key?c=a.key:a.which&&(c=String.fromCodePoint(a.which)),0=d;d++)h('ctrl+'+k(96+d),k(d));h('ctrl+]','\x1B'),h('ctrl+\\','\x1C'),h('ctrl+[','\x1D'),h('ctrl+^','\x1E'),h('ctrl+_','\x1F'),h('ctrl+left','\x1F[1;5D'),h('ctrl+right','\x1F[1;5C'),h('ctrl+up','\x1F[1;5A'),h('ctrl+down','\x1F[1;5B'),h('ctrl+home','\x1F[1;5H'),h('ctrl+end','\x1F[1;5F'),h('shift+left','\x1F[1;2D'),h('shift+right','\x1F[1;2C'),h('shift+up','\x1F[1;2A'),h('shift+down','\x1F[1;2B'),h('shift+home','\x1F[1;2H'),h('shift+end','\x1F[1;2F'),h('\u2325+left','\x1Bb'),h('\u2325+right','\x1Bf'),h('\u2318+left','\x01'),h('\u2318+right','\x05'),h('\u2325+backspace','\x17'),h('\u2318+backspace','\x15'),g(c)}function j(){return(key.isModifier('ctrl')?1:0)|(key.isModifier('shift')?2:0)|(key.isModifier('alt')?4:0)|(key.isModifier('meta')?8:0)}var k=String.fromCharCode;var l={np_alt:!1,cu_alt:!1,fn_alt:!1,mt_click:!1,mt_move:!1,no_keys:!1,crlf_mode:!1};var n=0;var o=0;var p=0;return{init:function(a){i(a),$('#action-buttons button').forEach(function(a){a.addEventListener('click',function(){c(+this.dataset.n)})}),window.addEventListener('mousedown',function(a){0===a.button&&(n=1),1===a.button&&(o=1),2===a.button&&(p=1)}),window.addEventListener('mouseup',function(a){0===a.button&&(n=0),1===a.button&&(o=0),2===a.button&&(p=0)})},sendString:b,setAlts:function setAlts(a,b,c,d){(l.cu_alt!==a||l.np_alt!==b||l.fn_alt!==c||l.crlf_mode!==d)&&(l.cu_alt=a,l.np_alt=b,l.fn_alt=c,l.crlf_mode=d,g())},setMouseMode:function setMouseMode(a,b){l.mt_click=a,l.mt_move=b},onMouseMove:function onMouseMove(c,d){if(l.mt_move){var e=n?1:o?2:p?3:0;var b=j();a.send('m'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseDown:function onMouseDown(c,d,e){if(l.mt_click&&!(3e)){var b=j();a.send('p'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseUp:function onMouseUp(c,d,e){if(l.mt_click&&!(3e)){var b=j();a.send('r'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseWheel:function onMouseWheel(c,d,e){if(l.mt_click){var f=j();var g=0>e?4:5;a.send('p'+encode2B(d)+encode2B(c)+encode2B(g)+encode2B(f))}},blockKeys:function blockKeys(a){l.no_keys=a}}}; -'use strict';var _slicedToArray=function(){function a(a,b){var c=[];var d=!0;var e=!1;var f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!(b&&c.length===b));d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h['return']&&h['return']()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError('Invalid attempt to destructure non-iterable instance')}}();var _createClass=function(){function a(a,b){for(var c=0;cred;red++)for(var green=0;6>green;green++)for(var blue=0;6>blue;blue++){var redValue=40*red+(red?55:0);var greenValue=40*green+(green?55:0);var blueValue=40*blue+(blue?55:0);colorTable256.push('rgb('+redValue+', '+greenValue+', '+blueValue+')')}for(var gray=0;24>gray;gray++){var value=10*gray+8;colorTable256.push('rgb('+value+', '+value+', '+value+')')}window.TermScreen=function(){function a(){var b=this;_classCallCheck(this,a),this.canvas=mk('canvas'),this.ctx=this.canvas.getContext('2d'),'AudioContext'in window||'webkitAudioContext'in window?this.audioCtx=new(window.AudioContext||window.webkitAudioContext):console.warn('No AudioContext!'),this.input=new Proxy({},{get:function get(){return function(){return console.warn('TermScreen#input not set!')}}}),this.cursor={x:0,y:0,blinkOn:!1,blinking:!0,visible:!0,hanging:!1,style:'block',blinkInterval:null},this._palette=null,this._window={width:0,height:0,devicePixelRatio:1,fontFamily:'"DejaVu Sans Mono", "Liberation Mono", "Inconsolata", "Menlo", monospace',fontSize:20,gridScaleX:1,gridScaleY:1.2,blinkStyleOn:!0,blinkInterval:null,fitIntoWidth:0,fitIntoHeight:0,debug:!1,graphics:0},this._windowScale=1,this.windowState={width:0,height:0,devicePixelRatio:0,gridScaleX:0,gridScaleY:0,fontFamily:'',fontSize:0,fitIntoWidth:0,fitIntoHeight:0},this.selection={selectable:!0,start:[0,0],end:[0,0]},this.mouseMode={clicks:!1,movement:!1},this._listeners={};var c=this;this.window=new Proxy(this._window,{set:function set(a,b,d){return a[b]=d,c.scheduleSizeUpdate(),c.scheduleDraw('window:'+b+'='+d),!0}}),this.bracketedPaste=!1,this.blinkingCellCount=0,this.screen=[],this.screenFG=[],this.screenBG=[],this.screenAttrs=[],this.drawnScreen=[],this.drawnScreenFG=[],this.drawnScreenBG=[],this.drawnScreenAttrs=[],this.drawnCursor=[-1,-1,''],this.resetBlink(),this.resetCursorBlink();var d=!1;var f=function(a,c){d||(d=!0,b.selection.start=b.selection.end=b.screenToGrid(a,c,!0),b.scheduleDraw('select-start'))};var g=function(a,c){d&&(b.selection.end=b.screenToGrid(a,c,!0),b.scheduleDraw('select-move'))};var h=function(a,c){d&&(d=!1,b.selection.end=b.screenToGrid(a,c,!0),b.scheduleDraw('select-end'),Object.assign(b.selection,b.getNormalizedSelection()))};this.canvas.addEventListener('mousedown',function(a){if((b.selection.selectable||a.altKey)&&0===a.button)f(a.offsetX,a.offsetY);else{var c;(c=b.input).onMouseDown.apply(c,_toConsumableArray(b.screenToGrid(a.offsetX,a.offsetY)).concat([a.button+1]))}}),window.addEventListener('mousemove',function(a){g(a.offsetX,a.offsetY)}),window.addEventListener('mouseup',function(a){h(a.offsetX,a.offsetY)});var i=null;var j=0;var k=!1;var l=function(a){var c=b.canvas.getBoundingClientRect();return[a.clientX-c.left,a.clientY-c.top]};this.canvas.addEventListener('touchstart',function(a){i=l(a.touches[0]),k=!1,j=Date.now()}),this.canvas.addEventListener('touchmove',function(a){i=l(a.touches[0]),d||!1!=k?d&&(a.preventDefault(),g.apply(void 0,_toConsumableArray(i))):ja)return colorTable256[a];if(255>16;var c=255&a>>8;var d=255&a;return'rgb('+b+', '+c+', '+d+')'}return'rgba(0, 0, 0, 0)'}},{key:'scheduleSizeUpdate',value:function scheduleSizeUpdate(){var a=this;clearTimeout(this._scheduledSizeUpdate),this._scheduledSizeUpdate=setTimeout(function(){return a.updateSize()},1)}},{key:'scheduleDraw',value:function scheduleDraw(a){var b=this;var c=1=a.blinkingCellCount||(b++,4<=b&&a.window.blinkStyleOn?(a.window.blinkStyleOn=!1,b=0):1<=b&&!a.window.blinkStyleOn&&(a.window.blinkStyleOn=!0,b=0))},200)}},{key:'getNormalizedSelection',value:function getNormalizedSelection(){var a=this.selection,b=a.start,c=a.end;if(b[1]>c[1]||b[1]===c[1]&&b[0]>c[0]){var d=[c,b];b=d[0],c=d[1]}return{start:b,end:c}}},{key:'isInSelection',value:function isInSelection(a,b){var c=this.getNormalizedSelection(),d=c.start,e=c.end;var f=d[0]<=a;var g=a=m+0.05};var s=function(a){var c=p.get(a)||q.get(a);var d=b.screen[a];var e=r(d);var f=e?2:1;if(!c){var l=!1;var g=!0;var h=!1;var i=void 0;try{for(var j,k=b.getAdjacentCells(a,f)[Symbol.iterator]();!(g=(j=k.next()).done);g=!0){var m=j.value;if(p.get(m)){l=!0;break}}}catch(a){h=!0,i=a}finally{try{!g&&k.return&&k.return()}finally{if(h)throw i}}l&&(c=!0)}q.set(a,c)};var t=!0;var u=!1;var v=void 0;try{for(var w,z=p.keys()[Symbol.iterator]();!(t=(w=z.next()).done);t=!0){var xa=w.value;s(xa)}}catch(a){u=!0,v=a}finally{try{!t&&z.return&&z.return()}finally{if(u)throw v}}if(1<=this.window.graphics){d.save(),d.beginPath();for(var ya=0;ya>9;0>1;var q=!(1&o);0==p?this.cursor.style='block':1==p?this.cursor.style='line':2==p&&(this.cursor.style='bar'),this.cursor.blinking!==q&&(this.cursor.blinking=q,this.resetCursorBlink()),this.input.setMouseMode(m,n),this.selection.selectable=!m&&!n,$(this.canvas).toggleClass('selectable',this.selection.selectable),this.mouseMode={clicks:m,movement:n};$('.x-term-conf-btn').toggleClass('hidden',!!!(256&l)),$('#action-buttons').toggleClass('hidden',!!!(128&l)),this.bracketedPaste=!!(8192&l);var r=7;var s=0;var t=0;var u=0;var v=' ';var w=this.window.width*this.window.height;f&&(this.updateSize(),this.blinkingCellCount=0,this.screen=Array(w).fill(' '),this.screenFG=Array(w).fill(' '),this.screenBG=Array(w).fill(' '),this.screenAttrs=Array(w).fill(' '));var x=undef(Array.from)?a.split(''):Array.from(a);var y=16;for(var z=function(){var a=t;0!=(a&y)&&(' '==v&&0==(a&200)||r==s)&&(a^=y),(b.screenAttrs[u]&y)!=(a&y)&&(a&y?b.blinkingCellCount++:b.blinkingCellCount--),b.screen[u]=v,b.screenFG[u]=r,b.screenBG[u]=s,b.screenAttrs[u]=a};cw));E++);break;case SEQ_SET_COLORS:C=parse3B(x[c]+x[c+1]+x[c+2]),c+=3,r=255&C,s=255&C>>8;break;case SEQ_SET_ATTRS:C=parse2B(x[c]+x[c+1]),c+=2,t=255&C;break;case SEQ_SET_FG:C=parse2B(x[c]+x[c+1]),c+=2,r=255&C;break;case SEQ_SET_BG:C=parse2B(x[c]+x[c+1]),c+=2,s=255&C;break;default:32>B&&(A='\uFFFD'),v=A,z(u),u++;}}this.window.debug&&console.log('Blinky cells = '+this.blinkingCellCount),this.scheduleDraw('load',16),this.emit('load')}},{key:'loadLabels',value:function loadLabels(a){var b=a.split('\x01');qs('#screen-title').textContent=b[0],$('#action-buttons button').forEach(function(a,c){var d=b[c+1].trim();a.innerHTML=d?esc(d):' ',a.style.opacity=d?1:0.2})}},{key:'showNotification',value:function showNotification(a){if(console.info('Notification: '+a),Notification&&'granted'===Notification.permission){var b=new Notification('ESPTerm',{body:a});b.addEventListener('click',function(){return window.focus()})}else Notification&&'denied'!==Notification.permission?Notification.requestPermission():Notify.show(a)}},{key:'load',value:function load(a){var b=1Date.now()-50)){this._lastBeep=Date.now();var b,c;b=a.createOscillator(),c=a.createGain(),b.connect(c),c.connect(a.destination),c.gain.value=0.5,b.frequency.value=750,b.type='sine',b.start(),b.stop(a.currentTime+0.05),b=a.createOscillator(),c=a.createGain(),b.connect(c),c.connect(a.destination),c.gain.value=0.2,b.frequency.value=400,b.type='sine',b.start(a.currentTime+0.05),b.stop(a.currentTime+0.08)}}},{key:'palette',get:function get(){return this._palette||themes[0]},set:function set(a){this._palette!==a&&(this._palette=a,this.scheduleDraw('palette'))}}],[{key:'alphaToFraktur',value:function alphaToFraktur(a){var b=String.fromCodePoint;return'a'<=a&&'z'>=a?a=b(119997+a.charCodeAt(0)):'A'<=a&&'Z'>=a&&(a=frakturExceptions[a]||b(120003+a.charCodeAt(0))),a}}]),a}(); -'use strict';window.TermUpl=function(a,b,c){function d(){f('Ready...'),Modal.show('#fu_modal',e),$('#fu_form').toggleClass('busy',!1),b.blockKeys(!0)}function e(){console.log('Upload modal closed.'),clearTimeout(m),l=0,b.blockKeys(!1)}function f(a){qs('#fu_prog').textContent=a}function g(){var a=qs('#fu_text').value;return a.length?void(k=a.split('\n'),l=0,q=0,n=qs('#fu_delay').value,0>n&&(n=0,qs('#fu_delay').value=n),o={CR:'\r',LF:'\n',CRLF:'\r\n'}[qs('#fu_crlf').value],$('#fu_form').toggleClass('busy',!0),f('Starting...'),h()):void j()}function h(){if($('#fu_modal').hasClass('visible')){if(!a.canSend())return void(m=setTimeout(h,1));0===q&&(p='',0===l&&c.bracketedPaste&&(p='\x1B[200~'),p+=k[l++]+o,l===k.length&&c.bracketedPaste&&(p+='\x1B[201~'));var d;if(p.length-q<=r?(d=p.substr(q,r),q=0):(d=p.substr(q,r),q+=r),!b.sendString(d))return void f('FAILED!');var e=Math.round(1e3*(l/k.length))/10;f(l+' / '+k.length+' ('+e+'%)'),k.length>l||0f.length?a.startsWith(f)?b.sendString(a.substr(f.length)):c=!0:a.lengthJS ERROR!
'+a+'
at '+b+':'+c+':'+d,1e4,!0),!1},qs('#screen').appendChild(f.canvas),f.load(b,c),window.initSoftKeyboard(f,g),window.attachDebugScreen&&window.attachDebugScreen(f);var i=!1;var j=!1;var k=function(){i?(f.window.fitIntoWidth=window.screen.width,f.window.fitIntoHeight=window.screen.height):(f.window.fitIntoWidth=j?window.innerWidth-20:0,f.window.fitIntoHeight=j?window.innerHeight:0)};k(),window.addEventListener('resize',k);var l=function(){j=!j;var a=qs('#resize-button-icon');j?(a.classList.remove('icn-resize-small'),a.classList.add('icn-resize-full')):(a.classList.remove('icn-resize-full'),a.classList.add('icn-resize-small')),k()};if(qs('#term-fit-screen').addEventListener('click',function(){return l(),!1}),Element.prototype.requestFullscreen||Element.prototype.webkitRequestFullscreen){setInterval(function checkForFullscreen(){i&&(innerWidth!==window.screen.width||innerHeight!==window.screen.height)&&(i=!1,k())},500);var m=mk('a');m.href='#',m.addEventListener('click',function(a){a.preventDefault(),i=!0,k(),f.updateSize(),f.canvas.requestFullscreen?f.canvas.requestFullscreen():f.canvas.webkitRequestFullscreen()});var n=mk('i');n.classList.add('icn-resize-full'),m.appendChild(n);var o=mk('span');o.textContent='Fullscreen',m.appendChild(o),qs('#term-nav').insertBefore(m,qs('#term-nav').firstChild)}window.termScreen=f,window.conn=e,window.input=g,window.termUpl=h}; - -//# sourceMappingURL=app.e3b21ad.js.map \ No newline at end of file diff --git a/js/app.e3b21ad.js.map b/js/app.e3b21ad.js.map deleted file mode 100644 index 8939571..0000000 --- a/js/app.e3b21ad.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../js/lib/chibi.js","../../js/lib/keymaster.js","../../js/lib/polyfills.js","../../js/utils.js","../../js/modal.js","../../js/notif.js","../../js/appcommon.js","../../js/demo.js","../../js/lang.js","../../js/wifi.js","../../js/term_conn.js","../../js/term_input.js","../../js/term_screen.js","../../js/term_upload.js","../../js/debug_screen.js","../../js/soft_keyboard.js","../../js/term.js"],"names":[],"mappings":"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","file":"app.e3b21ad.js","sourcesContent":["/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */\n\n// MODIFIED VERSION.\n(function () {\n\t'use strict';\n\n\tvar readyfn = [],\n\t\tloadedfn = [],\n\t\tdomready = false,\n\t\tpageloaded = false,\n\t\td = document,\n\t\tw = window;\n\n\t// Fire any function calls on ready event\n\tfunction fireReady() {\n\t\tvar i;\n\t\tdomready = true;\n\t\tfor (i = 0; i < readyfn.length; i += 1) {\n\t\t\treadyfn[i]();\n\t\t}\n\t\treadyfn = [];\n\t}\n\n\t// Fire any function calls on loaded event\n\tfunction fireLoaded() {\n\t\tvar i;\n\t\tpageloaded = true;\n\t\t// For browsers with no DOM loaded support\n\t\tif (!domready) {\n\t\t\tfireReady();\n\t\t}\n\t\tfor (i = 0; i < loadedfn.length; i += 1) {\n\t\t\tloadedfn[i]();\n\t\t}\n\t\tloadedfn = [];\n\t}\n\n\t// Check DOM ready, page loaded\n\tif (d.addEventListener) {\n\t\t// Standards\n\t\td.addEventListener('DOMContentLoaded', fireReady, false);\n\t\tw.addEventListener('load', fireLoaded, false);\n\t} else if (d.attachEvent) {\n\t\t// IE\n\t\td.attachEvent('onreadystatechange', fireReady);\n\t\t// IE < 9\n\t\tw.attachEvent('onload', fireLoaded);\n\t} else {\n\t\t// Anything else\n\t\tw.onload = fireLoaded;\n\t}\n\n\t// Utility functions\n\n\t// Loop through node array\n\tfunction nodeLoop(fn, nodes) {\n\t\tvar i;\n\t\t// Good idea to walk up the DOM\n\t\tfor (i = nodes.length - 1; i >= 0; i -= 1) {\n\t\t\tfn(nodes[i]);\n\t\t}\n\t}\n\n\t// Convert to camel case\n\tfunction cssCamel(property) {\n\t\treturn property.replace(/-\\w/g, function (result) {\n\t\t\treturn result.charAt(1).toUpperCase();\n\t\t});\n\t}\n\n\t// Get computed style\n\tfunction computeStyle(elm, property) {\n\t\t// IE, everything else or null\n\t\treturn (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null;\n\n\t}\n\n\t// Returns URI encoded query string pair\n\tfunction queryPair(name, value) {\n\t\treturn encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+');\n\t}\n\n\t// Set CSS, important to wrap in try to prevent error thown on unsupported property\n\tfunction setCss(elm, property, value) {\n\t\ttry {\n\t\t\telm.style[cssCamel(property)] = value;\n\t\t} catch (e) {\n\t\t}\n\t}\n\n\t// Show CSS\n\tfunction showCss(elm) {\n\t\telm.style.display = '';\n\t\t// For elements still hidden by style block\n\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\telm.style.display = 'block';\n\t\t}\n\t}\n\n\t// Serialize form & JSON values\n\tfunction serializeData(nodes) {\n\t\tvar querystring = '', subelm, i, j;\n\t\tif (nodes.constructor === Object) { // Serialize JSON data\n\t\t\tfor (subelm in nodes) {\n\t\t\t\tif (nodes.hasOwnProperty(subelm)) {\n\t\t\t\t\tif (nodes[subelm].constructor === Array) {\n\t\t\t\t\t\tfor (i = 0; i < nodes[subelm].length; i += 1) {\n\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm][i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else { // Serialize node data\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (elm.nodeName === 'FORM') {\n\t\t\t\t\tfor (i = 0; i < elm.elements.length; i += 1) {\n\t\t\t\t\t\tsubelm = elm.elements[i];\n\n\t\t\t\t\t\tif (!subelm.disabled) {\n\t\t\t\t\t\t\tswitch (subelm.type) {\n\t\t\t\t\t\t\t\t// Ignore buttons, unsupported XHR 1 form fields\n\t\t\t\t\t\t\t\tcase 'button':\n\t\t\t\t\t\t\t\tcase 'image':\n\t\t\t\t\t\t\t\tcase 'file':\n\t\t\t\t\t\t\t\tcase 'submit':\n\t\t\t\t\t\t\t\tcase 'reset':\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-one':\n\t\t\t\t\t\t\t\t\tif (subelm.length > 0) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-multiple':\n\t\t\t\t\t\t\t\t\tfor (j = 0; j < subelm.length; j += 1) {\n\t\t\t\t\t\t\t\t\t\tif (subelm[j].selected) {\n\t\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm[j].value);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'checkbox':\n\t\t\t\t\t\t\t\tcase 'radio':\n\t\t\t\t\t\t\t\t\tif (subelm.checked) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t// Everything else including shinny new HTML5 input types\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\t// Tidy up first &\n\t\treturn (querystring.length > 0) ? querystring.substring(1) : '';\n\t}\n\n\t// Class helper\n\tfunction classHelper(classes, action, nodes) {\n\t\tvar classarray, search, i, replace, has = false;\n\t\tif (classes) {\n\t\t\t// Trim any whitespace\n\t\t\tclassarray = classes.split(/\\s+/);\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tfor (i = 0; i < classarray.length; i += 1) {\n\t\t\t\t\tvar clz = classarray[i];\n\t\t\t\t\tif (action === 'remove') {\n\t\t\t\t\t\telm.classList.remove(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'add') {\n\t\t\t\t\t\telm.classList.add(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'toggle') {\n\t\t\t\t\t\telm.classList.toggle(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'has') {\n\t\t\t\t\t\tif (elm.classList.contains(clz)) {\n\t\t\t\t\t\t\thas = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// search = new RegExp('\\\\b' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// replace = new RegExp(' *' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// if (action === 'remove') {\n\t\t\t\t\t// \telm.className = elm.className.replace(search, '');\n\t\t\t\t\t// } else if (action === 'toggle') {\n\t\t\t\t\t// \telm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i];\n\t\t\t\t\t// } else if (action === 'has') {\n\t\t\t\t\t// \tif (elm.className.match(search)) {\n\t\t\t\t\t// \t\thas = true;\n\t\t\t\t\t// \t\tbreak;\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\treturn has;\n\t}\n\n\t// HTML insertion helper\n\tfunction insertHtml(value, position, nodes) {\n\t\tvar tmpnodes, tmpnode;\n\t\tif (value) {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead\n\t\t\t\t// Convert string to node. We can't innerHTML on a document fragment\n\t\t\t\ttmpnodes = d.createElement('div');\n\t\t\t\ttmpnodes.innerHTML = value;\n\t\t\t\twhile ((tmpnode = tmpnodes.lastChild) !== null) {\n\t\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (position === 'before') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm);\n\t\t\t\t\t\t} else if (position === 'after') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm.nextSibling);\n\t\t\t\t\t\t} else if (position === 'append') {\n\t\t\t\t\t\t\telm.appendChild(tmpnode);\n\t\t\t\t\t\t} else if (position === 'prepend') {\n\t\t\t\t\t\t\telm.insertBefore(tmpnode, elm.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t}\n\n\t// Get nodes and return chibi\n\tfunction chibi(selector) {\n\t\tvar cb, nodes = [], json = false, nodelist, i;\n\n\t\tif (selector) {\n\n\t\t\t// Element node, would prefer to use (selector instanceof HTMLElement) but no IE support\n\t\t\tif (selector.nodeType && selector.nodeType === 1) {\n\t\t\t\tnodes = [selector]; // return element as node list\n\t\t\t} else if (typeof selector === 'object') {\n\t\t\t\t// JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support\n\t\t\t\tjson = (typeof selector.length !== 'number');\n\t\t\t\tnodes = selector;\n\t\t\t} else if (typeof selector === 'string') {\n\t\t\t\tnodelist = d.querySelectorAll(selector);\n\n\t\t\t\t// Convert node list to array so results have full access to array methods\n\t\t\t\t// Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway\n\t\t\t\tfor (i = 0; i < nodelist.length; i += 1) {\n\t\t\t\t\tnodes[i] = nodelist[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Only attach nodes if not JSON\n\t\tcb = json ? {} : nodes;\n\n\t\t// Public functions\n\n\t\t// Executes a function on nodes\n\t\tcb.each = function (fn) {\n\t\t\tif (typeof fn === 'function') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply\n\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Find first\n\t\tcb.first = function () {\n\t\t\treturn chibi(nodes.shift());\n\t\t};\n\t\t// Find last\n\t\tcb.last = function () {\n\t\t\treturn chibi(nodes.pop());\n\t\t};\n\t\t// Find odd\n\t\tcb.odd = function () {\n\t\t\tvar odds = [], i;\n\t\t\tfor (i = 0; i < nodes.length; i += 2) {\n\t\t\t\todds.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(odds);\n\t\t};\n\t\t// Find even\n\t\tcb.even = function () {\n\t\t\tvar evens = [], i;\n\t\t\tfor (i = 1; i < nodes.length; i += 2) {\n\t\t\t\tevens.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(evens);\n\t\t};\n\t\t// Hide node\n\t\tcb.hide = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\telm.style.display = 'none';\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Show node\n\t\tcb.show = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tshowCss(elm);\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle node display\n\t\tcb.toggle = function (state) {\n\t\t\tif (typeof state != 'undefined') { // ADDED\n\t\t\t\tif (state)\n\t\t\t\t\tcb.show();\n\t\t\t\telse\n\t\t\t\t\tcb.hide();\n\t\t\t} else {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// computeStyle instead of style.display == 'none' catches elements that are hidden via style block\n\t\t\t\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\t\t\t\tshowCss(elm);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telm.style.display = 'none';\n\t\t\t\t\t}\n\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove node\n\t\tcb.remove = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\ttry {\n\t\t\t\t\telm.parentNode.removeChild(elm);\n\t\t\t\t} catch (e) {\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn chibi();\n\t\t};\n\t\t// Get/Set CSS\n\t\tcb.css = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tif (value || value === '') {\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tsetCss(elm, property, value);\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (nodes[0].style[cssCamel(property)]) {\n\t\t\t\t\t\treturn nodes[0].style[cssCamel(property)];\n\t\t\t\t\t}\n\t\t\t\t\tif (computeStyle(nodes[0], property)) {\n\t\t\t\t\t\treturn computeStyle(nodes[0], property);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get class(es)\n\t\tcb.getClass = function () {\n\t\t\tif (nodes[0] && nodes[0].className.length > 0) {\n\t\t\t\t// Weak IE trim support\n\t\t\t\treturn nodes[0].className.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '').replace(/\\s+/, ' ');\n\t\t\t}\n\t\t};\n\t\t// Set (replaces) classes\n\t\tcb.setClass = function (classes) {\n\t\t\tif (classes || classes === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.className = classes;\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Add class\n\t\tcb.addClass = function (classes) {\n\t\t\tclassHelper(classes, 'add', nodes);\n\t\t\t// if (classes) {\n\t\t\t// \tnodeLoop(function (elm) {\n\t\t\t// \t\telm.className += ' ' + classes;\n\t\t\t// \t}, nodes);\n\t\t\t// }\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove class\n\t\tcb.removeClass = function (classes) {\n\t\t\tclassHelper(classes, 'remove', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle class\n\t\tcb.toggleClass = function (classes, set) {\n\t\t\tvar method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove'));\n\t\t\tclassHelper(classes, method, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Has class\n\t\tcb.hasClass = function (classes) {\n\t\t\treturn classHelper(classes, 'has', nodes);\n\t\t};\n\t\t// Get/set HTML\n\t\tcb.html = function (value) {\n\t\t\tif (value || value === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.innerHTML = value;\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\treturn nodes[0].innerHTML;\n\t\t\t}\n\t\t};\n\t\t// Insert HTML before selector\n\t\tcb.htmlBefore = function (value) {\n\t\t\tinsertHtml(value, 'before', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector\n\t\tcb.htmlAfter = function (value) {\n\t\t\tinsertHtml(value, 'after', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector innerHTML\n\t\tcb.htmlAppend = function (value) {\n\t\t\tinsertHtml(value, 'append', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML before selector innerHTML\n\t\tcb.htmlPrepend = function (value) {\n\t\t\tinsertHtml(value, 'prepend', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Get/Set HTML attributes\n\t\tcb.attr = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tproperty = property.toLowerCase();\n\t\t\t\t// IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway\n\t\t\t\tif (typeof value !== 'undefined') {//FIXED BUG HERE\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\t\telm.style.cssText = value;\n\t\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\t\telm.className = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telm.setAttribute(property, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\tif (nodes[0].style.cssText) {\n\t\t\t\t\t\t\treturn nodes[0].style.cssText;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\tif (nodes[0].className) {\n\t\t\t\t\t\t\treturn nodes[0].className;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (nodes[0].getAttribute(property)) {\n\t\t\t\t\t\t\treturn nodes[0].getAttribute(property);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get/Set HTML data property\n\t\tcb.data = function (key, value) {\n\t\t\tif (key) {\n\t\t\t\treturn cb.attr('data-' + key, value);\n\t\t\t}\n\t\t};\n\t\t// Get/Set form element values\n\t\tcb.val = function (value) {\n\t\t\tvar values, i, j;\n\t\t\tif (typeof value != 'undefined') { // FIXED A BUG HERE\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tswitch (elm.nodeName) {\n\t\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\t\t\t\tvalue = [value];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (i = 0; i < elm.length; i += 1) {\n\t\t\t\t\t\t\t\t// Multiple select\n\t\t\t\t\t\t\t\tfor (j = 0; j < value.length; j += 1) {\n\t\t\t\t\t\t\t\t\telm[i].selected = '';\n\t\t\t\t\t\t\t\t\tif (elm[i].value === \"\"+value[j]) {\n\t\t\t\t\t\t\t\t\t\telm[i].selected = 'selected';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\t\telm.value = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\tswitch (nodes[0].nodeName) {\n\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\tvalues = [];\n\t\t\t\t\t\tfor (i = 0; i < nodes[0].length; i += 1) {\n\t\t\t\t\t\t\tif (nodes[0][i].selected) {\n\t\t\t\t\t\t\t\tvalues.push(nodes[0][i].value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (values.length > 1) ? values : values[0];\n\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\treturn nodes[0].value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Return matching checked checkbox or radios\n\t\tcb.checked = function (check) {\n\t\t\tif (typeof check === 'boolean') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tif (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) {\n\t\t\t\t\t\telm.checked = check;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) {\n\t\t\t\treturn (!!nodes[0].checked);\n\t\t\t}\n\t\t};\n\t\t// Add event handler\n\t\tcb.on = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.addEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions)\n\t\t\t\t\telm[event + fn] = function () {\n\t\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t\t};\n\t\t\t\t\telm.attachEvent('on' + event, elm[event + fn]);\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove event handler\n\t\tcb.off = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.removeEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\telm.detachEvent('on' + event, elm[event + fn]);\n\t\t\t\t\t// Tidy up\n\t\t\t\t\telm[event + fn] = null;\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\treturn cb;\n\t}\n\n\t// Basic XHR\n\tchibi.ajax = function (options) { // if options is a number, it's timeout in ms\n\t\tvar opts = Object.assign({\n\t\t\tmethod: 'GET',\n\t\t\tnocache: true,\n\t\t\ttimeout: 5000,\n\t\t\tloader: true,\n\t\t\tcallback: null\n\t\t}, options);\n\t\topts.method = opts.method.toUpperCase();\n\n\t\tvar loaderFn = opts.loader ? chibi._loader : function(){};\n\t\tvar url = opts.url;\n\t\tvar method = opts.method;\n\t\tvar query = null;\n\n\t\tif (opts.data) {\n\t\t\tquery = serializeData(opts.data);\n\t\t}\n\n\t\tif (query && (method === 'GET')) {\n\t\t\turl += (url.indexOf('?') === -1) ? '?' + query : '&' + query;\n\t\t\tquery = null;\n\t\t}\n\n\t\tvar xhr = new XMLHttpRequest();\n\n\t\t// prevent caching\n\t\tif (opts.nocache) {\n\t\t\tvar ts = (+(new Date())).toString(36);\n\t\t\turl += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts;\n\t\t}\n\n\t\tloaderFn(true);\n\n\t\txhr.open(method, url, true);\n\t\txhr.timeout = opts.timeout;\n\n\t\t// Abort after given timeout\n\t\tvar abortTmeo = setTimeout(function () {\n\t\t\tconsole.error(\"XHR timed out.\");\n\t\t\txhr.abort();\n\t\t\tloaderFn(false);\n\t\t}, opts.timeout + 10);\n\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tloaderFn(false);\n\n\t\t\t\topts.callback && opts.callback(xhr.responseText, xhr.status);\n\n\t\t\t\tclearTimeout(abortTmeo);\n\t\t\t}\n\t\t};\n\n\t\txhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\tif (method === 'POST') {\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t}\n\n\t\txhr.send(query);\n\t\treturn xhr;\n\t};\n\n\tchibi._loader = function(){};\n\n\t// Alias to cb.ajax(url, 'get', callback)\n\tchibi.get = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'GET';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Alias to cb.ajax(url, 'post', callback)\n\tchibi.post = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'POST';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Fire on DOM ready\n\tchibi.ready = function (fn) {\n\t\tif (fn) {\n\t\t\tif (domready) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\treadyfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\t// Fire on page loaded\n\tchibi.loaded = function (fn) {\n\t\tif (fn) {\n\t\t\tif (pageloaded) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\tloadedfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar entityMap = {\n\t\t'&': '&',\n\t\t'<': '<',\n\t\t'>': '>',\n\t\t'\"': '"',\n\t\t\"'\": ''',\n\t\t'/': '/',\n\t\t'`': '`',\n\t\t'=': '='\n\t};\n\n\tchibi.htmlEscape = function(string) {\n\t\treturn String(string).replace(/[&<>\"'`=\\/]/g, function (s) {\n\t\t\treturn entityMap[s];\n\t\t});\n\t};\n\n\t// Set Chibi's global namespace here ($)\n\tw.$ = chibi;\n}());\n","// keymaster.js\n// (c) 2011-2013 Thomas Fuchs\n// keymaster.js may be freely distributed under the MIT license.\n\n;(function(global){\n var k,\n _handlers = {},\n _mods = { 16: false, 18: false, 17: false, 91: false },\n _scope = 'all',\n // modifier keys\n _MODIFIERS = {\n '⇧': 16, shift: 16,\n '⌥': 18, alt: 18, option: 18,\n '⌃': 17, ctrl: 17, control: 17,\n '⌘': 91, command: 91\n },\n // special keys\n _MAP = {\n backspace: 8, tab: 9, clear: 12,\n enter: 13, 'return': 13,\n esc: 27, escape: 27, space: 32,\n left: 37, up: 38,\n right: 39, down: 40,\n del: 46, 'delete': 46,\n home: 36, end: 35,\n pageup: 33, pagedown: 34,\n ',': 188, '.': 190, '/': 191,\n '`': 192, '-': 189, '=': 187,\n ';': 186, '\\'': 222,\n '[': 219, ']': 221, '\\\\': 220,\n // added:\n insert: 45,\n np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101,\n\t np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106,\n\t np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144,\n },\n code = function(x){\n return _MAP[x] || x.toUpperCase().charCodeAt(0);\n },\n _downKeys = [];\n\n for(k=1;k<20;k++) _MAP['f'+k] = 111+k;\n\n // IE doesn't support Array#indexOf, so have a simple replacement\n function index(array, item){\n var i = array.length;\n while(i--) if(array[i]===item) return i;\n return -1;\n }\n\n // for comparing mods before unassignment\n function compareArray(a1, a2) {\n if (a1.length != a2.length) return false;\n for (var i = 0; i < a1.length; i++) {\n if (a1[i] !== a2[i]) return false;\n }\n return true;\n }\n\n var modifierMap = {\n 16:'shiftKey',\n 18:'altKey',\n 17:'ctrlKey',\n 91:'metaKey'\n };\n function updateModifierKey(event) {\n for(k in _mods) _mods[k] = event[modifierMap[k]];\n };\n\n function isModifierPressed(mod) {\n if (mod=='control'||mod=='ctrl') return _mods[17];\n\tif (mod=='shift') return _mods[16];\n\tif (mod=='meta') return _mods[91];\n\tif (mod=='alt') return _mods[18];\n\treturn false;\n }\n\n // handle keydown event\n function dispatch(event) {\n var key, handler, k, i, modifiersMatch, scope;\n key = event.keyCode;\n\n if (index(_downKeys, key) == -1) {\n _downKeys.push(key);\n }\n\n // if a modifier key, set the key. property to true and return\n if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko\n if(key in _mods) {\n _mods[key] = true;\n // 'assignKey' from inside this closure is exported to window.key\n for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true;\n return;\n }\n updateModifierKey(event);\n\n // see if we need to ignore the keypress (filter() can can be overridden)\n // by default ignore key presses if a select, textarea, or input is focused\n if(!assignKey.filter.call(this, event)) return;\n\n // abort if no potentially matching shortcuts found\n if (!(key in _handlers)) return;\n\n scope = getScope();\n\n // for each potential shortcut\n for (i = 0; i < _handlers[key].length; i++) {\n handler = _handlers[key][i];\n\n // see if it's in the current scope\n if(handler.scope == scope || handler.scope == 'all'){\n // check if modifiers match if any\n modifiersMatch = handler.mods.length > 0;\n for(k in _mods)\n if((!_mods[k] && index(handler.mods, +k) > -1) ||\n (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false;\n // call the handler and stop the event if neccessary\n if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){\n if(handler.method(event, handler)===false){\n if(event.preventDefault) event.preventDefault();\n else event.returnValue = false;\n if(event.stopPropagation) event.stopPropagation();\n if(event.cancelBubble) event.cancelBubble = true;\n }\n }\n }\n }\n };\n\n // unset modifier keys on keyup\n function clearModifier(event){\n var key = event.keyCode, k,\n i = index(_downKeys, key);\n\n // remove key from _downKeys\n if (i >= 0) {\n _downKeys.splice(i, 1);\n }\n\n if(key == 93 || key == 224) key = 91;\n if(key in _mods) {\n _mods[key] = false;\n for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false;\n }\n };\n\n function resetModifiers() {\n for(k in _mods) _mods[k] = false;\n for(k in _MODIFIERS) assignKey[k] = false;\n };\n\n // parse and assign shortcut\n function assignKey(key, scope, method){\n var keys, mods;\n keys = getKeys(key);\n if (method === undefined) {\n method = scope;\n scope = 'all';\n }\n\n // for each shortcut\n for (var i = 0; i < keys.length; i++) {\n // set modifier keys if any\n mods = [];\n key = keys[i].split('+');\n if (key.length > 1){\n mods = getMods(key);\n key = [key[key.length-1]];\n }\n // convert to keycode and...\n key = key[0]\n key = code(key);\n // ...store handler\n if (!(key in _handlers)) _handlers[key] = [];\n _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods });\n }\n };\n\n // unbind all handlers for given key in current scope\n function unbindKey(key, scope) {\n var multipleKeys, keys,\n mods = [],\n i, j, obj;\n\n multipleKeys = getKeys(key);\n\n for (j = 0; j < multipleKeys.length; j++) {\n keys = multipleKeys[j].split('+');\n\n if (keys.length > 1) {\n mods = getMods(keys);\n }\n\n key = keys[keys.length - 1];\n key = code(key);\n\n if (scope === undefined) {\n scope = getScope();\n }\n if (!_handlers[key]) {\n return;\n }\n for (i = 0; i < _handlers[key].length; i++) {\n obj = _handlers[key][i];\n // only clear handlers if correct scope and mods match\n if (obj.scope === scope && compareArray(obj.mods, mods)) {\n _handlers[key][i] = {};\n }\n }\n }\n };\n\n // Returns true if the key with code 'keyCode' is currently down\n // Converts strings into key codes.\n function isPressed(keyCode) {\n if (typeof(keyCode)=='string') {\n keyCode = code(keyCode);\n }\n return index(_downKeys, keyCode) != -1;\n }\n\n function getPressedKeyCodes() {\n return _downKeys.slice(0);\n }\n\n function filter(event){\n var tagName = (event.target || event.srcElement).tagName;\n // ignore keypressed in any elements that support keyboard data input\n return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');\n }\n\n // initialize key. to false\n for(k in _MODIFIERS) assignKey[k] = false;\n\n // set current scope (default 'all')\n function setScope(scope){ _scope = scope || 'all' };\n function getScope(){ return _scope || 'all' };\n\n // delete all handlers for a given scope\n function deleteScope(scope){\n var key, handlers, i;\n\n for (key in _handlers) {\n handlers = _handlers[key];\n for (i = 0; i < handlers.length; ) {\n if (handlers[i].scope === scope) handlers.splice(i, 1);\n else i++;\n }\n }\n };\n\n // abstract key logic for assign and unassign\n function getKeys(key) {\n var keys;\n key = key.replace(/\\s/g, '');\n keys = key.split(',');\n if ((keys[keys.length - 1]) == '') {\n keys[keys.length - 2] += ',';\n }\n return keys;\n }\n\n // abstract mods logic for assign and unassign\n function getMods(key) {\n var mods = key.slice(0, key.length - 1);\n for (var mi = 0; mi < mods.length; mi++)\n mods[mi] = _MODIFIERS[mods[mi]];\n return mods;\n }\n\n // cross-browser events\n function addEvent(object, event, method) {\n if (object.addEventListener)\n object.addEventListener(event, method, false);\n else if(object.attachEvent)\n object.attachEvent('on'+event, function(){ method(window.event) });\n };\n\n // set the handlers globally on document\n addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48\n addEvent(document, 'keyup', clearModifier);\n\n // reset modifiers to false whenever the window is (re)focused.\n addEvent(window, 'focus', resetModifiers);\n\n // store previously defined key\n var previousKey = global.key;\n\n // restore previously defined key and return reference to our key object\n function noConflict() {\n var k = global.key;\n global.key = previousKey;\n return k;\n }\n\n // set window.key and window.key.set/get/deleteScope, and the default filter\n global.key = assignKey;\n global.key.setScope = setScope;\n global.key.getScope = getScope;\n global.key.deleteScope = deleteScope;\n global.key.filter = filter;\n global.key.isPressed = isPressed;\n global.key.isModifier = isModifierPressed;\n global.key.getPressedKeyCodes = getPressedKeyCodes;\n global.key.noConflict = noConflict;\n global.key.unbind = unbindKey;\n\n if(typeof module !== 'undefined') module.exports = assignKey;\n\n})(window);\n\n","/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\nif (!String.fromCodePoint) {\n (function () {\n var defineProperty = (function () {\n // IE 8 only supports `Object.defineProperty` on DOM elements\n try {\n var object = {};\n var $defineProperty = Object.defineProperty;\n var result = $defineProperty(object, object, object) && $defineProperty;\n } catch (error) {\n }\n return result;\n }());\n var stringFromCharCode = String.fromCharCode;\n var floor = Math.floor;\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000;\n var codeUnits = [];\n var highSurrogate;\n var lowSurrogate;\n var index = -1;\n var length = arguments.length;\n if (!length) {\n return '';\n }\n var result = '';\n while (++index < length) {\n var codePoint = Number(arguments[index]);\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) != codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint);\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint);\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n highSurrogate = (codePoint >> 10) + 0xD800;\n lowSurrogate = (codePoint % 0x400) + 0xDC00;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 == length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n if (defineProperty) {\n defineProperty(String, 'fromCodePoint', {\n 'value': fromCodePoint,\n 'configurable': true,\n 'writable': true\n });\n } else {\n String.fromCodePoint = fromCodePoint;\n }\n }());\n}\n","/** Make a node */\nfunction mk (e) {\n return document.createElement(e)\n}\n\n/** Find one by query */\nfunction qs (s) {\n return document.querySelector(s)\n}\n\n/** Find all by query */\nfunction qsa (s) {\n return document.querySelectorAll(s)\n}\n\n/** Convert any to bool safely */\nfunction bool (x) {\n return (x === 1 || x === '1' || x === true || x === 'true')\n}\n\n/**\n * Filter 'spacebar' and 'return' from keypress handler,\n * and when they're pressed, fire the callback.\n * use $(...).on('keypress', cr(handler))\n */\nfunction cr (hdl) {\n return function (e) {\n if (e.which === 10 || e.which === 13 || e.which === 32) {\n hdl()\n }\n }\n}\n\n/** HTML escape */\nfunction esc (str) {\n return $.htmlEscape(str)\n}\n\n/** Check for undefined */\nfunction undef (x) {\n return typeof x == 'undefined'\n}\n\n/** Safe json parse */\nfunction jsp (str) {\n try {\n return JSON.parse(str)\n } catch (e) {\n console.error(e)\n return null\n }\n}\n\n/** Create a character from ASCII code */\nfunction Chr (n) {\n return String.fromCharCode(n)\n}\n\n/** Decode number from 2B encoding */\nfunction parse2B (s, i = 0) {\n return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127\n}\n\n/** Decode number from 3B encoding */\nfunction parse3B (s, i = 0) {\n return (s.charCodeAt(i) - 1) + (s.charCodeAt(i + 1) - 1) * 127 + (s.charCodeAt(i + 2) - 1) * 127 * 127\n}\n\n/** Encode using 2B encoding, returns string. */\nfunction encode2B (n) {\n let lsb, msb\n lsb = (n % 127)\n n = ((n - lsb) / 127)\n lsb += 1\n msb = (n + 1)\n return Chr(lsb) + Chr(msb)\n}\n\n/** Encode using 3B encoding, returns string. */\nfunction encode3B (n) {\n let lsb, msb, xsb\n lsb = (n % 127)\n n = (n - lsb) / 127\n lsb += 1\n msb = (n % 127)\n n = (n - msb) / 127\n msb += 1\n xsb = (n + 1)\n return Chr(lsb) + Chr(msb) + Chr(xsb)\n}\n","/** Module for toggling a modal overlay */\n(function () {\n let modal = {}\n let curCloseCb = null\n\n modal.show = function (sel, closeCb) {\n let $m = $(sel)\n $m.removeClass('hidden visible')\n setTimeout(function () {\n $m.addClass('visible')\n }, 1)\n curCloseCb = closeCb\n }\n\n modal.hide = function (sel) {\n let $m = $(sel)\n $m.removeClass('visible')\n setTimeout(function () {\n $m.addClass('hidden')\n if (curCloseCb) curCloseCb()\n }, 500) // transition time\n }\n\n modal.init = function () {\n // close modal by click outside the dialog\n $('.Modal').on('click', function () {\n if ($(this).hasClass('no-close')) return // this is a no-close modal\n modal.hide(this)\n })\n\n $('.Dialog').on('click', function (e) {\n e.stopImmediatePropagation()\n })\n\n // Hide all modals on esc\n $(window).on('keydown', function (e) {\n if (e.which === 27) {\n modal.hide('.Modal')\n }\n })\n }\n\n window.Modal = modal\n})()\n","window.Notify = (function () {\n let nt = {}\n const sel = '#notif'\n let $balloon\n\n let timerHideBegin // timeout to start hiding (transition)\n let timerHideEnd // timeout to add the hidden class\n let timerCanCancel\n let canCancel = false\n\n let stopTimeouts = function () {\n clearTimeout(timerHideBegin)\n clearTimeout(timerHideEnd)\n }\n\n nt.show = function (message, timeout, isError) {\n $balloon.toggleClass('error', isError === true)\n $balloon.html(message)\n Modal.show($balloon)\n stopTimeouts()\n\n if (undef(timeout) || timeout === null || timeout <= 0) {\n timeout = 2500\n }\n\n timerHideBegin = setTimeout(nt.hide, timeout)\n\n canCancel = false\n timerCanCancel = setTimeout(function () {\n canCancel = true\n }, 500)\n }\n\n nt.hide = function () {\n let $m = $(sel)\n $m.removeClass('visible')\n timerHideEnd = setTimeout(function () {\n $m.addClass('hidden')\n }, 250) // transition time\n }\n\n nt.init = function () {\n $balloon = $(sel)\n\n // close by click outside\n $(document).on('click', function () {\n if (!canCancel) return\n nt.hide(this)\n })\n\n // click caused by selecting, prevent it from bubbling\n $balloon.on('click', function (e) {\n e.stopImmediatePropagation()\n return false\n })\n\n // stop fading if moused\n $balloon.on('mouseenter', function () {\n stopTimeouts()\n $balloon.removeClass('hidden').addClass('visible')\n })\n }\n\n return nt\n})()\n","/** Global generic init */\n$.ready(function () {\n // Checkbox UI (checkbox CSS and hidden input with int value)\n $('.Row.checkbox').forEach(function (x) {\n let inp = x.querySelector('input')\n let box = x.querySelector('.box')\n\n $(box).toggleClass('checked', inp.value)\n\n let hdl = function () {\n inp.value = 1 - inp.value\n $(box).toggleClass('checked', inp.value)\n }\n\n $(x).on('click', hdl).on('keypress', cr(hdl))\n })\n\n // Expanding boxes on mobile\n $('.Box.mobcol,.Box.fold').forEach(function (x) {\n let h = x.querySelector('h2')\n\n let hdl = function () {\n $(x).toggleClass('expanded')\n }\n $(h).on('click', hdl).on('keypress', cr(hdl))\n })\n\n $('form').forEach(function (x) {\n $(x).on('keypress', function (e) {\n if ((e.keyCode === 10 || e.keyCode === 13) && e.ctrlKey) {\n x.submit()\n }\n })\n })\n\n // loader dots...\n setInterval(function () {\n $('.anim-dots').each(function (x) {\n let $x = $(x)\n let dots = $x.html() + '.'\n if (dots.length === 5) dots = '.'\n $x.html(dots)\n })\n }, 1000)\n\n // flipping number boxes with the mouse wheel\n $('input[type=number]').on('mousewheel', function (e) {\n let $this = $(this)\n let val = +$this.val()\n if (isNaN(val)) val = 1\n\n const step = +($this.attr('step') || 1)\n const min = +$this.attr('min')\n const max = +$this.attr('max')\n if (e.wheelDelta > 0) {\n val += step\n } else {\n val -= step\n }\n\n if (undef(min)) val = Math.max(val, +min)\n if (undef(max)) val = Math.min(val, +max)\n $this.val(val)\n\n if ('createEvent' in document) {\n let evt = document.createEvent('HTMLEvents')\n evt.initEvent('change', false, true)\n $this[0].dispatchEvent(evt)\n } else {\n $this[0].fireEvent('onchange')\n }\n\n e.preventDefault()\n })\n\n // populate the form errors box from GET arg ?err=...\n // (a way to pass errors back from server via redirect)\n let errAt = location.search.indexOf('err=')\n if (errAt !== -1 && qs('.Box.errors')) {\n let errs = location.search.substr(errAt + 4).split(',')\n let humanReadableErrors = []\n errs.forEach(function (er) {\n let lbl = qs('label[for=\"' + er + '\"]')\n if (lbl) {\n lbl.classList.add('error')\n humanReadableErrors.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, ''))\n }\n // else {\n // hres.push(er)\n // }\n })\n\n qs('.Box.errors .list').innerHTML = humanReadableErrors.join(', ')\n qs('.Box.errors').classList.remove('hidden')\n }\n\n Modal.init()\n Notify.init()\n\n // remove tabindices from h2 if wide\n if (window.innerWidth > 550) {\n $('.Box h2').forEach(function (x) {\n x.removeAttribute('tabindex')\n })\n\n // brand works as a link back to term in widescreen mode\n let br = qs('#brand')\n br && br.addEventListener('click', function () {\n location.href = '/' // go to terminal\n })\n }\n})\n\n// setup the ajax loader\n$._loader = function (vis) {\n $('#loader').toggleClass('show', vis)\n}\n\n// reveal content on load\nfunction showPage () {\n $('#content').addClass('load')\n}\n\n// Auto reveal pages other than the terminal (sets window.noAutoShow)\n$.ready(function () {\n if (window.noAutoShow !== true) {\n setTimeout(function () {\n showPage()\n }, 1)\n }\n})\n","class ANSIParser {\n constructor (handler) {\n this.reset()\n this.handler = handler\n this.joinChunks = true\n }\n reset () {\n this.currentSequence = 0\n this.sequence = ''\n }\n parseSequence (sequence) {\n if (sequence[0] === '[') {\n let type = sequence[sequence.length - 1]\n let content = sequence.substring(1, sequence.length - 1)\n\n let numbers = content ? content.split(';').map(i => +i.replace(/\\D/g, '')) : []\n let numOr1 = numbers.length ? numbers[0] : 1\n if (type === 'H') {\n this.handler('set-cursor', (numbers[0] | 0) - 1, (numbers[1] | 0) - 1)\n } else if (type >= 'A' && type <= 'D') {\n this.handler(`move-cursor-${type <= 'B' ? 'y' : 'x'}`, ((type === 'B' || type === 'C') ? 1 : -1) * numOr1)\n } else if (type === 'E' || type === 'F') {\n this.handler('move-cursor-line', (type === 'E' ? 1 : -1) * numOr1)\n } else if (type === 'G') {\n this.handler('set-cursor-x', numOr1 - 1)\n } else if (type === 'J') {\n let number = numbers.length ? numbers[0] : 2\n if (number === 2) this.handler('clear')\n } else if (type === 'P') {\n this.handler('delete', numOr1)\n } else if (type === '@') {\n this.handler('insert-blanks', numOr1)\n } else if (type === 'q') this.handler('set-cursor-style', numOr1)\n else if (type === 'm') {\n if (!numbers.length || numbers[0] === 0) {\n this.handler('reset-style')\n return\n }\n let type = numbers[0]\n if (type === 1) this.handler('add-attrs', 1) // bold\n else if (type === 2) this.handler('add-attrs', 1 << 1) // faint\n else if (type === 3) this.handler('add-attrs', 1 << 2) // italic\n else if (type === 4) this.handler('add-attrs', 1 << 3) // underline\n else if (type === 5 || type === 6) this.handler('add-attrs', 1 << 4) // blink\n else if (type === 7) this.handler('add-attrs', -1) // invert\n else if (type === 9) this.handler('add-attrs', 1 << 6) // strike\n else if (type === 20) this.handler('add-attrs', 1 << 5) // fraktur\n else if (type >= 30 && type <= 37) this.handler('set-color-fg', type % 10)\n else if (type >= 40 && type <= 47) this.handler('set-color-bg', type % 10)\n else if (type === 39) this.handler('set-color-fg', 7)\n else if (type === 49) this.handler('set-color-bg', 0)\n else if (type >= 90 && type <= 98) this.handler('set-color-fg', (type % 10) + 8)\n else if (type >= 100 && type <= 108) this.handler('set-color-bg', (type % 10) + 8)\n else if (type === 38 || type === 48) {\n if (numbers[1] === 5) {\n let color = (numbers[2] | 0) & 0xFF\n if (type === 38) this.handler('set-color-fg', color)\n if (type === 48) this.handler('set-color-bg', color)\n }\n }\n } else if (type === 'h' || type === 'l') {\n if (content === '?25') {\n if (type === 'h') this.handler('show-cursor')\n else if (type === 'l') this.handler('hide-cursor')\n }\n }\n }\n }\n write (text) {\n for (let character of text.toString()) {\n let code = character.codePointAt(0)\n if (code === 0x1b) this.currentSequence = 1\n else if (this.currentSequence === 1 && character === '[') {\n this.currentSequence = 2\n this.sequence += '['\n } else if (this.currentSequence && character.match(/[\\x40-\\x7e]/)) {\n this.parseSequence(this.sequence + character)\n this.currentSequence = 0\n this.sequence = ''\n } else if (this.currentSequence > 1) this.sequence += character\n else if (this.currentSequence === 1) {\n // something something nothing\n this.currentSequence = 0\n this.handler('write', character)\n } else if (code < 0x03) this.handler('_null')\n else if (code === 0x03) this.handler('sigint')\n else if (code <= 0x06) this.handler('_null')\n else if (code === 0x07) this.handler('bell')\n else if (code === 0x08) this.handler('back')\n else if (code === 0x0a) this.handler('new-line')\n else if (code === 0x0d) this.handler('return')\n else if (code === 0x15) this.handler('delete-line')\n else if (code === 0x17) this.handler('delete-word')\n else this.handler('write', character)\n }\n if (!this.joinChunks) this.reset()\n }\n}\nconst TERM_DEFAULT_STYLE = 7\nconst TERM_MIN_DRAW_DELAY = 10\n\nlet getRainbowColor = t => {\n let r = Math.floor(Math.sin(t) * 2.5 + 2.5)\n let g = Math.floor(Math.sin(t + 2 / 3 * Math.PI) * 2.5 + 2.5)\n let b = Math.floor(Math.sin(t + 4 / 3 * Math.PI) * 2.5 + 2.5)\n return 16 + 36 * r + 6 * g + b\n}\n\nclass ScrollingTerminal {\n constructor (screen) {\n this.width = 80\n this.height = 25\n this.termScreen = screen\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n\n this.reset()\n\n this._lastLoad = Date.now()\n this.termScreen.load(this.serialize(), 0)\n }\n reset () {\n this.style = TERM_DEFAULT_STYLE\n this.cursor = { x: 0, y: 0, style: 1, visible: true }\n this.trackMouse = false\n this.theme = 0\n this.rainbow = false\n this.parser.reset()\n this.clear()\n }\n clear () {\n this.screen = []\n for (let i = 0; i < this.width * this.height; i++) {\n this.screen.push([' ', this.style])\n }\n }\n scroll () {\n this.screen.splice(0, this.width)\n for (let i = 0; i < this.width; i++) {\n this.screen.push([' ', TERM_DEFAULT_STYLE])\n }\n this.cursor.y--\n }\n newLine () {\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n writeChar (character) {\n this.screen[this.cursor.y * this.width + this.cursor.x] = [character, this.style]\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.newLine()\n }\n }\n moveBack (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x--\n if (this.cursor.x < 0) {\n if (this.cursor.y > 0) this.cursor.x = this.width - 1\n else this.cursor.x = 0\n this.cursor.y = Math.max(0, this.cursor.y - 1)\n }\n }\n }\n moveForward (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n }\n }\n deleteChar () {\n this.moveBack()\n this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, 1)\n }\n deleteForward (n) {\n n = Math.min(this.width, n)\n for (let i = 0; i < n; i++) this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, n)\n }\n clampCursor () {\n if (this.cursor.x < 0) this.cursor.x = 0\n if (this.cursor.y < 0) this.cursor.y = 0\n if (this.cursor.x > this.width - 1) this.cursor.x = this.width - 1\n if (this.cursor.y > this.height - 1) this.cursor.y = this.height - 1\n }\n handleParsed (action, ...args) {\n if (action === 'write') {\n this.writeChar(args[0])\n } else if (action === 'delete') {\n this.deleteForward(args[0])\n } else if (action === 'insert-blanks') {\n this.insertBlanks(args[0])\n } else if (action === 'clear') {\n this.clear()\n } else if (action === 'bell') {\n this.terminal.load('B')\n } else if (action === 'back') {\n this.moveBack()\n } else if (action === 'new-line') {\n this.newLine()\n } else if (action === 'return') {\n this.cursor.x = 0\n } else if (action === 'set-cursor') {\n this.cursor.x = args[1]\n this.cursor.y = args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-y') {\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-x') {\n this.cursor.x += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-line') {\n this.cursor.x = 0\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'set-cursor-x') {\n this.cursor.x = args[0]\n } else if (action === 'set-cursor-style') {\n this.cursor.style = Math.max(0, Math.min(6, args[0]))\n } else if (action === 'reset-style') {\n this.style = TERM_DEFAULT_STYLE\n } else if (action === 'add-attrs') {\n if (args[0] === -1) {\n this.style = (this.style & 0xFF0000) | ((this.style >> 8) & 0xFF) | ((this.style & 0xFF) << 8)\n } else {\n this.style |= (args[0] << 16)\n }\n } else if (action === 'set-color-fg') {\n this.style = (this.style & 0xFFFF00) | args[0]\n } else if (action === 'set-color-bg') {\n this.style = (this.style & 0xFF00FF) | (args[0] << 8)\n } else if (action === 'hide-cursor') {\n this.cursor.visible = false\n } else if (action === 'show-cursor') {\n this.cursor.visible = true\n }\n }\n write (text) {\n this.parser.write(text)\n this.scheduleLoad()\n }\n serialize () {\n let serialized = 'S'\n serialized += encode2B(this.height) + encode2B(this.width)\n serialized += encode2B(this.cursor.y) + encode2B(this.cursor.x)\n\n let attributes = +this.cursor.visible\n attributes |= (3 << 5) * +this.trackMouse // track mouse controls both\n attributes |= 3 << 7 // buttons/links always visible\n attributes |= (this.cursor.style << 9)\n serialized += encode3B(attributes)\n\n let lastStyle = null\n let index = 0\n for (let cell of this.screen) {\n let style = cell[1]\n if (this.rainbow) {\n let x = index % this.width\n let y = Math.floor(index / this.width)\n style = (style & 0xFF0000) | getRainbowColor((x + y) / 10 + Date.now() / 1000)\n index++\n }\n if (style !== lastStyle) {\n let foreground = style & 0xFF\n let background = (style >> 8) & 0xFF\n let attributes = (style >> 16) & 0xFF\n let setForeground = foreground !== (lastStyle & 0xFF)\n let setBackground = background !== ((lastStyle >> 8) & 0xFF)\n let setAttributes = attributes !== ((lastStyle >> 16) & 0xFF)\n\n if (setForeground && setBackground) serialized += '\\x03' + encode3B(style & 0xFFFF)\n else if (setForeground) serialized += '\\x05' + encode2B(foreground)\n else if (setBackground) serialized += '\\x06' + encode2B(background)\n if (setAttributes) serialized += '\\x04' + encode2B(attributes)\n\n lastStyle = style\n }\n serialized += cell[0]\n }\n return serialized\n }\n scheduleLoad () {\n clearTimeout(this._scheduledLoad)\n if (this._lastLoad < Date.now() - TERM_MIN_DRAW_DELAY) {\n this.termScreen.load(this.serialize(), this.theme)\n } else {\n this._scheduledLoad = setTimeout(() => {\n this.termScreen.load(this.serialize())\n }, TERM_MIN_DRAW_DELAY - this._lastLoad)\n }\n }\n rainbowTimer () {\n if (!this.rainbow) return\n clearInterval(this._rainbowTimer)\n this._rainbowTimer = setInterval(() => {\n if (this.rainbow) this.scheduleLoad()\n }, 50)\n }\n}\n\nclass Process {\n constructor (args) {\n // event listeners\n this._listeners = {}\n }\n on (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener })\n }\n once (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener, once: true })\n }\n off (event, listener) {\n let listeners = this._listeners[event]\n if (listeners) {\n for (let i in listeners) {\n if (listeners[i].listener === listener) {\n listeners.splice(i, 1)\n break\n }\n }\n }\n }\n emit (event, ...args) {\n let listeners = this._listeners[event]\n if (listeners) {\n let remove = []\n for (let listener of listeners) {\n try {\n listener.listener(...args)\n if (listener.once) remove.push(listener)\n } catch (err) {\n console.error(err)\n }\n }\n for (let listener of remove) {\n listeners.splice(listeners.indexOf(listener), 1)\n }\n }\n }\n write (data) {\n this.emit('in', data)\n }\n destroy () {\n // death.\n this.emit('exit', 0)\n }\n run () {\n // noop\n }\n}\n\nlet demoData = {\n buttons: {\n 1: '',\n 2: '',\n 3: '',\n 4: '',\n 5: function (terminal, shell) {\n if (shell.child) shell.child.destroy()\n let chars = 'info\\r'\n let loop = function () {\n shell.write(chars[0])\n chars = chars.substr(1)\n if (chars) setTimeout(loop, 100)\n }\n setTimeout(loop, 200)\n }\n },\n mouseReceiver: null\n}\n\nlet demoshIndex = {\n clear: class Clear extends Process {\n run () {\n this.emit('write', '\\x1b[2J\\x1b[1;1H')\n this.destroy()\n }\n },\n screenfetch: class Screenfetch extends Process {\n run () {\n let image = `\n ###. ESPTerm Demo\n '###. Hostname: ${window.location.hostname}\n '###. Shell: ESPTerm Demo Shell\n '###. Resolution: 80x25@${window.devicePixelRatio}x\n :###-\n .###'\n .###'\n .###' ###############\n ###' ###############\n `.split('\\n').filter(line => line.trim())\n\n let chars = ''\n for (let y = 0; y < image.length; y++) {\n for (let x = 0; x < 80; x++) {\n if (image[y][x]) {\n chars += `\\x1b[38;5;${getRainbowColor((x + y) / 10)}m${image[y][x]}`\n } else chars += ' '\n }\n }\n\n this.emit('write', '\\r\\n\\x1b[?25l')\n let loop = () => {\n this.emit('write', chars.substr(0, 80))\n chars = chars.substr(80)\n if (chars.length) setTimeout(loop, 50)\n else {\n this.emit('write', '\\r\\n\\x1b[?25h')\n this.destroy()\n }\n }\n loop()\n }\n },\n 'local-echo': class LocalEcho extends Process {\n run (...args) {\n if (!args.includes('--suppress-note')) {\n this.emit('write', '\\x1b[38;5;239mNote: not all terminal features are supported or and may not work as expected in this demo\\x1b[0m\\r\\n')\n }\n }\n write (data) {\n this.emit('write', data)\n }\n },\n 'info': class Info extends Process {\n run (...args) {\n let fast = args.includes('--fast')\n this.showSplash().then(() => {\n this.printText(fast)\n })\n }\n showSplash () {\n let splash = `\n -#####- -###*..#####- ######-\n -#* -#- .## .##. *#-\n -##### .-###*..#####- *#- -*##*- #*-#--#**#-*##-\n -#* -#-.##. *#- *##@#* ##. -#* *# .#*\n -#####--####- .##. *#- -*#@@- ##. -#* *# .#*\n `.split('\\n').filter(line => line.trim())\n let levels = {\n ' ': -231,\n '.': 4,\n '-': 8,\n '*': 17,\n '#': 24\n }\n for (let i in splash) {\n if (splash[i].length < 79) splash[i] += ' '.repeat(79 - splash[i].length)\n }\n this.emit('write', '\\r\\n'.repeat(splash.length + 1))\n this.emit('write', '\\x1b[A'.repeat(splash.length))\n this.emit('write', '\\x1b[?25l')\n\n let cursorX = 0\n let cursorY = 0\n let moveTo = (x, y) => {\n let moveX = x - cursorX\n let moveY = y - cursorY\n this.emit('write', `\\x1b[${Math.abs(moveX)}${moveX > 0 ? 'C' : 'D'}`)\n this.emit('write', `\\x1b[${Math.abs(moveY)}${moveY > 0 ? 'B' : 'A'}`)\n cursorX = x\n cursorY = y\n }\n let drawCell = (x, y) => {\n moveTo(x, y)\n if (splash[y][x] === '@') {\n this.emit('write', '\\x1b[48;5;8m\\x1b[38;5;255m▄\\b')\n } else {\n this.emit('write', `\\x1b[48;5;${231 + levels[splash[y][x]]}m \\b`)\n }\n }\n return new Promise((resolve, reject) => {\n const self = this\n let x = 14\n let cycles = 0\n let loop = function () {\n for (let y = 0; y < splash.length; y++) {\n let dx = x - y\n if (dx > 0) drawCell(dx, y)\n }\n\n if (++x < 79) {\n if (++cycles >= 3) {\n setTimeout(loop, 20)\n cycles = 0\n } else loop()\n } else {\n moveTo(0, splash.length)\n self.emit('write', '\\x1b[m\\x1b[?25h')\n resolve()\n }\n }\n loop()\n })\n }\n printText (fast = false) {\n // lots of printing\n let parts = [\n '',\n ' ESPTerm is a VT100-like terminal emulator running on the ESP8266 WiFi chip.',\n '',\n ' \\x1b[93mThis is an online demo of the web user interface, simulating a simple ',\n ' terminal in your browser.\\x1b[m',\n '',\n ' Type \\x1b[92mls\\x1b[m to list available commands.',\n ' Use the \\x1b[94mlinks\\x1b[m below this screen for a demo of the options and more info.',\n ''\n ]\n\n if (fast) {\n this.emit('write', parts.join('\\r\\n') + '\\r\\n')\n this.destroy()\n } else {\n const self = this\n let loop = function () {\n self.emit('write', parts.shift() + '\\r\\n')\n if (parts.length) setTimeout(loop, 17)\n else self.destroy()\n }\n loop()\n }\n }\n },\n colors: class PrintColors extends Process {\n run () {\n this.emit('write', '\\r\\n')\n let fgtext = 'foreground-color'\n this.emit('write', ' ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `3${i}` : `9${i - 8}`) + 'm')\n this.emit('write', fgtext[i] + ' ')\n }\n this.emit('write', '\\r\\n ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `4${i}` : `10${i - 8}`) + 'm ')\n }\n this.emit('write', '\\x1b[m\\r\\n')\n for (let r = 0; r < 6; r++) {\n this.emit('write', ' ')\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n this.emit('write', `\\x1b[48;5;${16 + r * 36 + g * 6 + b}m `)\n }\n this.emit('write', '\\x1b[m')\n }\n this.emit('write', '\\r\\n')\n }\n this.emit('write', ' ')\n for (let g = 0; g < 24; g++) {\n this.emit('write', `\\x1b[48;5;${232 + g}m `)\n }\n this.emit('write', '\\x1b[m\\r\\n\\n')\n this.destroy()\n }\n },\n ls: class ListCommands extends Process {\n run () {\n this.emit('write', '\\x1b[92mList of demo commands\\x1b[m\\r\\n')\n for (let i in demoshIndex) {\n if (typeof demoshIndex[i] === 'string') continue\n this.emit('write', i + '\\r\\n')\n }\n this.destroy()\n }\n },\n theme: class SetTheme extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run (...args) {\n let theme = args[0] | 0\n if (!args.length || !Number.isFinite(theme) || theme < 0 || theme > 5) {\n this.emit('write', '\\x1b[31mUsage: theme [0–5]\\r\\n')\n this.destroy()\n return\n }\n this.shell.terminal.theme = theme\n // HACK: reset drawn screen to prevent only partly redrawn screen\n this.shell.terminal.termScreen.drawnScreenFG = []\n this.emit('write', '')\n this.destroy()\n }\n },\n cursor: class SetCursor extends Process {\n run (...args) {\n let steady = args.includes('--steady')\n if (args.includes('block')) {\n this.emit('write', `\\x1b[${0 + 2 * steady} q`)\n } else if (args.includes('line')) {\n this.emit('write', `\\x1b[${3 + steady} q`)\n } else if (args.includes('bar') || args.includes('beam')) {\n this.emit('write', `\\x1b[${5 + steady} q`)\n } else {\n this.emit('write', '\\x1b[31mUsage: cursor [block|line|bar] [--steady]\\r\\n')\n }\n this.destroy()\n }\n },\n rainbow: class ToggleRainbow extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.rainbow = !this.shell.terminal.rainbow\n this.shell.terminal.rainbowTimer()\n this.emit('write', '')\n this.destroy()\n }\n },\n mouse: class ShowMouse extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.trackMouse = true\n demoData.mouseReceiver = this\n this.randomData = []\n this.highlighted = {}\n let characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\n for (let i = 0; i < 23; i++) {\n let line = ''\n for (let j = 0; j < 79; j++) {\n line += characters[Math.floor(characters.length * Math.random())]\n }\n this.randomData.push(line)\n }\n this.scrollOffset = 0\n this.render()\n }\n render () {\n this.emit('write', '\\x1b[m\\x1b[2J\\x1b[1;1H')\n this.emit('write', '\\x1b[97m\\x1b[1mMouse Demo\\r\\n\\x1b[mMouse movement, clicking and scrolling!')\n\n // render random data for scrolling\n for (let y = 0; y < 23; y++) {\n let index = y + this.scrollOffset\n // proper modulo:\n index = ((index % this.randomData.length) + this.randomData.length) % this.randomData.length\n let line = this.randomData[index]\n let lineData = `\\x1b[${3 + y};1H\\x1b[38;5;239m`\n for (let x in line) {\n if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\\x1b[97m'\n lineData += line[x]\n if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\\x1b[38;5;239m'\n }\n this.emit('write', lineData)\n }\n\n // move cursor to mouse\n if (this.mouse) {\n this.emit('write', `\\x1b[${this.mouse.y + 1};${this.mouse.x + 1}H`)\n }\n }\n mouseMove (x, y) {\n this.mouse = { x, y }\n this.render()\n }\n mouseDown (x, y, button) {\n if (button === 4) this.scrollOffset--\n else if (button === 5) this.scrollOffset++\n else this.highlighted[y * 80 + x] = !this.highlighted[y * 80 + x]\n this.render()\n }\n mouseUp (x, y, button) {}\n destroy () {\n this.shell.terminal.write('\\x1b[2J\\x1b[1;1H')\n this.shell.terminal.trackMouse = false\n if (demoData.mouseReceiver === this) demoData.mouseReceiver = null\n super.destroy()\n }\n },\n sudo: class Sudo extends Process {\n run (...args) {\n if (args.length === 0) this.emit('write', '\\x1b[31musage: sudo \\x1b[0m\\n')\n else if (args.length === 4 && args.join(' ').toLowerCase() === 'make me a sandwich') {\n const b = '\\x1b[33m'\n const r = '\\x1b[0m'\n const l = '\\x1b[32m'\n const c = '\\x1b[38;5;229m'\n const h = '\\x1b[38;5;225m'\n this.emit('write',\n ` ${b}_.---._\\r\\n` +\n ` _.-~ ~-._\\r\\n` +\n ` _.-~ ~-._\\r\\n` +\n ` _.-~ ~---._\\r\\n` +\n ` _.-~ ~\\\\\\r\\n` +\n ` .-~ _.;\\r\\n` +\n ` :-._ _.-~ ./\\r\\n` +\n ` \\`-._~-._ _..__.-~ _.-~\\r\\n` +\n ` ${c}/ ${b}~-._~-._ / .__..--${c}~-${l}---._\\r\\n` +\n `${c} \\\\_____(_${b};-._\\\\. _.-~_/${c} ~)${l}.. . \\\\\\r\\n` +\n `${l} /(_____ ${b}\\\\\\`--...--~_.-~${c}______..-+${l}_______)\\r\\n` +\n `${l} .(_________/${b}\\`--...--~/${l} _/ ${h} ${b}/\\\\\\r\\n` +\n `${b} /-._${h} \\\\_ ${l}(___./_..-~${h}__.....${b}__..-~./\\r\\n` +\n `${b} \\`-._~-._${h} ~\\\\--------~ .-~${b}_..__.-~ _.-~\\r\\n` +\n `${b} ~-._~-._ ${h}~---------\\` ${b}/ .__..--~\\r\\n` +\n `${b} ~-._\\\\. _.-~_/\\r\\n` +\n `${b} \\\\\\`--...--~_.-~\\r\\n` +\n `${b} \\`--...--~${r}\\r\\n`)\n } else {\n this.emit('exec', args.join(' '))\n return\n }\n this.destroy()\n }\n },\n make: class Make extends Process {\n run (...args) {\n if (args.length === 0) this.emit('write', '\\x1b[31mmake: *** No targets specified. Stop.\\x1b[0m\\r\\n')\n else if (args.length === 3 && args.join(' ').toLowerCase() === 'me a sandwich') {\n this.emit('write', '\\x1b[31mmake: me a sandwich : Permission denied\\x1b[0m\\r\\n')\n } else {\n this.emit('write', `\\x1b[31mmake: *** No rule to make target '${args.join(' ').toLowerCase()}'. Stop.\\x1b[0m\\r\\n`)\n }\n this.destroy()\n }\n },\n pwd: '/this/is/a/demo\\r\\n',\n cd: '\\x1b[38;5;239mNo directories to change to\\r\\n',\n whoami: `${window.navigator.userAgent}\\r\\n`,\n hostname: `${window.location.hostname}`,\n uname: 'ESPTerm Demo\\r\\n',\n mkdir: '\\x1b[38;5;239mDid not create a directory because this is a demo.\\r\\n',\n rm: '\\x1b[38;5;239mDid not delete anything because this is a demo.\\r\\n',\n cp: '\\x1b[38;5;239mNothing to copy because this is a demo.\\r\\n',\n mv: '\\x1b[38;5;239mNothing to move because this is a demo.\\r\\n',\n ln: '\\x1b[38;5;239mNothing to link because this is a demo.\\r\\n',\n touch: '\\x1b[38;5;239mNothing to touch\\r\\n',\n exit: '\\x1b[38;5;239mNowhere to go\\r\\n',\n github: class GoToGithub extends Process {\n run () {\n window.open('https://github.com/espterm/espterm-firmware')\n this.destroy()\n }\n }\n}\n\nclass DemoShell {\n constructor (terminal, printInfo) {\n this.terminal = terminal\n this.terminal.reset()\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n this.history = []\n this.historyIndex = 0\n this.cursorPos = 0\n this.child = null\n this.index = demoshIndex\n\n if (printInfo) this.run('info')\n else this.prompt()\n }\n write (text) {\n if (this.child) {\n if (text.codePointAt(0) === 3) this.child.destroy()\n else this.child.write(text)\n } else this.parser.write(text)\n }\n prompt (success = true) {\n if (this.terminal.cursor.x !== 0) this.terminal.write('\\x1b[m\\x1b[38;5;238m⏎\\r\\n')\n this.terminal.write('\\x1b[34;1mdemosh \\x1b[m')\n if (!success) this.terminal.write('\\x1b[31m')\n this.terminal.write('$ \\x1b[m')\n this.history.unshift('')\n this.cursorPos = 0\n }\n copyFromHistoryIndex () {\n if (!this.historyIndex) return\n let current = this.history[this.historyIndex]\n this.history[0] = current\n this.historyIndex = 0\n }\n handleParsed (action, ...args) {\n this.terminal.write('\\b\\x1b[P'.repeat(this.cursorPos))\n if (action === 'write') {\n this.copyFromHistoryIndex()\n this.history[0] = this.history[0].substr(0, this.cursorPos) + args[0] + this.history[0].substr(this.cursorPos)\n this.cursorPos++\n } else if (action === 'back') {\n this.copyFromHistoryIndex()\n this.history[0] = this.history[0].substr(0, this.cursorPos - 1) + this.history[0].substr(this.cursorPos)\n this.cursorPos--\n if (this.cursorPos < 0) this.cursorPos = 0\n } else if (action === 'move-cursor-x') {\n this.cursorPos = Math.max(0, Math.min(this.history[0].length, this.cursorPos + args[0]))\n } else if (action === 'delete-line') {\n this.copyFromHistoryIndex()\n this.history[0] = ''\n this.cursorPos = 0\n } else if (action === 'delete-word') {\n this.copyFromHistoryIndex()\n let words = this.history[0].substr(0, this.cursorPos).split(' ')\n words.pop()\n this.history[0] = words.join(' ') + this.history[0].substr(this.cursorPos)\n this.cursorPos = words.join(' ').length\n } else if (action === 'move-cursor-y') {\n this.historyIndex -= args[0]\n if (this.historyIndex < 0) this.historyIndex = 0\n if (this.historyIndex >= this.history.length) this.historyIndex = this.history.length - 1\n this.cursorPos = this.history[this.historyIndex].length\n }\n\n this.terminal.write(this.history[this.historyIndex])\n this.terminal.write('\\b'.repeat(this.history[this.historyIndex].length))\n this.terminal.moveForward(this.cursorPos)\n this.terminal.write('') // dummy. Apply the moveFoward\n\n if (action === 'return') {\n this.terminal.write('\\r\\n')\n this.parse(this.history[this.historyIndex])\n }\n }\n parse (input) {\n if (input === 'help') input = 'info'\n // TODO: basic chaining (i.e. semicolon)\n this.run(input)\n }\n run (command) {\n let parts = ['']\n\n let inQuote = false\n for (let character of command.trim()) {\n if (inQuote && character !== inQuote) {\n parts[parts.length - 1] += character\n } else if (inQuote) {\n inQuote = false\n } else if (character === '\"' || character === \"'\") {\n inQuote = character\n } else if (character.match(/\\s/)) {\n if (parts[parts.length - 1]) parts.push('')\n } else parts[parts.length - 1] += character\n }\n\n let name = parts.shift()\n if (name in this.index) {\n this.spawn(name, parts)\n } else {\n this.terminal.write(`demosh: Unknown command: ${name}\\r\\n`)\n this.prompt(false)\n }\n }\n spawn (name, args = []) {\n let Process = this.index[name]\n if (Process instanceof Function) {\n this.child = new Process(this)\n let write = data => this.terminal.write(data)\n let exec = line => this.run(line)\n this.child.on('write', write)\n this.child.on('exec', exec)\n this.child.on('exit', code => {\n if (this.child) this.child.off('write', write)\n if (this.child) this.child.off('exec', exec)\n this.child = null\n this.prompt(!code)\n })\n this.child.run(...args)\n } else {\n this.terminal.write(Process)\n this.prompt()\n }\n }\n}\n\nwindow.demoInterface = {\n input (data) {\n let type = data[0]\n let content = data.substr(1)\n\n if (type === 's') {\n this.shell.write(content)\n } else if (type === 'b') {\n let button = content.charCodeAt(0)\n let action = demoData.buttons[button]\n if (action) {\n if (typeof action === 'string') this.shell.write(action)\n else if (action instanceof Function) action(this.terminal, this.shell)\n }\n } else if (type === 'm' || type === 'p' || type === 'r') {\n let row = parse2B(content, 0)\n let column = parse2B(content, 2)\n let button = parse2B(content, 4)\n let modifiers = parse2B(content, 6)\n\n if (demoData.mouseReceiver) {\n if (type === 'm') demoData.mouseReceiver.mouseMove(column, row, button, modifiers)\n else if (type === 'p') demoData.mouseReceiver.mouseDown(column, row, button, modifiers)\n else if (type === 'r') demoData.mouseReceiver.mouseUp(column, row, button, modifiers)\n }\n }\n },\n init (screen) {\n this.terminal = new ScrollingTerminal(screen)\n this.shell = new DemoShell(this.terminal, true)\n }\n}\n","// Generated from PHP locale file\nlet _tr = {\n \"wifi.connected_ip_is\": \"Connected, IP is \",\n \"wifi.not_conn\": \"Not connected.\",\n \"wifi.enter_passwd\": \"Enter password for \\\":ssid:\\\"\"\n};\n\nfunction tr (key) { return _tr[key] || '?' + key + '?' }\n","(function (w) {\n const authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']\n let curSSID\n\n // Get XX % for a slider input\n function rangePt (inp) {\n return Math.round(((inp.value / inp.max) * 100)) + '%'\n }\n\n // Display selected STA SSID etc\n function selectSta (name, password, ip) {\n $('#sta_ssid').val(name)\n $('#sta_password').val(password)\n\n $('#sta-nw').toggleClass('hidden', name.length === 0)\n $('#sta-nw-nil').toggleClass('hidden', name.length > 0)\n\n $('#sta-nw .essid').html(esc(name))\n const nopw = undef(password) || password.length === 0\n $('#sta-nw .passwd').toggleClass('hidden', nopw)\n $('#sta-nw .nopasswd').toggleClass('hidden', !nopw)\n $('#sta-nw .ip').html(ip.length > 0 ? tr('wifi.connected_ip_is') + ip : tr('wifi.not_conn'))\n }\n\n /** Update display for received response */\n function onScan (resp, status) {\n // var ap_json = {\n // \"result\": {\n // \"inProgress\": \"0\",\n // \"APs\": [\n // {\"essid\": \"Chlivek\", \"bssid\": \"88:f7:c7:52:b3:99\", \"rssi\": \"204\", \"enc\": \"4\", \"channel\": \"1\"},\n // {\"essid\": \"TyNikdy\", \"bssid\": \"5c:f4:ab:0d:f1:1b\", \"rssi\": \"164\", \"enc\": \"3\", \"channel\": \"1\"},\n // ]\n // }\n // };\n\n if (status !== 200) {\n // bad response\n rescan(5000) // wait 5sm then retry\n return\n }\n\n try {\n resp = JSON.parse(resp)\n } catch (e) {\n console.log(e)\n rescan(5000)\n return\n }\n\n const done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0)\n rescan(done ? 15000 : 1000)\n if (!done) return // no redraw yet\n\n // clear the AP list\n let $list = $('#ap-list')\n // remove old APs\n $('#ap-list .AP').remove()\n\n $list.toggleClass('hidden', !done)\n $('#ap-loader').toggleClass('hidden', done)\n\n // scan done\n resp.result.APs.sort(function (a, b) {\n return b.rssi - a.rssi\n }).forEach(function (ap) {\n ap.enc = parseInt(ap.enc)\n\n if (ap.enc > 4) return // hide unsupported auths\n\n let item = mk('div')\n\n let $item = $(item)\n .data('ssid', ap.essid)\n .data('pwd', ap.enc)\n .attr('tabindex', 0)\n .addClass('AP')\n\n // mark current SSID\n if (ap.essid === curSSID) {\n $item.addClass('selected')\n }\n\n let inner = mk('div')\n let escapedSSID = $.htmlEscape(ap.essid)\n $(inner).addClass('inner')\n .htmlAppend(`
${ap.rssi_perc}
`)\n .htmlAppend(`
${escapedSSID}
`)\n .htmlAppend(`
${authStr[ap.enc]}
`)\n\n $item.on('click', function () {\n let $th = $(this)\n\n const conn_ssid = $th.data('ssid')\n let conn_pass = ''\n\n if (+$th.data('pwd')) {\n // this AP needs a password\n conn_pass = prompt(tr('wifi.enter_passwd').replace(':ssid:', conn_ssid))\n if (!conn_pass) return\n }\n\n $('#sta_password').val(conn_pass)\n $('#sta_ssid').val(conn_ssid)\n selectSta(conn_ssid, conn_pass, '')\n })\n\n item.appendChild(inner)\n $list[0].appendChild(item)\n })\n }\n\n function startScanning () {\n $('#ap-loader').removeClass('hidden')\n $('#ap-scan').addClass('hidden')\n $('#ap-loader .anim-dots').html('.')\n\n scanAPs()\n }\n\n /** Ask the CGI what APs are visible (async) */\n function scanAPs () {\n if (_demo) {\n onScan(_demo_aps, 200)\n } else {\n $.get('http://' + _root + '/cfg/wifi/scan', onScan)\n }\n }\n\n function rescan (time) {\n setTimeout(scanAPs, time)\n }\n\n /** Set up the WiFi page */\n function wifiInit (cfg) {\n // Update slider value displays\n $('.Row.range').forEach(function (x) {\n let inp = x.querySelector('input')\n let disp1 = x.querySelector('.x-disp1')\n let disp2 = x.querySelector('.x-disp2')\n let t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n $(inp).on('input', function () {\n t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n })\n })\n\n // Forget STA credentials\n $('#forget-sta').on('click', () => {\n selectSta('', '', '')\n return false\n })\n\n selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip)\n curSSID = cfg.sta_active_ssid\n }\n\n w.init = wifiInit\n w.startScanning = startScanning\n})(window.WiFi = {})\n","/** Handle connections */\nwindow.Conn = function (screen) {\n let ws\n let heartbeatTout\n let pingIv\n let xoff = false\n let autoXoffTout\n let reconTout\n\n let pageShown = false\n\n function onOpen (evt) {\n console.log('CONNECTED')\n heartbeat()\n doSend('i')\n }\n\n function onClose (evt) {\n console.warn('SOCKET CLOSED, code ' + evt.code + '. Reconnecting...')\n clearTimeout(reconTout)\n reconTout = setTimeout(function () {\n init()\n }, 2000)\n // this happens when the buffer gets fucked up via invalid unicode.\n // we basically use polling instead of socket then\n }\n\n function onMessage (evt) {\n try {\n // . = heartbeat\n switch (evt.data.charAt(0)) {\n case '.':\n // heartbeat, no-op message\n break\n\n case '-':\n // console.log('xoff');\n xoff = true\n autoXoffTout = setTimeout(function () {\n xoff = false\n }, 250)\n break\n\n case '+':\n // console.log('xon');\n xoff = false\n clearTimeout(autoXoffTout)\n break\n\n default:\n screen.load(evt.data)\n if (!pageShown) {\n showPage()\n pageShown = true\n }\n break\n }\n heartbeat()\n } catch (e) {\n console.error(e)\n }\n }\n\n function canSend () {\n return !xoff\n }\n\n function doSend (message) {\n if (_demo) {\n if (typeof demoInterface !== 'undefined') {\n demoInterface.input(message)\n } else {\n console.log(`TX: ${JSON.stringify(message)}`)\n }\n return true // Simulate success\n }\n if (xoff) {\n // TODO queue\n console.log(\"Can't send, flood control.\")\n return false\n }\n\n if (!ws) return false // for dry testing\n if (ws.readyState !== 1) {\n console.error('Socket not ready')\n return false\n }\n if (typeof message != 'string') {\n message = JSON.stringify(message)\n }\n ws.send(message)\n return true\n }\n\n function init () {\n if (window._demo) {\n if (typeof demoInterface === 'undefined') {\n alert('Demoing non-demo demo!') // this will catch mistakes when deploying to the website\n } else {\n demoInterface.init(screen)\n showPage()\n }\n return\n }\n\n clearTimeout(reconTout)\n clearTimeout(heartbeatTout)\n\n ws = new WebSocket('ws://' + _root + '/term/update.ws')\n ws.onopen = onOpen\n ws.onclose = onClose\n ws.onmessage = onMessage\n console.log('Opening socket.')\n heartbeat()\n }\n\n function heartbeat () {\n clearTimeout(heartbeatTout)\n heartbeatTout = setTimeout(heartbeatFail, 2000)\n }\n\n function heartbeatFail () {\n console.error('Heartbeat lost, probing server...')\n pingIv = setInterval(function () {\n console.log('> ping')\n $.get('http://' + _root + '/system/ping', function (resp, status) {\n if (status === 200) {\n clearInterval(pingIv)\n console.info('Server ready, reloading page...')\n location.reload()\n }\n }, {\n timeout: 100\n })\n }, 1000)\n }\n\n return {\n ws: null,\n init,\n send: doSend,\n canSend // check flood control\n }\n}\n","/**\n * User input\n *\n * --- Rx messages: ---\n * S - screen content (binary encoding of the entire screen with simple compression)\n * T - text labels - Title and buttons, \\0x01-separated\n * B - beep\n * . - heartbeat\n *\n * --- Tx messages ---\n * s - string\n * b - action button\n * p - mb press\n * r - mb release\n * m - mouse move\n */\nwindow.Input = function (conn) {\n let cfg = {\n np_alt: false,\n cu_alt: false,\n fn_alt: false,\n mt_click: false,\n mt_move: false,\n no_keys: false,\n crlf_mode: false\n }\n\n /** Send a literal message */\n function sendStrMsg (str) {\n return conn.send('s' + str)\n }\n\n /** Send a button event */\n function sendBtnMsg (n) {\n conn.send('b' + String.fromCharCode(n))\n }\n\n /** Fn alt choice for key message */\n function fa (alt, normal) {\n return cfg.fn_alt ? alt : normal\n }\n\n /** Cursor alt choice for key message */\n function ca (alt, normal) {\n return cfg.cu_alt ? alt : normal\n }\n\n /** Numpad alt choice for key message */\n function na (alt, normal) {\n return cfg.np_alt ? alt : normal\n }\n\n function bindFnKeys (allFn) {\n const keymap = {\n 'tab': '\\x09',\n 'backspace': '\\x08',\n 'enter': cfg.crlf_mode ? '\\x0d\\x0a' : '\\x0d',\n 'ctrl+enter': '\\x0a',\n 'esc': '\\x1b',\n 'up': ca('\\x1bOA', '\\x1b[A'),\n 'down': ca('\\x1bOB', '\\x1b[B'),\n 'right': ca('\\x1bOC', '\\x1b[C'),\n 'left': ca('\\x1bOD', '\\x1b[D'),\n 'home': ca('\\x1bOH', fa('\\x1b[H', '\\x1b[1~')),\n 'insert': '\\x1b[2~',\n 'delete': '\\x1b[3~',\n 'end': ca('\\x1bOF', fa('\\x1b[F', '\\x1b[4~')),\n 'pageup': '\\x1b[5~',\n 'pagedown': '\\x1b[6~',\n 'f1': fa('\\x1bOP', '\\x1b[11~'),\n 'f2': fa('\\x1bOQ', '\\x1b[12~'),\n 'f3': fa('\\x1bOR', '\\x1b[13~'),\n 'f4': fa('\\x1bOS', '\\x1b[14~'),\n 'f5': '\\x1b[15~', // note the disconnect\n 'f6': '\\x1b[17~',\n 'f7': '\\x1b[18~',\n 'f8': '\\x1b[19~',\n 'f9': '\\x1b[20~',\n 'f10': '\\x1b[21~', // note the disconnect\n 'f11': '\\x1b[23~',\n 'f12': '\\x1b[24~',\n 'shift+f1': fa('\\x1bO1;2P', '\\x1b[25~'),\n 'shift+f2': fa('\\x1bO1;2Q', '\\x1b[26~'), // note the disconnect\n 'shift+f3': fa('\\x1bO1;2R', '\\x1b[28~'),\n 'shift+f4': fa('\\x1bO1;2S', '\\x1b[29~'), // note the disconnect\n 'shift+f5': fa('\\x1b[15;2~', '\\x1b[31~'),\n 'shift+f6': fa('\\x1b[17;2~', '\\x1b[32~'),\n 'shift+f7': fa('\\x1b[18;2~', '\\x1b[33~'),\n 'shift+f8': fa('\\x1b[19;2~', '\\x1b[34~'),\n 'shift+f9': fa('\\x1b[20;2~', '\\x1b[35~'), // 35-38 are not standard - but what is?\n 'shift+f10': fa('\\x1b[21;2~', '\\x1b[36~'),\n 'shift+f11': fa('\\x1b[22;2~', '\\x1b[37~'),\n 'shift+f12': fa('\\x1b[23;2~', '\\x1b[38~'),\n 'np_0': na('\\x1bOp', '0'),\n 'np_1': na('\\x1bOq', '1'),\n 'np_2': na('\\x1bOr', '2'),\n 'np_3': na('\\x1bOs', '3'),\n 'np_4': na('\\x1bOt', '4'),\n 'np_5': na('\\x1bOu', '5'),\n 'np_6': na('\\x1bOv', '6'),\n 'np_7': na('\\x1bOw', '7'),\n 'np_8': na('\\x1bOx', '8'),\n 'np_9': na('\\x1bOy', '9'),\n 'np_mul': na('\\x1bOR', '*'),\n 'np_add': na('\\x1bOl', '+'),\n 'np_sub': na('\\x1bOS', '-'),\n 'np_point': na('\\x1bOn', '.'),\n 'np_div': na('\\x1bOQ', '/')\n // we don't implement numlock key (should change in numpad_alt mode,\n // but it's even more useless than the rest and also has the side\n // effect of changing the user's numlock state)\n }\n\n const blacklist = [\n 'f5', 'f11', 'f12', 'shift+f5'\n ]\n\n for (let k in keymap) {\n if (!allFn && blacklist.includes(k)) continue\n if (keymap.hasOwnProperty(k)) {\n bind(k, keymap[k])\n }\n }\n }\n\n /** Bind a keystroke to message */\n function bind (combo, str) {\n // mac fix - allow also cmd\n if (combo.indexOf('ctrl+') !== -1) {\n combo += ',' + combo.replace('ctrl', 'command')\n }\n\n // unbind possible old binding\n key.unbind(combo)\n\n key(combo, function (e) {\n if (cfg.no_keys) return\n e.preventDefault()\n sendStrMsg(str)\n })\n }\n\n /** Bind/rebind key messages */\n function initKeys ({ allFn }) {\n // This takes care of text characters typed\n window.addEventListener('keypress', function (evt) {\n if (cfg.no_keys) return\n let str = ''\n if (evt.key) str = evt.key\n else if (evt.which) str = String.fromCodePoint(evt.which)\n if (str.length > 0 && str.charCodeAt(0) >= 32) {\n // console.log(\"Typed \", str);\n // prevent space from scrolling\n if (evt.which === 32) evt.preventDefault()\n sendStrMsg(str)\n }\n })\n\n // ctrl-letter codes are sent as simple low ASCII codes\n for (let i = 1; i <= 26; i++) {\n bind('ctrl+' + String.fromCharCode(96 + i), String.fromCharCode(i))\n }\n /* eslint-disable */\n bind('ctrl+]', '\\x1b') // alternate way to enter ESC\n bind('ctrl+\\\\', '\\x1c')\n bind('ctrl+[', '\\x1d')\n bind('ctrl+^', '\\x1e')\n bind('ctrl+_', '\\x1f')\n\n // extra ctrl-\n bind('ctrl+left', '\\x1f[1;5D')\n bind('ctrl+right', '\\x1f[1;5C')\n bind('ctrl+up', '\\x1f[1;5A')\n bind('ctrl+down', '\\x1f[1;5B')\n bind('ctrl+home', '\\x1f[1;5H')\n bind('ctrl+end', '\\x1f[1;5F')\n\n // extra shift-\n bind('shift+left', '\\x1f[1;2D')\n bind('shift+right', '\\x1f[1;2C')\n bind('shift+up', '\\x1f[1;2A')\n bind('shift+down', '\\x1f[1;2B')\n bind('shift+home', '\\x1f[1;2H')\n bind('shift+end', '\\x1f[1;2F')\n\n // macOS editing commands\n bind('⌥+left', '\\x1bb') // ⌥← to go back a word (^[b)\n bind('⌥+right', '\\x1bf') // ⌥→ to go forward one word (^[f)\n bind('⌘+left', '\\x01') // ⌘← to go to the beginning of a line (^A)\n bind('⌘+right', '\\x05') // ⌘→ to go to the end of a line (^E)\n bind('⌥+backspace', '\\x17') // ⌥⌫ to delete a word (^W)\n bind('⌘+backspace', '\\x15') // ⌘⌫ to delete to the beginning of a line (^U)\n /* eslint-enable */\n\n bindFnKeys(allFn)\n }\n\n // mouse button states\n let mb1 = 0\n let mb2 = 0\n let mb3 = 0\n\n /** Init the Input module */\n function init (opts) {\n initKeys(opts)\n\n // Button presses\n $('#action-buttons button').forEach(s => {\n s.addEventListener('click', function (evt) {\n sendBtnMsg(+this.dataset['n'])\n })\n })\n\n // global mouse state tracking - for motion reporting\n window.addEventListener('mousedown', evt => {\n if (evt.button === 0) mb1 = 1\n if (evt.button === 1) mb2 = 1\n if (evt.button === 2) mb3 = 1\n })\n\n window.addEventListener('mouseup', evt => {\n if (evt.button === 0) mb1 = 0\n if (evt.button === 1) mb2 = 0\n if (evt.button === 2) mb3 = 0\n })\n }\n\n /** Prepare modifiers byte for mouse message */\n function packModifiersForMouse () {\n return (key.isModifier('ctrl') ? 1 : 0) |\n (key.isModifier('shift') ? 2 : 0) |\n (key.isModifier('alt') ? 4 : 0) |\n (key.isModifier('meta') ? 8 : 0)\n }\n\n return {\n /** Init the Input module */\n init,\n\n /** Send a literal string message */\n sendString: sendStrMsg,\n\n /** Enable alternate key modes (cursors, numpad, fn) */\n setAlts: function (cu, np, fn, crlf) {\n if (cfg.cu_alt !== cu || cfg.np_alt !== np || cfg.fn_alt !== fn || cfg.crlf_mode !== crlf) {\n cfg.cu_alt = cu\n cfg.np_alt = np\n cfg.fn_alt = fn\n cfg.crlf_mode = crlf\n\n // rebind keys - codes have changed\n bindFnKeys()\n }\n },\n\n setMouseMode (click, move) {\n cfg.mt_click = click\n cfg.mt_move = move\n },\n\n // Mouse events\n onMouseMove (x, y) {\n if (!cfg.mt_move) return\n const b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0\n const m = packModifiersForMouse()\n conn.send('m' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n },\n\n onMouseDown (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseUp (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('r' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseWheel (x, y, dir) {\n if (!cfg.mt_click) return\n // -1 ... btn 4 (away from user)\n // +1 ... btn 5 (towards user)\n const m = packModifiersForMouse()\n const b = (dir < 0 ? 4 : 5)\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n /**\n * Prevent capturing keys. This is used for text input\n * modals on the terminal screen\n */\n blockKeys (yes) {\n cfg.no_keys = yes\n }\n }\n}\n","// Some non-bold Fraktur symbols are outside the contiguous block\nconst frakturExceptions = {\n 'C': '\\u212d',\n 'H': '\\u210c',\n 'I': '\\u2111',\n 'R': '\\u211c',\n 'Z': '\\u2128'\n}\n\n// constants for decoding the update blob\nconst SEQ_REPEAT = 2\nconst SEQ_SET_COLORS = 3\nconst SEQ_SET_ATTRS = 4\nconst SEQ_SET_FG = 5\nconst SEQ_SET_BG = 6\n\nconst SELECTION_BG = '#b2d7fe'\nconst SELECTION_FG = '#333'\n\nconst themes = [\n [ // Tango\n '#111213', '#CC0000', '#4E9A06', '#C4A000', '#3465A4', '#75507B', '#06989A', '#D3D7CF',\n '#555753', '#EF2929', '#8AE234', '#FCE94F', '#729FCF', '#AD7FA8', '#34E2E2', '#EEEEEC'\n ],\n [ // Linux\n '#000000', '#aa0000', '#00aa00', '#aa5500', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa',\n '#555555', '#ff5555', '#55ff55', '#ffff55', '#5555ff', '#ff55ff', '#55ffff', '#ffffff'\n ],\n [ // xterm\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5',\n '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // rxvt\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000cd', '#cd00cd', '#00cdcd', '#faebd7',\n '#404040', '#ff0000', '#00ff00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // Ambience\n '#2e3436', '#cc0000', '#4e9a06', '#c4a000', '#3465a4', '#75507b', '#06989a', '#d3d7cf',\n '#555753', '#ef2929', '#8ae234', '#fce94f', '#729fcf', '#ad7fa8', '#34e2e2', '#eeeeec'\n ],\n [ // Solarized\n '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5',\n '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3'\n ]\n]\n\n// TODO move this to the initializer so it's not run on non-terminal pages\n\n// 256color lookup table\n// should not be used to look up 0-15 (will return transparent)\nconst colorTable256 = new Array(16).fill('rgba(0, 0, 0, 0)')\n\n// fill color table\n// colors 16-231 are a 6x6x6 color cube\nfor (let red = 0; red < 6; red++) {\n for (let green = 0; green < 6; green++) {\n for (let blue = 0; blue < 6; blue++) {\n let redValue = red * 40 + (red ? 55 : 0)\n let greenValue = green * 40 + (green ? 55 : 0)\n let blueValue = blue * 40 + (blue ? 55 : 0)\n colorTable256.push(`rgb(${redValue}, ${greenValue}, ${blueValue})`)\n }\n }\n}\n// colors 232-255 are a grayscale ramp, sans black and white\nfor (let gray = 0; gray < 24; gray++) {\n let value = gray * 10 + 8\n colorTable256.push(`rgb(${value}, ${value}, ${value})`)\n}\n\nwindow.TermScreen = class TermScreen {\n constructor () {\n this.canvas = mk('canvas')\n this.ctx = this.canvas.getContext('2d')\n\n if ('AudioContext' in window || 'webkitAudioContext' in window) {\n this.audioCtx = new (window.AudioContext || window.webkitAudioContext)()\n } else {\n console.warn('No AudioContext!')\n }\n\n // dummy\n this.input = new Proxy({}, {\n get () {\n return () => console.warn('TermScreen#input not set!')\n }\n })\n\n this.cursor = {\n x: 0,\n y: 0,\n blinkOn: false,\n blinking: true,\n visible: true,\n hanging: false,\n style: 'block',\n blinkInterval: null\n }\n\n this._palette = null\n\n this._window = {\n width: 0,\n height: 0,\n devicePixelRatio: 1,\n fontFamily: '\"DejaVu Sans Mono\", \"Liberation Mono\", \"Inconsolata\", \"Menlo\", monospace',\n fontSize: 20,\n gridScaleX: 1.0,\n gridScaleY: 1.2,\n blinkStyleOn: true,\n blinkInterval: null,\n fitIntoWidth: 0,\n fitIntoHeight: 0,\n debug: false,\n graphics: 0\n }\n\n // scaling caused by fitIntoWidth/fitIntoHeight\n this._windowScale = 1\n\n // properties of this.window that require updating size and redrawing\n this.windowState = {\n width: 0,\n height: 0,\n devicePixelRatio: 0,\n gridScaleX: 0,\n gridScaleY: 0,\n fontFamily: '',\n fontSize: 0,\n fitIntoWidth: 0,\n fitIntoHeight: 0\n }\n\n // current selection\n this.selection = {\n // when false, this will prevent selection in favor of mouse events,\n // though alt can be held to override it\n selectable: true,\n\n // selection start and end (x, y) tuples\n start: [0, 0],\n end: [0, 0]\n }\n\n // mouse features\n this.mouseMode = { clicks: false, movement: false }\n\n // event listeners\n this._listeners = {}\n\n // make writing to window update size and draw\n const self = this\n this.window = new Proxy(this._window, {\n set (target, key, value, receiver) {\n target[key] = value\n self.scheduleSizeUpdate()\n self.scheduleDraw(`window:${key}=${value}`)\n return true\n }\n })\n\n this.bracketedPaste = false\n this.blinkingCellCount = 0\n\n this.screen = []\n this.screenFG = []\n this.screenBG = []\n this.screenAttrs = []\n\n // used to determine if a cell should be redrawn; storing the current state\n // as it is on screen\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n this.drawnCursor = [-1, -1, '']\n\n // start blink timers\n this.resetBlink()\n this.resetCursorBlink()\n\n let selecting = false\n\n let selectStart = (x, y) => {\n if (selecting) return\n selecting = true\n this.selection.start = this.selection.end = this.screenToGrid(x, y, true)\n this.scheduleDraw('select-start')\n }\n\n let selectMove = (x, y) => {\n if (!selecting) return\n this.selection.end = this.screenToGrid(x, y, true)\n this.scheduleDraw('select-move')\n }\n\n let selectEnd = (x, y) => {\n if (!selecting) return\n selecting = false\n this.selection.end = this.screenToGrid(x, y, true)\n this.scheduleDraw('select-end')\n Object.assign(this.selection, this.getNormalizedSelection())\n }\n\n // bind event listeners\n\n this.canvas.addEventListener('mousedown', e => {\n if ((this.selection.selectable || e.altKey) && e.button === 0) {\n selectStart(e.offsetX, e.offsetY)\n } else {\n this.input.onMouseDown(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n window.addEventListener('mousemove', e => {\n selectMove(e.offsetX, e.offsetY)\n })\n\n window.addEventListener('mouseup', e => {\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // touch event listeners\n\n let touchPosition = null\n let touchDownTime = 0\n let touchSelectMinTime = 500\n let touchDidMove = false\n\n let getTouchPositionOffset = touch => {\n let rect = this.canvas.getBoundingClientRect()\n return [touch.clientX - rect.left, touch.clientY - rect.top]\n }\n\n this.canvas.addEventListener('touchstart', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n touchDidMove = false\n touchDownTime = Date.now()\n })\n\n this.canvas.addEventListener('touchmove', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n\n if (!selecting && touchDidMove === false) {\n if (touchDownTime < Date.now() - touchSelectMinTime) {\n selectStart(...touchPosition)\n }\n } else if (selecting) {\n e.preventDefault()\n selectMove(...touchPosition)\n }\n\n touchDidMove = true\n })\n\n this.canvas.addEventListener('touchend', e => {\n if (e.touches[0]) {\n touchPosition = getTouchPositionOffset(e.touches[0])\n }\n\n if (selecting) {\n e.preventDefault()\n selectEnd(...touchPosition)\n\n // selection ended; show touch select menu\n let touchSelectMenu = qs('#touch-select-menu')\n touchSelectMenu.classList.add('open')\n let rect = touchSelectMenu.getBoundingClientRect()\n\n // use middle position for x and one line above for y\n let selectionPos = this.gridToScreen(\n (this.selection.start[0] + this.selection.end[0]) / 2,\n this.selection.start[1] - 1\n )\n selectionPos[0] -= rect.width / 2\n selectionPos[1] -= rect.height / 2\n touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${\n selectionPos[1]}px)`\n }\n\n if (!touchDidMove) {\n this.emit('tap', Object.assign(e, {\n x: touchPosition[0],\n y: touchPosition[1]\n }))\n }\n\n touchPosition = null\n })\n\n this.on('tap', e => {\n if (this.selection.start[0] !== this.selection.end[0] ||\n this.selection.start[1] !== this.selection.end[1]) {\n // selection is not empty\n // reset selection\n this.selection.start = this.selection.end = [0, 0]\n qs('#touch-select-menu').classList.remove('open')\n this.scheduleDraw('select-reset')\n } else {\n e.preventDefault()\n this.emit('open-soft-keyboard')\n }\n })\n\n $.ready(() => {\n let copyButton = qs('#touch-select-copy-btn')\n if (copyButton) {\n copyButton.addEventListener('click', () => {\n this.copySelectionToClipboard()\n })\n }\n })\n\n this.canvas.addEventListener('mousemove', e => {\n if (!selecting) {\n this.input.onMouseMove(...this.screenToGrid(e.offsetX, e.offsetY))\n }\n })\n\n this.canvas.addEventListener('mouseup', e => {\n if (!selecting) {\n this.input.onMouseUp(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n this.canvas.addEventListener('wheel', e => {\n if (this.mouseMode.clicks) {\n this.input.onMouseWheel(...this.screenToGrid(e.offsetX, e.offsetY),\n e.deltaY > 0 ? 1 : -1)\n\n // prevent page scrolling\n e.preventDefault()\n }\n })\n\n this.canvas.addEventListener('contextmenu', e => {\n if (this.mouseMode.clicks) {\n // prevent mouse keys getting stuck\n e.preventDefault()\n }\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // bind ctrl+shift+c to copy\n key('⌃+⇧+c', e => {\n e.preventDefault()\n this.copySelectionToClipboard()\n })\n }\n\n /**\n * Bind an event listener to an event\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n on (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener })\n }\n\n /**\n * Bind an event listener to be run only once the next time the event fires\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n once (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener, once: true })\n }\n\n /**\n * Remove an event listener\n * @param {string} event - the event name\n * @param {Function} listener - the event listener\n */\n off (event, listener) {\n let listeners = this._listeners[event]\n if (listeners) {\n for (let i in listeners) {\n if (listeners[i].listener === listener) {\n listeners.splice(i, 1)\n break\n }\n }\n }\n }\n\n /**\n * Emits an event\n * @param {string} event - the event name\n * @param {...any} args - arguments passed to all listeners\n */\n emit (event, ...args) {\n let listeners = this._listeners[event]\n if (listeners) {\n let remove = []\n for (let listener of listeners) {\n try {\n listener.listener(...args)\n if (listener.once) remove.push(listener)\n } catch (err) {\n console.error(err)\n }\n }\n\n // this needs to be done in this roundabout way because for loops\n // do not like arrays with changing lengths\n for (let listener of remove) {\n listeners.splice(listeners.indexOf(listener), 1)\n }\n }\n }\n\n /**\n * The color palette. Should define 16 colors in an array.\n * @type {number[]}\n */\n get palette () {\n return this._palette || themes[0]\n }\n /** @type {number[]} */\n set palette (palette) {\n if (this._palette !== palette) {\n this._palette = palette\n this.scheduleDraw('palette')\n }\n }\n\n /**\n * Returns the specified color. If `i` is in the palette, it will return the\n * palette color. If `i` is between 16 and 255, it will return the 256color\n * value. If `i` is larger than 255, it will return an RGB color value. If `i`\n * is -1 (foreground) or -2 (background), it will return the selection colors.\n * @param {number} i - the color\n * @returns {string} the CSS color\n */\n getColor (i) {\n // return palette color if it exists\n if (this.palette[i]) return this.palette[i]\n\n // -1 for selection foreground, -2 for selection background\n if (i === -1) return SELECTION_FG\n if (i === -2) return SELECTION_BG\n\n // 256 color\n if (i > 15 && i < 256) return colorTable256[i]\n\n // true color, encoded as (hex) + 256 (such that #000 == 256)\n if (i > 255) {\n i -= 256\n let red = (i >> 16) & 0xFF\n let green = (i >> 8) & 0xFF\n let blue = i & 0xFF\n return `rgb(${red}, ${green}, ${blue})`\n }\n\n // default to transparent\n return 'rgba(0, 0, 0, 0)'\n }\n\n /**\n * Schedule a size update in the next millisecond\n */\n scheduleSizeUpdate () {\n clearTimeout(this._scheduledSizeUpdate)\n this._scheduledSizeUpdate = setTimeout(() => this.updateSize(), 1)\n }\n\n /**\n * Schedule a draw in the next millisecond\n * @param {string} why - the reason why the draw occured (for debugging)\n * @param {number} [aggregateTime] - time to wait for more scheduleDraw calls\n * to occur. 1 ms by default.\n */\n scheduleDraw (why, aggregateTime = 1) {\n clearTimeout(this._scheduledDraw)\n this._scheduledDraw = setTimeout(() => this.draw(why), aggregateTime)\n }\n\n /**\n * Returns a CSS font string with this TermScreen's font settings and the\n * font modifiers.\n * @param {Object} modifiers\n * @param {string} [modifiers.style] - the font style\n * @param {string} [modifiers.weight] - the font weight\n * @returns {string} a CSS font string\n */\n getFont (modifiers = {}) {\n let fontStyle = modifiers.style || 'normal'\n let fontWeight = modifiers.weight || 'normal'\n return `${fontStyle} normal ${fontWeight} ${this.window.fontSize}px ${this.window.fontFamily}`\n }\n\n /**\n * The character size, used for calculating the cell size. The space character\n * is used for measuring.\n * @returns {Object} the character size with `width` and `height` in pixels\n */\n getCharSize () {\n this.ctx.font = this.getFont()\n\n return {\n width: Math.floor(this.ctx.measureText(' ').width),\n height: this.window.fontSize\n }\n }\n\n /**\n * The cell size, which is the character size multiplied by the grid scale.\n * @returns {Object} the cell size with `width` and `height` in pixels\n */\n getCellSize () {\n let charSize = this.getCharSize()\n\n return {\n width: Math.ceil(charSize.width * this.window.gridScaleX),\n height: Math.ceil(charSize.height * this.window.gridScaleY)\n }\n }\n\n /**\n * Updates the canvas size if it changed\n */\n updateSize () {\n // see below (this is just updating it)\n this._window.devicePixelRatio = Math.round(this._windowScale * (window.devicePixelRatio || 1) * 2) / 2\n\n let didChange = false\n for (let key in this.windowState) {\n if (this.windowState.hasOwnProperty(key) && this.windowState[key] !== this.window[key]) {\n didChange = true\n this.windowState[key] = this.window[key]\n }\n }\n\n if (didChange) {\n const {\n width,\n height,\n gridScaleX,\n gridScaleY,\n fitIntoWidth,\n fitIntoHeight\n } = this.window\n const cellSize = this.getCellSize()\n\n // real height of the canvas element in pixels\n let realWidth = width * cellSize.width\n let realHeight = height * cellSize.height\n\n if (fitIntoWidth && fitIntoHeight) {\n let terminalAspect = realWidth / realHeight\n let fitAspect = fitIntoWidth / fitIntoHeight\n\n if (terminalAspect < fitAspect) {\n // align heights\n realHeight = fitIntoHeight\n realWidth = realHeight * terminalAspect\n } else {\n // align widths\n realWidth = fitIntoWidth\n realHeight = realWidth / terminalAspect\n }\n } else if (fitIntoWidth) {\n realHeight = fitIntoWidth / (realWidth / realHeight)\n realWidth = fitIntoWidth\n } else if (fitIntoHeight) {\n realWidth = fitIntoHeight * (realWidth / realHeight)\n realHeight = fitIntoHeight\n }\n\n // store new window scale\n this._windowScale = realWidth / (width * cellSize.width)\n\n // the DPR must be rounded to a very nice value to prevent gaps between cells\n let devicePixelRatio = this._window.devicePixelRatio = Math.round(this._windowScale * (window.devicePixelRatio || 1) * 2) / 2\n\n this.canvas.width = width * devicePixelRatio * cellSize.width\n this.canvas.style.width = `${realWidth}px`\n this.canvas.height = height * devicePixelRatio * cellSize.height\n this.canvas.style.height = `${realHeight}px`\n\n // the screen has been cleared (by changing canvas width)\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n\n // draw immediately; the canvas shouldn't flash\n this.draw('init')\n }\n }\n\n /**\n * Resets the cursor blink to on and restarts the timer\n */\n resetCursorBlink () {\n this.cursor.blinkOn = true\n clearInterval(this.cursor.blinkInterval)\n this.cursor.blinkInterval = setInterval(() => {\n this.cursor.blinkOn = this.cursor.blinking\n ? !this.cursor.blinkOn\n : true\n if (this.cursor.blinking) this.scheduleDraw('cursor-blink')\n }, 500)\n }\n\n /**\n * Resets the blink style to on and restarts the timer\n */\n resetBlink () {\n this.window.blinkStyleOn = true\n clearInterval(this.window.blinkInterval)\n let intervals = 0\n this.window.blinkInterval = setInterval(() => {\n if (this.blinkingCellCount <= 0) return\n\n intervals++\n if (intervals >= 4 && this.window.blinkStyleOn) {\n this.window.blinkStyleOn = false\n intervals = 0\n } else if (intervals >= 1 && !this.window.blinkStyleOn) {\n this.window.blinkStyleOn = true\n intervals = 0\n }\n }, 200)\n }\n\n /**\n * Returns a normalized version of the current selection, such that `start`\n * is always before `end`.\n * @returns {Object} the normalized selection, with `start` and `end`\n */\n getNormalizedSelection () {\n let { start, end } = this.selection\n // if the start line is after the end line, or if they're both on the same\n // line but the start column comes after the end column, swap\n if (start[1] > end[1] || (start[1] === end[1] && start[0] > end[0])) {\n [start, end] = [end, start]\n }\n return { start, end }\n }\n\n /**\n * Returns whether or not a given cell is in the current selection.\n * @param {number} col - the column (x)\n * @param {number} line - the line (y)\n * @returns {boolean}\n */\n isInSelection (col, line) {\n let { start, end } = this.getNormalizedSelection()\n let colAfterStart = start[0] <= col\n let colBeforeEnd = col < end[0]\n let onStartLine = line === start[1]\n let onEndLine = line === end[1]\n\n if (onStartLine && onEndLine) return colAfterStart && colBeforeEnd\n else if (onStartLine) return colAfterStart\n else if (onEndLine) return colBeforeEnd\n else return start[1] < line && line < end[1]\n }\n\n /**\n * Sweeps for selected cells and joins them in a multiline string.\n * @returns {string} the selection\n */\n getSelectedText () {\n const screenLength = this.window.width * this.window.height\n let lines = []\n let previousLineIndex = -1\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % this.window.width\n let y = Math.floor(cell / this.window.width)\n\n if (this.isInSelection(x, y)) {\n if (previousLineIndex !== y) {\n previousLineIndex = y\n lines.push('')\n }\n lines[lines.length - 1] += this.screen[cell]\n }\n }\n\n return lines.join('\\n')\n }\n\n /**\n * Copies the selection to clipboard and creates a notification balloon.\n */\n copySelectionToClipboard () {\n let selectedText = this.getSelectedText()\n // don't copy anything if nothing is selected\n if (!selectedText) return\n let textarea = mk('textarea')\n document.body.appendChild(textarea)\n textarea.value = selectedText\n textarea.select()\n if (document.execCommand('copy')) {\n Notify.show('Copied to clipboard')\n } else {\n Notify.show('Failed to copy')\n }\n document.body.removeChild(textarea)\n }\n\n /**\n * Converts screen coordinates to grid coordinates.\n * @param {number} x - x in pixels\n * @param {number} y - y in pixels\n * @param {boolean} rounded - whether to round the coord, used for select highlighting\n * @returns {number[]} a tuple of (x, y) in cells\n */\n screenToGrid (x, y, rounded = false) {\n let cellSize = this.getCellSize()\n\n return [\n Math.floor((x + (rounded ? cellSize.width / 2 : 0)) / cellSize.width),\n Math.floor(y / cellSize.height)\n ]\n }\n\n /**\n * Converts grid coordinates to screen coordinates.\n * @param {number} x - x in cells\n * @param {number} y - y in cells\n * @param {boolean} [withScale] - when true, will apply window scale\n * @returns {number[]} a tuple of (x, y) in pixels\n */\n gridToScreen (x, y, withScale = false) {\n let cellSize = this.getCellSize()\n\n return [x * cellSize.width, y * cellSize.height].map(v => withScale ? v * this._windowScale : v)\n }\n\n /**\n * Draws a cell's background with the given parameters.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {number} options.bg - the background color\n */\n drawCellBackground ({ x, y, cellWidth, cellHeight, bg }) {\n const ctx = this.ctx\n ctx.fillStyle = this.getColor(bg)\n ctx.clearRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n\n /**\n * Draws a cell's character with the given parameters. Won't do anything if\n * text is an empty string.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {Object} options.charSize - the character size, an object with\n * `width` and `height` in pixels\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {string} options.text - the cell content\n * @param {number} options.fg - the foreground color\n * @param {number} options.attrs - the cell's attributes\n */\n drawCell ({ x, y, charSize, cellWidth, cellHeight, text, fg, attrs }) {\n if (!text) return\n\n const ctx = this.ctx\n\n let underline = false\n let strike = false\n let overline = false\n if (attrs & (1 << 1)) ctx.globalAlpha = 0.5\n if (attrs & (1 << 3)) underline = true\n if (attrs & (1 << 5)) text = TermScreen.alphaToFraktur(text)\n if (attrs & (1 << 6)) strike = true\n if (attrs & (1 << 7)) overline = true\n\n ctx.fillStyle = this.getColor(fg)\n ctx.fillText(text, (x + 0.5) * cellWidth, (y + 0.5) * cellHeight)\n\n if (underline || strike || overline) {\n ctx.strokeStyle = this.getColor(fg)\n ctx.lineWidth = 1\n ctx.lineCap = 'round'\n ctx.beginPath()\n\n if (underline) {\n let lineY = Math.round(y * cellHeight + charSize.height) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (strike) {\n let lineY = Math.round((y + 0.5) * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (overline) {\n let lineY = Math.round(y * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n ctx.stroke()\n }\n\n ctx.globalAlpha = 1\n }\n\n /**\n * Returns all adjacent cell indices given a radius.\n * @param {number} cell - the center cell index\n * @param {number} [radius] - the radius. 1 by default\n * @returns {number[]} an array of cell indices\n */\n getAdjacentCells (cell, radius = 1) {\n const { width, height } = this.window\n const screenLength = width * height\n\n let cells = []\n\n for (let x = -radius; x <= radius; x++) {\n for (let y = -radius; y <= radius; y++) {\n if (x === 0 && y === 0) continue\n cells.push(cell + x + y * width)\n }\n }\n\n return cells.filter(cell => cell >= 0 && cell < screenLength)\n }\n\n /**\n * Updates the screen.\n * @param {string} why - the draw reason (for debugging)\n */\n draw (why) {\n const ctx = this.ctx\n const {\n width,\n height,\n devicePixelRatio,\n gridScaleX,\n gridScaleY\n } = this.window\n\n const charSize = this.getCharSize()\n const { width: cellWidth, height: cellHeight } = this.getCellSize()\n const screenWidth = width * cellWidth\n const screenHeight = height * cellHeight\n const screenLength = width * height\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n\n if (this.window.debug && this._debug) this._debug.drawStart(why)\n\n ctx.font = this.getFont()\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n\n // bits in the attr value that affect the font\n const FONT_MASK = 0b101\n\n // Map of (attrs & FONT_MASK) -> Array of cell indices\n let fontGroups = new Map()\n\n // Map of (cell index) -> boolean, whether or not a cell has updated\n let updateMap = new Map()\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % width\n let y = Math.floor(cell / width)\n let isCursor = !this.cursor.hanging &&\n this.cursor.x === x &&\n this.cursor.y === y &&\n this.cursor.blinkOn &&\n this.cursor.visible\n\n let wasCursor = x === this.drawnCursor[0] && y === this.drawnCursor[1]\n\n let inSelection = this.isInSelection(x, y)\n\n let text = this.screen[cell]\n let fg = this.screenFG[cell]\n let bg = this.screenBG[cell]\n let attrs = this.screenAttrs[cell]\n\n if (attrs & (1 << 4) && !this.window.blinkStyleOn) {\n // blinking is enabled and blink style is off\n // set text to nothing so drawCell doesn't draw anything\n text = ''\n }\n\n if (inSelection) {\n fg = -1\n bg = -2\n }\n\n let didUpdate = text !== this.drawnScreen[cell] ||\n fg !== this.drawnScreenFG[cell] ||\n bg !== this.drawnScreenBG[cell] ||\n attrs !== this.drawnScreenAttrs[cell] ||\n isCursor !== wasCursor ||\n (isCursor && this.cursor.style !== this.drawnCursor[2])\n\n let font = attrs & FONT_MASK\n if (!fontGroups.has(font)) fontGroups.set(font, [])\n\n fontGroups.get(font).push([cell, x, y, text, fg, bg, attrs, isCursor, inSelection])\n updateMap.set(cell, didUpdate)\n }\n\n // Map of (cell index) -> boolean, whether or not a cell should be redrawn\n const redrawMap = new Map()\n\n let isTextWide = text =>\n text !== ' ' && ctx.measureText(text).width >= (cellWidth + 0.05)\n\n // decide for each cell if it should be redrawn\n let updateRedrawMapAt = cell => {\n let shouldUpdate = updateMap.get(cell) || redrawMap.get(cell)\n\n // TODO: fonts (necessary?)\n let text = this.screen[cell]\n let isWideCell = isTextWide(text)\n let checkRadius = isWideCell ? 2 : 1\n\n if (!shouldUpdate) {\n // check adjacent cells\n let adjacentDidUpdate = false\n\n for (let adjacentCell of this.getAdjacentCells(cell, checkRadius)) {\n if (updateMap.get(adjacentCell)) {\n adjacentDidUpdate = true\n break\n }\n }\n\n if (adjacentDidUpdate) shouldUpdate = true\n }\n\n redrawMap.set(cell, shouldUpdate)\n }\n\n for (let cell of updateMap.keys()) updateRedrawMapAt(cell)\n\n // mask to redrawing regions only\n if (this.window.graphics >= 1) {\n ctx.save()\n ctx.beginPath()\n for (let y = 0; y < height; y++) {\n let regionStart = null\n for (let x = 0; x < width; x++) {\n let cell = y * width + x\n let redrawing = redrawMap.get(cell)\n if (redrawing && regionStart === null) regionStart = x\n if (!redrawing && regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (x - regionStart) * cellWidth, cellHeight)\n regionStart = null\n }\n }\n if (regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (width - regionStart) * cellWidth, cellHeight)\n }\n }\n ctx.clip()\n }\n\n // pass 1: backgrounds\n for (let font of fontGroups.keys()) {\n for (let data of fontGroups.get(font)) {\n let [cell, x, y, text, fg, bg, attrs, isCursor] = data\n\n if (redrawMap.get(cell)) {\n this.drawCellBackground({ x, y, cellWidth, cellHeight, bg })\n }\n }\n }\n\n // pass 2: characters\n for (let font of fontGroups.keys()) {\n // set font once because in Firefox, this is a really slow action for some\n // reason\n let modifiers = {}\n if (font & 1) modifiers.weight = 'bold'\n if (font & 1 << 2) modifiers.style = 'italic'\n ctx.font = this.getFont(modifiers)\n\n for (let data of fontGroups.get(font)) {\n let [cell, x, y, text, fg, bg, attrs, isCursor, inSelection] = data\n\n if (redrawMap.get(cell)) {\n this.drawCell({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n\n this.drawnScreen[cell] = text\n this.drawnScreenFG[cell] = fg\n this.drawnScreenBG[cell] = bg\n this.drawnScreenAttrs[cell] = attrs\n\n if (isCursor) this.drawnCursor = [x, y, this.cursor.style]\n\n if (this.window.debug && this._debug) {\n // set cell flags\n let flags = 1 // always redrawn\n flags |= (+updateMap.get(cell)) << 1\n flags |= (+isTextWide(text)) << 2\n this._debug.setCell(cell, flags)\n }\n }\n\n if (isCursor && !inSelection) {\n ctx.save()\n ctx.beginPath()\n if (this.cursor.style === 'block') {\n // block\n ctx.rect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n } else if (this.cursor.style === 'bar') {\n // vertical bar\n let barWidth = 2\n ctx.rect(x * cellWidth, y * cellHeight, barWidth, cellHeight)\n } else if (this.cursor.style === 'line') {\n // underline\n let lineHeight = 2\n ctx.rect(x * cellWidth, y * cellHeight + charSize.height, cellWidth, lineHeight)\n }\n ctx.clip()\n\n // swap foreground/background\n ;[fg, bg] = [bg, fg]\n\n // HACK: ensure cursor is visible\n if (fg === bg) bg = fg === 0 ? 7 : 0\n\n this.drawCellBackground({ x, y, cellWidth, cellHeight, bg })\n this.drawCell({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n ctx.restore()\n }\n }\n }\n\n if (this.window.graphics >= 1) ctx.restore()\n\n if (this.window.debug && this._debug) this._debug.drawEnd()\n }\n\n /**\n * Parses the content of an `S` message and schedules a draw\n * @param {string} str - the message content\n */\n loadContent (str) {\n // current index\n let i = 0\n // Uncomment to capture screen content for the demo page\n // console.log(JSON.stringify(`S${str}`))\n\n // window size\n const newHeight = parse2B(str, i)\n const newWidth = parse2B(str, i + 2)\n const resized = (this.window.height !== newHeight) || (this.window.width !== newWidth)\n this.window.height = newHeight\n this.window.width = newWidth\n i += 4\n\n // cursor position\n let [cursorY, cursorX] = [parse2B(str, i), parse2B(str, i + 2)]\n i += 4\n let cursorMoved = (cursorX !== this.cursor.x || cursorY !== this.cursor.y)\n this.cursor.x = cursorX\n this.cursor.y = cursorY\n\n if (cursorMoved) {\n this.resetCursorBlink()\n this.emit('cursor-moved')\n }\n\n // attributes\n let attributes = parse3B(str, i)\n i += 3\n\n this.cursor.visible = !!(attributes & 1)\n this.cursor.hanging = !!(attributes & (1 << 1))\n\n this.input.setAlts(\n !!(attributes & (1 << 2)), // cursors alt\n !!(attributes & (1 << 3)), // numpad alt\n !!(attributes & (1 << 4)), // fn keys alt\n !!(attributes & (1 << 12)) // crlf mode\n )\n\n let trackMouseClicks = !!(attributes & (1 << 5))\n let trackMouseMovement = !!(attributes & (1 << 6))\n\n // 0 - Block blink 2 - Block steady (1 is unused)\n // 3 - Underline blink 4 - Underline steady\n // 5 - I-bar blink 6 - I-bar steady\n let cursorShape = (attributes >> 9) & 0x07\n\n // if it's not zero, decrement such that the two most significant bits\n // are the type and the least significant bit is the blink state\n if (cursorShape > 0) cursorShape--\n\n let cursorStyle = cursorShape >> 1\n let cursorBlinking = !(cursorShape & 1)\n\n if (cursorStyle === 0) this.cursor.style = 'block'\n else if (cursorStyle === 1) this.cursor.style = 'line'\n else if (cursorStyle === 2) this.cursor.style = 'bar'\n\n if (this.cursor.blinking !== cursorBlinking) {\n this.cursor.blinking = cursorBlinking\n this.resetCursorBlink()\n }\n\n this.input.setMouseMode(trackMouseClicks, trackMouseMovement)\n this.selection.selectable = !trackMouseClicks && !trackMouseMovement\n $(this.canvas).toggleClass('selectable', this.selection.selectable)\n this.mouseMode = {\n clicks: trackMouseClicks,\n movement: trackMouseMovement\n }\n\n let showButtons = !!(attributes & (1 << 7))\n let showConfigLinks = !!(attributes & (1 << 8))\n\n $('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks)\n $('#action-buttons').toggleClass('hidden', !showButtons)\n\n this.bracketedPaste = !!(attributes & (1 << 13))\n\n // content\n let fg = 7\n let bg = 0\n let attrs = 0\n let cell = 0 // cell index\n let lastChar = ' '\n let screenLength = this.window.width * this.window.height\n\n if (resized) {\n this.updateSize()\n this.blinkingCellCount = 0\n this.screen = new Array(screenLength).fill(' ')\n this.screenFG = new Array(screenLength).fill(' ')\n this.screenBG = new Array(screenLength).fill(' ')\n this.screenAttrs = new Array(screenLength).fill(' ')\n }\n\n let strArray = !undef(Array.from) ? Array.from(str) : str.split('')\n\n const MASK_LINE_ATTR = 0xC8\n const MASK_BLINK = 1 << 4\n\n let setCellContent = () => {\n // Remove blink attribute if it wouldn't have any effect\n let myAttrs = attrs\n if ((myAttrs & MASK_BLINK) !== 0 &&\n ((lastChar === ' ' && ((myAttrs & MASK_LINE_ATTR) === 0)) || // no line styles\n fg === bg // invisible text\n )\n ) {\n myAttrs ^= MASK_BLINK\n }\n // update blinking cells counter if blink state changed\n if ((this.screenAttrs[cell] & MASK_BLINK) !== (myAttrs & MASK_BLINK)) {\n if (myAttrs & MASK_BLINK) this.blinkingCellCount++\n else this.blinkingCellCount--\n }\n\n this.screen[cell] = lastChar\n this.screenFG[cell] = fg\n this.screenBG[cell] = bg\n this.screenAttrs[cell] = myAttrs\n }\n\n while (i < strArray.length && cell < screenLength) {\n let character = strArray[i++]\n let charCode = character.codePointAt(0)\n\n let data\n switch (charCode) {\n case SEQ_REPEAT:\n let count = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n for (let j = 0; j < count; j++) {\n setCellContent(cell)\n if (++cell > screenLength) break\n }\n break\n\n case SEQ_SET_COLORS:\n data = parse3B(strArray[i] + strArray[i + 1] + strArray[i + 2])\n i += 3\n fg = data & 0xFF\n bg = (data >> 8) & 0xFF\n break\n\n case SEQ_SET_ATTRS:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n attrs = data & 0xFF\n break\n\n case SEQ_SET_FG:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n fg = data & 0xFF\n break\n\n case SEQ_SET_BG:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n bg = data & 0xFF\n break\n\n default:\n if (charCode < 32) character = '\\ufffd'\n lastChar = character\n setCellContent(cell)\n cell++\n }\n }\n\n if (this.window.debug) console.log(`Blinky cells = ${this.blinkingCellCount}`)\n\n this.scheduleDraw('load', 16)\n this.emit('load')\n }\n\n /**\n * Parses the content of a `T` message and updates the screen title and button\n * labels.\n * @param {string} str - the message content\n */\n loadLabels (str) {\n let pieces = str.split('\\x01')\n qs('#screen-title').textContent = pieces[0]\n $('#action-buttons button').forEach((button, i) => {\n let label = pieces[i + 1].trim()\n // if empty string, use the \"dim\" effect and put nbsp instead to\n // stretch the button vertically\n button.innerHTML = label ? esc(label) : ' '\n button.style.opacity = label ? 1 : 0.2\n })\n }\n\n /**\n * Shows an actual notification (if possible) or a notification balloon.\n * @param {string} text - the notification content\n */\n showNotification (text) {\n console.info(`Notification: ${text}`)\n if (Notification && Notification.permission === 'granted') {\n let notification = new Notification('ESPTerm', {\n body: text\n })\n notification.addEventListener('click', () => window.focus())\n } else {\n if (Notification && Notification.permission !== 'denied') {\n Notification.requestPermission()\n } else {\n // Fallback using the built-in notification balloon\n Notify.show(text)\n }\n }\n }\n\n /**\n * Loads a message from the server, and optionally a theme.\n * @param {string} str - the message\n * @param {number} [theme] - the new theme index\n */\n load (str, theme = -1) {\n const content = str.substr(1)\n if (theme >= 0 && theme < themes.length) {\n this.palette = themes[theme]\n }\n\n switch (str[0]) {\n case 'S':\n this.loadContent(content)\n break\n\n case 'T':\n this.loadLabels(content)\n break\n\n case 'B':\n this.beep()\n break\n\n case 'G':\n this.showNotification(content)\n break\n\n default:\n console.warn(`Bad data message type; ignoring.\\n${JSON.stringify(str)}`)\n }\n }\n\n /**\n * Creates a beep sound.\n */\n beep () {\n const audioCtx = this.audioCtx\n if (!audioCtx) return\n\n // prevent screeching\n if (this._lastBeep && this._lastBeep > Date.now() - 50) return\n this._lastBeep = Date.now()\n\n let osc, gain\n\n // main beep\n osc = audioCtx.createOscillator()\n gain = audioCtx.createGain()\n osc.connect(gain)\n gain.connect(audioCtx.destination)\n gain.gain.value = 0.5\n osc.frequency.value = 750\n osc.type = 'sine'\n osc.start()\n osc.stop(audioCtx.currentTime + 0.05)\n\n // surrogate beep (making it sound like 'oops')\n osc = audioCtx.createOscillator()\n gain = audioCtx.createGain()\n osc.connect(gain)\n gain.connect(audioCtx.destination)\n gain.gain.value = 0.2\n osc.frequency.value = 400\n osc.type = 'sine'\n osc.start(audioCtx.currentTime + 0.05)\n osc.stop(audioCtx.currentTime + 0.08)\n }\n\n /**\n * Converts an alphabetic character to its fraktur variant.\n * @param {string} character - the character\n * @returns {string} the converted character\n */\n static alphaToFraktur (character) {\n if (character >= 'a' && character <= 'z') {\n character = String.fromCodePoint(0x1d51e - 0x61 + character.charCodeAt(0))\n } else if (character >= 'A' && character <= 'Z') {\n character = frakturExceptions[character] || String.fromCodePoint(\n 0x1d504 - 0x41 + character.charCodeAt(0))\n }\n return character\n }\n}\n","/** File upload utility */\nwindow.TermUpl = function (conn, input, screen) {\n let lines, // array of lines without newlines\n line_i, // current line index\n fuTout, // timeout handle for line sending\n send_delay_ms, // delay between lines (ms)\n nl_str, // newline string to use\n curLine, // current line (when using fuOil)\n inline_pos // Offset in line (for long lines)\n\n // lines longer than this are split to chunks\n // sending a super-ling string through the socket is not a good idea\n const MAX_LINE_LEN = 128\n\n function openUploadDialog () {\n updateStatus('Ready...')\n Modal.show('#fu_modal', onDialogClose)\n $('#fu_form').toggleClass('busy', false)\n input.blockKeys(true)\n }\n\n function onDialogClose () {\n console.log('Upload modal closed.')\n clearTimeout(fuTout)\n line_i = 0\n input.blockKeys(false)\n }\n\n function updateStatus (msg) {\n qs('#fu_prog').textContent = msg\n }\n\n function startUpload () {\n let v = qs('#fu_text').value\n if (!v.length) {\n fuClose()\n return\n }\n\n lines = v.split('\\n')\n line_i = 0\n inline_pos = 0 // offset in line\n send_delay_ms = qs('#fu_delay').value\n\n // sanitize - 0 causes overflows\n if (send_delay_ms < 0) {\n send_delay_ms = 0\n qs('#fu_delay').value = send_delay_ms\n }\n\n nl_str = {\n 'CR': '\\r',\n 'LF': '\\n',\n 'CRLF': '\\r\\n'\n }[qs('#fu_crlf').value]\n\n $('#fu_form').toggleClass('busy', true)\n updateStatus('Starting...')\n uploadLine()\n }\n\n function uploadLine () {\n if (!$('#fu_modal').hasClass('visible')) {\n // Modal is closed, cancel\n return\n }\n\n if (!conn.canSend()) {\n // postpone\n fuTout = setTimeout(uploadLine, 1)\n return\n }\n\n if (inline_pos === 0) {\n curLine = ''\n if (line_i === 0) {\n if (screen.bracketedPaste) {\n curLine = '\\x1b[200~'\n }\n }\n\n curLine += lines[line_i++] + nl_str\n\n if (line_i === lines.length) {\n if (screen.bracketedPaste) {\n curLine += '\\x1b[201~'\n }\n }\n }\n\n let chunk\n if ((curLine.length - inline_pos) <= MAX_LINE_LEN) {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos = 0\n } else {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos += MAX_LINE_LEN\n }\n\n if (!input.sendString(chunk)) {\n updateStatus('FAILED!')\n return\n }\n\n let pt = Math.round((line_i / lines.length) * 1000) / 10\n updateStatus(`${line_i} / ${lines.length} (${pt}%)`)\n\n if (lines.length > line_i || inline_pos > 0) {\n fuTout = setTimeout(uploadLine, send_delay_ms)\n } else {\n closeWhenReady()\n }\n }\n\n function closeWhenReady () {\n if (!conn.canSend()) {\n // stuck in XOFF still, wait to process...\n updateStatus('Waiting for Tx buffer...')\n setTimeout(closeWhenReady, 100)\n } else {\n updateStatus('Done.')\n // delay to show it\n fuClose()\n }\n }\n\n function fuClose () {\n Modal.hide('#fu_modal')\n }\n\n return {\n init: function () {\n qs('#fu_file').addEventListener('change', function (evt) {\n let reader = new FileReader()\n let file = evt.target.files[0]\n let ftype = file.type || 'application/octet-stream'\n console.log('Selected file type: ' + ftype)\n if (!ftype.match(/text\\/.*|application\\/(json|csv|.*xml.*|.*script.*|x-php)/)) {\n // Deny load of blobs like img - can crash browser and will get corrupted anyway\n if (!confirm(`This does not look like a text file: ${ftype}\\nReally load?`)) {\n qs('#fu_file').value = ''\n return\n }\n }\n reader.onload = function (e) {\n const txt = e.target.result.replace(/[\\r\\n]+/, '\\n')\n qs('#fu_text').value = txt\n }\n console.log('Loading file...')\n reader.readAsText(file)\n }, false)\n\n qs('#term-fu-open').addEventListener('click', function () {\n openUploadDialog()\n return false\n })\n\n qs('#term-fu-start').addEventListener('click', function () {\n startUpload()\n return false\n })\n\n qs('#term-fu-close').addEventListener('click', function () {\n fuClose()\n return false\n })\n }\n }\n}\n","window.attachDebugScreen = function (screen) {\n const debugCanvas = mk('canvas')\n const ctx = debugCanvas.getContext('2d')\n\n debugCanvas.style.position = 'absolute'\n // hackity hack should probably set this in CSS\n debugCanvas.style.top = '6px'\n debugCanvas.style.left = '6px'\n debugCanvas.style.pointerEvents = 'none'\n\n let addCanvas = function () {\n if (!debugCanvas.parentNode) screen.canvas.parentNode.appendChild(debugCanvas)\n }\n let removeCanvas = function () {\n if (debugCanvas.parentNode) debugCanvas.parentNode.removeChild(debugCanvas)\n }\n let updateCanvasSize = function () {\n let { width, height, devicePixelRatio } = screen.window\n let cellSize = screen.getCellSize()\n debugCanvas.width = width * cellSize.width * devicePixelRatio\n debugCanvas.height = height * cellSize.height * devicePixelRatio\n debugCanvas.style.width = `${width * cellSize.width}px`\n debugCanvas.style.height = `${height * cellSize.height}px`\n }\n\n let startTime, endTime, lastReason\n let cells = new Map()\n\n let startDrawing\n\n screen._debug = {\n drawStart (reason) {\n lastReason = reason\n startTime = Date.now()\n },\n drawEnd () {\n endTime = Date.now()\n console.log(`Draw: ${lastReason} (${(endTime - startTime)} ms) with fancy graphics: ${screen.window.graphics}`)\n startDrawing()\n },\n setCell (cell, flags) {\n cells.set(cell, [flags, Date.now()])\n }\n }\n\n let isDrawing = false\n\n let drawLoop = function () {\n if (isDrawing) requestAnimationFrame(drawLoop)\n\n let { devicePixelRatio, width, height } = screen.window\n let { width: cellWidth, height: cellHeight } = screen.getCellSize()\n let screenLength = width * height\n let now = Date.now()\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n ctx.clearRect(0, 0, width * cellWidth, height * cellHeight)\n\n let activeCells = 0\n for (let cell = 0; cell < screenLength; cell++) {\n if (!cells.has(cell) || cells.get(cell)[0] === 0) continue\n\n let [flags, timestamp] = cells.get(cell)\n let elapsedTime = (now - timestamp) / 1000\n\n if (elapsedTime > 1) continue\n\n activeCells++\n ctx.globalAlpha = 0.5 * Math.max(0, 1 - elapsedTime)\n\n let x = cell % width\n let y = Math.floor(cell / width)\n\n if (flags & 1) {\n // redrawn\n ctx.fillStyle = '#f0f'\n }\n if (flags & 2) {\n // updated\n ctx.fillStyle = '#0f0'\n }\n\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n\n if (flags & 4) {\n // wide cell\n ctx.lineWidth = 2\n ctx.strokeStyle = '#f00'\n ctx.strokeRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n }\n\n if (activeCells === 0) {\n isDrawing = false\n removeCanvas()\n }\n }\n\n startDrawing = function () {\n if (isDrawing) return\n addCanvas()\n updateCanvasSize()\n isDrawing = true\n drawLoop()\n }\n}\n","window.initSoftKeyboard = function (screen, input) {\n const keyInput = qs('#softkb-input')\n if (!keyInput) return // abort, we're not on the terminal page\n\n let keyboardOpen = false\n\n // moves the input to where the cursor is on the canvas.\n // this is because most browsers will always scroll to wherever the focused\n // input is\n let updateInputPosition = function () {\n if (!keyboardOpen) return\n\n let [x, y] = screen.gridToScreen(screen.cursor.x, screen.cursor.y, true)\n keyInput.style.transform = `translate(${x}px, ${y}px)`\n }\n\n keyInput.addEventListener('focus', () => {\n keyboardOpen = true\n updateInputPosition()\n })\n\n keyInput.addEventListener('blur', () => (keyboardOpen = false))\n\n screen.on('cursor-moved', updateInputPosition)\n\n qs('#term-kb-open').addEventListener('click', e => {\n e.preventDefault()\n keyInput.focus()\n })\n\n // Chrome for Android doesn't send proper keydown/keypress events with\n // real key values instead of 229 “Unidentified,” so here's a workaround\n // that deals with the input composition events.\n\n let lastCompositionString = ''\n let compositing = false\n\n // sends the difference between the last and the new composition string\n let sendInputDelta = function (newValue) {\n let resend = false\n if (newValue.length > lastCompositionString.length) {\n if (newValue.startsWith(lastCompositionString)) {\n // characters have been added at the end\n input.sendString(newValue.substr(lastCompositionString.length))\n } else resend = true\n } else if (newValue.length < lastCompositionString.length) {\n if (lastCompositionString.startsWith(newValue)) {\n // characters have been removed at the end\n input.sendString('\\b'.repeat(lastCompositionString.length -\n newValue.length))\n } else resend = true\n } else if (newValue !== lastCompositionString) resend = true\n\n if (resend) {\n // the entire string changed; resend everything\n input.sendString('\\b'.repeat(lastCompositionString.length) +\n newValue)\n }\n lastCompositionString = newValue\n }\n\n keyInput.addEventListener('keydown', e => {\n if (e.key === 'Unidentified') return\n\n keyInput.value = ''\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n input.sendString('\\b')\n } else if (e.key === 'Enter') {\n e.preventDefault()\n input.sendString('\\x0d')\n }\n })\n\n keyInput.addEventListener('keypress', e => {\n // prevent key duplication on iOS (because Safari *does* send proper events)\n e.stopPropagation()\n })\n\n keyInput.addEventListener('input', e => {\n e.stopPropagation()\n\n if (e.isComposing) {\n sendInputDelta(e.data)\n } else {\n if (e.inputType === 'insertCompositionText') input.sendString(e.data)\n else if (e.inputType === 'deleteContentBackward') {\n lastCompositionString = ''\n sendInputDelta('')\n } else if (e.inputType === 'insertText') {\n input.sendString(e.data)\n }\n }\n })\n\n keyInput.addEventListener('compositionstart', e => {\n lastCompositionString = ''\n compositing = true\n })\n\n keyInput.addEventListener('compositionend', e => {\n lastCompositionString = ''\n compositing = false\n keyInput.value = ''\n })\n\n screen.on('open-soft-keyboard', () => keyInput.focus())\n}\n","/** Init the terminal sub-module - called from HTML */\nwindow.termInit = function ({ labels, theme, allFn }) {\n const screen = new TermScreen()\n const conn = Conn(screen)\n const input = Input(conn)\n const termUpload = TermUpl(conn, input, screen)\n screen.input = input\n\n conn.init()\n input.init({ allFn })\n termUpload.init()\n Notify.init()\n\n window.onerror = function (errorMsg, file, line, col) {\n Notify.show(`JS ERROR!
${errorMsg}
at ${file}:${line}:${col}`, 10000, true)\n return false\n }\n\n qs('#screen').appendChild(screen.canvas)\n screen.load(labels, theme) // load labels and theme\n\n window.initSoftKeyboard(screen, input)\n if (window.attachDebugScreen) window.attachDebugScreen(screen)\n\n let isFullscreen = false\n let fitScreen = false\n let fitScreenIfNeeded = function fitScreenIfNeeded () {\n if (isFullscreen) {\n screen.window.fitIntoWidth = window.screen.width\n screen.window.fitIntoHeight = window.screen.height\n } else {\n screen.window.fitIntoWidth = fitScreen ? window.innerWidth - 20 : 0\n screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0\n }\n }\n fitScreenIfNeeded()\n window.addEventListener('resize', fitScreenIfNeeded)\n\n let toggleFitScreen = function () {\n fitScreen = !fitScreen\n const resizeButtonIcon = qs('#resize-button-icon')\n if (fitScreen) {\n resizeButtonIcon.classList.remove('icn-resize-small')\n resizeButtonIcon.classList.add('icn-resize-full')\n } else {\n resizeButtonIcon.classList.remove('icn-resize-full')\n resizeButtonIcon.classList.add('icn-resize-small')\n }\n fitScreenIfNeeded()\n }\n\n qs('#term-fit-screen').addEventListener('click', function () {\n toggleFitScreen()\n return false\n })\n\n // add fullscreen mode & button\n if (Element.prototype.requestFullscreen || Element.prototype.webkitRequestFullscreen) {\n let checkForFullscreen = function () {\n // document.fullscreenElement is not really supported yet, so here's a hack\n if (isFullscreen && (innerWidth !== window.screen.width || innerHeight !== window.screen.height)) {\n isFullscreen = false\n fitScreenIfNeeded()\n }\n }\n setInterval(checkForFullscreen, 500)\n\n // (why are the buttons anchors?)\n let button = mk('a')\n button.href = '#'\n button.addEventListener('click', e => {\n e.preventDefault()\n\n isFullscreen = true\n fitScreenIfNeeded()\n screen.updateSize()\n\n if (screen.canvas.requestFullscreen) screen.canvas.requestFullscreen()\n else screen.canvas.webkitRequestFullscreen()\n })\n let icon = mk('i')\n icon.classList.add('icn-resize-full') // TODO: less confusing icons\n button.appendChild(icon)\n let span = mk('span')\n span.textContent = 'Fullscreen'\n button.appendChild(span)\n qs('#term-nav').insertBefore(button, qs('#term-nav').firstChild)\n }\n\n // for debugging\n window.termScreen = screen\n window.conn = conn\n window.input = input\n window.termUpl = termUpload\n}\n"]} \ No newline at end of file diff --git a/js/app.js b/js/app.js deleted file mode 100644 index 36f2dbd..0000000 --- a/js/app.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict';var _typeof='function'==typeof Symbol&&'symbol'==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&'function'==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?'symbol':typeof a};(function(){'use strict';function a(){var a;for(p=!0,a=0;a":'>','"':'"',"'":''',"/":'/',"`":'`',"=":'='};m.htmlEscape=function(a){return(a+'').replace(/[&<>"'`=\/]/g,function(a){return t[a]})},d.$=m})(); -'use strict';(function(a){function b(a,b){for(var c=a.length;c--;)if(a[c]===b)return c;return-1}function c(a,b){if(a.length!=b.length)return!1;for(var c=0;cj;j++)p['f'+j]=111+j;var s={16:'shiftKey',17:'ctrlKey',18:'altKey',91:'metaKey'};for(j in o)f[j]=!1;i(document,'keydown',function(a){e(a)}),i(document,'keyup',function(a){var c,d=a.keyCode,e=b(r,d);if(0<=e&&r.splice(e,1),(93==d||224==d)&&(d=91),d in n)for(c in n[d]=!1,o)o[c]==d&&(f[c]=!1)}),i(window,'focus',function(){for(j in n)n[j]=!1;for(j in o)f[j]=!1});var t=a.key;a.key=f,a.key.setScope=function(a){k=a||'all'},a.key.getScope=g,a.key.deleteScope=function(a){var b,c,d;for(b in m)for(c=m[b],d=0;di||1114111=i?a.push(i):(i-=65536,d=(i>>10)+55296,e=i%1024+56320,a.push(d,e)),(f+1==g||a.length>16384)&&(h+=b.apply(null,a),a.length=0)}return h};a?a(String,'fromCodePoint',{value:d,configurable:!0,writable:!0}):String.fromCodePoint=d}(); -'use strict';function mk(a){return document.createElement(a)}function qs(a){return document.querySelector(a)}function qsa(a){return document.querySelectorAll(a)}function bool(a){return 1===a||'1'===a||!0===a||'true'===a}function cr(a){return function(b){(10===b.which||13===b.which||32===b.which)&&a()}}function extend(a,b){var c={};return Object.keys(a).forEach(function(b){c[b]=a[b]}),Object.keys(b).forEach(function(a){c[a]=b[a]}),c}function rgxe(a){return a.replace(/[-[\]/{}()*+?.\\^$|]/g,'\\$&')}function numfmt(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}function msNow(){return+new Date}function msElapsed(a){return msNow()-a}Math.log10=Math.log10||function(a){return Math.log(a)/Math.LN10};function esc(a){return $.htmlEscape(a)}function undef(a){return'undefined'==typeof a}function jsp(a){try{return JSON.parse(a)}catch(a){return console.error(a),null}}function Chr(a){return String.fromCharCode(a)}function parse2B(a){var b=1'+a.rssi_perc+'').htmlAppend('
'+i+'
').htmlAppend('
'+g[a.enc]+'
'),d.on('click',function(){var a=$(this);var b=a.data('ssid');var d='';+a.data('pwd')&&(d=prompt(tr('wifi.enter_passwd').replace(':ssid:',b)),!d)||($('#sta_password').val(d),$('#sta_ssid').val(b),c(b,d,''))}),b.appendChild(f),e[0].appendChild(b)}})}}function e(){_demo?d(_demo_aps,200):$.get('http://'+_root+'/cfg/wifi/scan',d)}function f(a){setTimeout(e,a)}var g=['Open','WEP','WPA','WPA2','WPA/WPA2'];var h;a.init=function(a){$('.Row.range').forEach(function(a){var c=a.querySelector('input');var d=a.querySelector('.x-disp1');var e=a.querySelector('.x-disp2');var f=b(c);$(d).html(f),$(e).html(f),$(c).on('input',function(){f=b(c),$(d).html(f),$(e).html(f)})}),$('#forget-sta').on('click',function(){return c('','',''),!1}),c(a.sta_ssid,a.sta_password,a.sta_active_ip),h=a.sta_active_ssid},a.startScanning=function(){$('#ap-loader').removeClass('hidden'),$('#ap-scan').addClass('hidden'),$('#ap-loader .anim-dots').html('.'),e()}})(window.WiFi={}); -'use strict';window.Conn=function(){function a(){console.log('CONNECTED'),f(),d('i')}function b(a){console.warn('SOCKET CLOSED, code '+a.code+'. Reconnecting...'),clearTimeout(m),m=setTimeout(function(){e()},2e3)}function c(a){try{switch(a.data.charAt(0)){case'.':break;case'-':k=!0,l=setTimeout(function(){k=!1},250);break;case'+':k=!1,clearTimeout(l);break;default:Screen.load(a.data),n||(showPage(),n=!0);}f()}catch(a){console.error(a)}}function d(a){return _demo?(console.log('TX: ',a),!0):k?(console.log('Can\'t send, flood control.'),!1):!!h&&(1===h.readyState?('string'!=typeof a&&(a=JSON.stringify(a)),h.send(a),!0):(console.error('Socket not ready'),!1))}function e(){return _demo?(console.log('Demo mode!'),Screen.load(_demo_screen),void showPage()):void(clearTimeout(m),clearTimeout(i),h=new WebSocket('ws://'+_root+'/term/update.ws'),h.onopen=a,h.onclose=b,h.onmessage=c,console.log('Opening socket.'),f())}function f(){clearTimeout(i),i=setTimeout(g,2e3)}function g(){console.error('Heartbeat lost, probing server...'),j=setInterval(function(){console.log('> ping'),$.get('http://'+_root+'/system/ping',function(a,b){200===b&&(clearInterval(j),console.info('Server ready, reloading page...'),location.reload())},{timeout:100})},1e3)}var h;var i;var j;var k=!1;var l;var m;var n=!1;return{ws:null,init:e,send:d,canSend:function(){return!k}}}(); -'use strict';window.Input=function(){function a(a){return Conn.send('s'+a)}function b(a){Conn.send('b'+Chr(a))}function c(a,b){return j.fn_alt?a:b}function d(a,b){return j.cu_alt?a:b}function e(a,b){return j.np_alt?a:b}function f(){var a={tab:'\t',backspace:'\b',enter:j.crlf_mode?'\r\n':'\r',"ctrl+enter":'\n',esc:'\x1B',up:d('\x1BOA','\x1B[A'),down:d('\x1BOB','\x1B[B'),right:d('\x1BOC','\x1B[C'),left:d('\x1BOD','\x1B[D'),home:d('\x1BOH',c('\x1B[H','\x1B[1~')),insert:'\x1B[2~',delete:'\x1B[3~',end:d('\x1BOF',c('\x1B[F','\x1B[4~')),pageup:'\x1B[5~',pagedown:'\x1B[6~',f1:c('\x1BOP','\x1B[11~'),f2:c('\x1BOQ','\x1B[12~'),f3:c('\x1BOR','\x1B[13~'),f4:c('\x1BOS','\x1B[14~'),f5:'\x1B[15~',f6:'\x1B[17~',f7:'\x1B[18~',f8:'\x1B[19~',f9:'\x1B[20~',f10:'\x1B[21~',f11:'\x1B[23~',f12:'\x1B[24~',"shift+f1":c('\x1BO1;2P','\x1B[25~'),"shift+f2":c('\x1BO1;2Q','\x1B[26~'),"shift+f3":c('\x1BO1;2R','\x1B[28~'),"shift+f4":c('\x1BO1;2S','\x1B[29~'),"shift+f5":c('\x1B[15;2~','\x1B[31~'),"shift+f6":c('\x1B[17;2~','\x1B[32~'),"shift+f7":c('\x1B[18;2~','\x1B[33~'),"shift+f8":c('\x1B[19;2~','\x1B[34~'),"shift+f9":c('\x1B[20;2~','\x1B[35~'),"shift+f10":c('\x1B[21;2~','\x1B[36~'),"shift+f11":c('\x1B[22;2~','\x1B[37~'),"shift+f12":c('\x1B[23;2~','\x1B[38~'),np_0:e('\x1BOp','0'),np_1:e('\x1BOq','1'),np_2:e('\x1BOr','2'),np_3:e('\x1BOs','3'),np_4:e('\x1BOt','4'),np_5:e('\x1BOu','5'),np_6:e('\x1BOv','6'),np_7:e('\x1BOw','7'),np_8:e('\x1BOx','8'),np_9:e('\x1BOy','9'),np_mul:e('\x1BOR','*'),np_add:e('\x1BOl','+'),np_sub:e('\x1BOS','-'),np_point:e('\x1BOn','.'),np_div:e('\x1BOQ','/')};for(var b in a)a.hasOwnProperty(b)&&g(b,a[b])}function g(b,c){-1!==b.indexOf('ctrl+')&&(b+=','+b.replace('ctrl','command')),key.unbind(b),key(b,function(b){j.no_keys||(b.preventDefault(),a(c))})}function h(){var b=String.fromCharCode;window.addEventListener('keypress',function(b){if(!j.no_keys){var c='';b.key?c=b.key:b.which&&(c=String.fromCodePoint(b.which)),0=c;c++)g('ctrl+'+b(96+c),b(c));g('ctrl+]','\x1B'),g('ctrl+\\','\x1C'),g('ctrl+[','\x1D'),g('ctrl+^','\x1E'),g('ctrl+_','\x1F'),g('ctrl+left','\x1F[1;5D'),g('ctrl+right','\x1F[1;5C'),g('ctrl+up','\x1F[1;5A'),g('ctrl+down','\x1F[1;5B'),g('ctrl+home','\x1F[1;5H'),g('ctrl+end','\x1F[1;5F'),g('shift+left','\x1F[1;2D'),g('shift+right','\x1F[1;2C'),g('shift+up','\x1F[1;2A'),g('shift+down','\x1F[1;2B'),g('shift+home','\x1F[1;2H'),g('shift+end','\x1F[1;2F'),g('\u2325+left','\x1Fb'),g('\u2325+right','\x1Ff'),g('\u2318+left','\x01'),g('\u2318+right','\x05'),g('\u2325+backspace','\x17'),g('\u2318+backspace','\x15'),f()}function i(){return(key.isModifier('ctrl')?1:0)|(key.isModifier('shift')?2:0)|(key.isModifier('alt')?4:0)|(key.isModifier('meta')?8:0)}var j={np_alt:!1,cu_alt:!1,fn_alt:!1,mt_click:!1,mt_move:!1,no_keys:!1,crlf_mode:!1};var k=0;var l=0;var n=0;return{init:function(){h(),$('#action-buttons button').forEach(function(a){a.addEventListener('click',function(){b(+this.dataset.n)})}),window.addEventListener('mousedown',function(a){0===a.button&&(k=1),1===a.button&&(l=1),2===a.button&&(n=1)}),window.addEventListener('mouseup',function(a){0===a.button&&(k=0),1===a.button&&(l=0),2===a.button&&(n=0)})},sendString:a,setAlts:function setAlts(a,b,c,d){(j.cu_alt!==a||j.np_alt!==b||j.fn_alt!==c||j.crlf_mode!==d)&&(j.cu_alt=a,j.np_alt=b,j.fn_alt=c,j.crlf_mode=d,f())},setMouseMode:function setMouseMode(a,b){j.mt_click=a,j.mt_move=b},onMouseMove:function onMouseMove(a,c){if(j.mt_move){var d=k?1:l?2:n?3:0;var b=i();Conn.send('m'+encode2B(c)+encode2B(a)+encode2B(d)+encode2B(b))}},onMouseDown:function onMouseDown(a,c,d){if(j.mt_click&&!(3d)){var b=i();Conn.send('p'+encode2B(c)+encode2B(a)+encode2B(d)+encode2B(b))}},onMouseUp:function onMouseUp(a,c,d){if(j.mt_click&&!(3d)){var b=i();Conn.send('r'+encode2B(c)+encode2B(a)+encode2B(d)+encode2B(b))}},onMouseWheel:function onMouseWheel(a,c,d){if(j.mt_click){var e=i();var f=0>d?4:5;Conn.send('p'+encode2B(c)+encode2B(a)+encode2B(f)+encode2B(e))}},mouseTracksClicks:function mouseTracksClicks(){return j.mt_click},blockKeys:function blockKeys(a){j.no_keys=a}}}(); -'use strict';var _slicedToArray=function(){function a(a,b){var c=[];var d=!0;var e=!1;var f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!(b&&c.length===b));d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h['return']&&h['return']()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError('Invalid attempt to destructure non-iterable instance')}}();var _createClass=function(){function a(a,b){for(var c=0;cred;red++)for(var green=0;6>green;green++)for(var blue=0;6>blue;blue++){var redValue=40*red+(red?55:0);var greenValue=40*green+(green?55:0);var blueValue=40*blue+(blue?55:0);colorTable256.push('rgb('+redValue+', '+greenValue+', '+blueValue+')')}for(var gray=0;24>gray;gray++){var value=10*gray+8;colorTable256.push('rgb('+value+', '+value+', '+value+')')}var TermScreen=function(){function a(){var b=this;_classCallCheck(this,a),this.canvas=mk('canvas'),this.ctx=this.canvas.getContext('2d'),'AudioContext'in window||'webkitAudioContext'in window?this.audioCtx=new(window.AudioContext||window.webkitAudioContext):console.warn('No AudioContext!'),this.cursor={x:0,y:0,fg:7,bg:0,attrs:0,blinkOn:!1,blinking:!0,visible:!0,hanging:!1,style:'block',blinkEnable:!0,blinkInterval:0},this._palette=null,this._window={width:0,height:0,devicePixelRatio:1,fontFamily:'"DejaVu Sans Mono", "Liberation Mono", "Inconsolata", "Menlo", monospace',fontSize:20,gridScaleX:1,gridScaleY:1.2,blinkStyleOn:!0,blinkInterval:null,fitIntoWidth:0,fitIntoHeight:0,debug:!1},this.windowState={width:0,height:0,devicePixelRatio:0,gridScaleX:0,gridScaleY:0,fontFamily:'',fontSize:0,fitIntoWidth:0,fitIntoHeight:0},this.selection={selectable:!0,start:[0,0],end:[0,0]},this.mouseMode={clicks:!1,movement:!1},this._listeners={};var c=this;this.window=new Proxy(this._window,{set:function set(a,b,d){return a[b]=d,c.scheduleSizeUpdate(),c.scheduleDraw('window:'+b+'='+d),!0}}),this.blinkingCellCount=0,this.screen=[],this.screenFG=[],this.screenBG=[],this.screenAttrs=[],this.drawnScreen=[],this.drawnScreenFG=[],this.drawnScreenBG=[],this.drawnScreenAttrs=[],this.resetBlink(),this.resetCursorBlink();var d=!1;var f=function(a,c){d||(d=!0,b.selection.start=b.selection.end=b.screenToGrid(a,c),b.scheduleDraw('select-start'))};var g=function(a,c){d&&(b.selection.end=b.screenToGrid(a,c),b.scheduleDraw('select-move'))};var h=function(a,c){d&&(d=!1,b.selection.end=b.screenToGrid(a,c),b.scheduleDraw('select-end'),Object.assign(b.selection,b.getNormalizedSelection()))};this.canvas.addEventListener('mousedown',function(a){if((b.selection.selectable||a.altKey)&&0===a.button)f(a.offsetX,a.offsetY);else{var c;(c=Input).onMouseDown.apply(c,_toConsumableArray(b.screenToGrid(a.offsetX,a.offsetY)).concat([a.button+1]))}}),window.addEventListener('mousemove',function(a){g(a.offsetX,a.offsetY)}),window.addEventListener('mouseup',function(a){h(a.offsetX,a.offsetY)});var i=null;var j=0;var k=!1;var l=function(a){var c=b.canvas.getBoundingClientRect();return[a.clientX-c.left,a.clientY-c.top]};this.canvas.addEventListener('touchstart',function(a){i=l(a.touches[0]),k=!1,j=Date.now()}),this.canvas.addEventListener('touchmove',function(a){i=l(a.touches[0]),d||!1!=k?d&&(a.preventDefault(),g.apply(void 0,_toConsumableArray(i))):ja)return colorTable256[a];if(255>16;var c=255&a>>8;var d=255&a;return'rgb('+b+', '+c+', '+d+')'}return'rgba(0, 0, 0, 0)'}},{key:'scheduleSizeUpdate',value:function scheduleSizeUpdate(){var a=this;clearTimeout(this._scheduledSizeUpdate),this._scheduledSizeUpdate=setTimeout(function(){return a.updateSize()},1)}},{key:'scheduleDraw',value:function scheduleDraw(a){var b=this;var c=1h?(m=h/(l/m),l=h):i&&m>i&&(l=i*(l/m),m=i);else if(l>h||m>i){var n=l/m;n=a.blinkingCellCount||(b++,4<=b&&a.window.blinkStyleOn?(a.window.blinkStyleOn=!1,b=0):1<=b&&!a.window.blinkStyleOn&&(a.window.blinkStyleOn=!0,b=0))},200)}},{key:'getNormalizedSelection',value:function getNormalizedSelection(){var a=this.selection,b=a.start,c=a.end;if(b[1]>c[1]||b[1]===c[1]&&b[0]>c[0]){var d=[c,b];b=d[0],c=d[1]}return{start:b,end:c}}},{key:'isInSelection',value:function isInSelection(a,b){var c=this.getNormalizedSelection(),d=c.start,e=c.end;var f=d[0]<=a;var g=a=m+0.05};var s=function(a){var c=p.get(a)||q.get(a);var d=b.screen[a];var e=r(d);var g=e?2:1;if(!c){var u=!1;var h=!0;var i=!1;var j=void 0;try{for(var k,l=b.getAdjacentCells(a,g)[Symbol.iterator]();!(h=(k=l.next()).done);h=!0){var v=k.value;if(p.get(v)){u=!0;break}}}catch(a){i=!0,j=a}finally{try{!h&&l.return&&l.return()}finally{if(i)throw j}}u&&(c=!0)}if(c&&e){var m=!0;var n=!1;var o=void 0;try{for(var s,t=b.getAdjacentCells(a)[Symbol.iterator]();!(m=(s=t.next()).done);m=!0){var w=s.value;q.set(w,!0)}}catch(a){n=!0,o=a}finally{try{!m&&t.return&&t.return()}finally{if(n)throw o}}for(var x=a-1;0>9;0>1;var q=!(1&o);0==p?this.cursor.style='block':1==p?this.cursor.style='line':2==p&&(this.cursor.style='bar'),this.cursor.blinking!==q&&(this.cursor.blinking=q,this.resetCursorBlink()),Input.setMouseMode(m,n),this.selection.selectable=!n,$(this.canvas).toggleClass('selectable',!n),this.mouseMode={clicks:m,movement:n};$('.x-term-conf-btn').toggleClass('hidden',!!!(256&l)),$('#action-buttons').toggleClass('hidden',!!!(128&l));var r=7;var s=0;var t=0;var u=0;var v=' ';var w=this.window.width*this.window.height;f&&(this.updateSize(),this.blinkingCellCount=0,this.screen=Array(w).fill(' '),this.screenFG=Array(w).fill(' '),this.screenBG=Array(w).fill(' '),this.screenAttrs=Array(w).fill(' '));var x=undef(Array.from)?a.split(''):Array.from(a);var y=16;for(var z=function(){var a=t;0!=(a&y)&&(' '==v&&0==(a&200)||r==s)&&(a^=y),(b.screenAttrs[u]&y)!=(a&y)&&(a&y?b.blinkingCellCount++:b.blinkingCellCount--),b.screen[u]=v,b.screenFG[u]=r,b.screenBG[u]=s,b.screenAttrs[u]=a};cw));E++);break;case SEQ_SET_COLORS:C=parse3B(x[c]+x[c+1]+x[c+2]),c+=3,r=255&C,s=255&C>>8;break;case SEQ_SET_ATTRS:C=parse2B(x[c]+x[c+1]),c+=2,t=255&C;break;case SEQ_SET_FG:C=parse2B(x[c]+x[c+1]),c+=2,r=255&C;break;case SEQ_SET_BG:C=parse2B(x[c]+x[c+1]),c+=2,s=255&C;break;default:32>B&&(A='\uFFFD'),v=A,z(u),u++;}}this.window.debug&&console.log('Blinky cells = '+this.blinkingCellCount),this.scheduleDraw('load',16),this.emit('load')}},{key:'loadLabels',value:function loadLabels(a){var b=a.split('\x01');qs('h1').textContent=b[0],$('#action-buttons button').forEach(function(a,c){var d=b[c+1].trim();a.innerHTML=d?esc(d):' ',a.style.opacity=d?1:0.2})}},{key:'showNotification',value:function showNotification(a){if(console.info('Notification: '+a),Notification&&'granted'===Notification.permission){var b=new Notification('ESPTerm',{body:a});b.addEventListener('click',function(){return window.focus()})}else Notification&&'denied'!==Notification.permission?Notification.requestPermission():Notify.show(a)}},{key:'load',value:function load(a){var b=1Date.now()-50)){this._lastBeep=Date.now();var b,c;b=a.createOscillator(),c=a.createGain(),b.connect(c),c.connect(a.destination),c.gain.value=0.5,b.frequency.value=750,b.type='sine',b.start(),b.stop(a.currentTime+0.05),b=a.createOscillator(),c=a.createGain(),b.connect(c),c.connect(a.destination),c.gain.value=0.2,b.frequency.value=400,b.type='sine',b.start(a.currentTime+0.05),b.stop(a.currentTime+0.08)}}},{key:'palette',get:function get(){return this._palette||themes[0]},set:function set(a){this._palette!==a&&(this._palette=a,this.scheduleDraw('palette'))}}],[{key:'alphaToFraktur',value:function alphaToFraktur(a){var b=String.fromCodePoint;return'a'<=a&&'z'>=a?a=b(119997+a.charCodeAt(0)):'A'<=a&&'Z'>=a&&(a=frakturExceptions[a]||b(120003+a.charCodeAt(0))),a}}]),a}();var Screen=new TermScreen;Screen.once('load',function(){qs('#screen').appendChild(Screen.canvas)});var fitScreen=!1;function fitScreenIfNeeded(){Screen.window.fitIntoWidth=fitScreen?window.innerWidth-20:0,Screen.window.fitIntoHeight=fitScreen?window.innerHeight:0}fitScreenIfNeeded(),window.addEventListener('resize',fitScreenIfNeeded),window.toggleFitScreen=function(){fitScreen=!fitScreen;var a=qs('#resize-button-icon');fitScreen?(a.classList.remove('icn-resize-small'),a.classList.add('icn-resize-full')):(a.classList.remove('icn-resize-full'),a.classList.add('icn-resize-small')),fitScreenIfNeeded()}; -'use strict';window.TermUpl=function(){function a(){console.log('Upload modal closed.'),clearTimeout(h),g=0,Input.blockKeys(!1)}function b(a){qs('#fu_prog').textContent=a}function c(){if($('#fu_modal').hasClass('visible')){if(!Conn.canSend())return void(h=setTimeout(c,1));0===l&&(k=f[g++]+j);var a;if(k.length-l<=m?(a=k.substr(l,m),l=0):(a=k.substr(l,m),l+=m),!Input.sendString(a))return void b('FAILED!');var e=f.length;b(g+' / '+e+' ('+Math.round(1e3*(g/e))/10+'%)'),f.length>g||0i&&(i=0,qs('#fu_delay').value=i),j={CR:'\r',LF:'\n',CRLF:'\r\n'}[qs('#fu_crlf').value],$('#fu_form').toggleClass('busy',!0),b('Starting...'),c()):void e()},open:function(){b('Ready...'),Modal.show('#fu_modal',a),$('#fu_form').toggleClass('busy',!1),Input.blockKeys(!0)}}}(); -"use strict";window.termInit=function(a,b){Conn.init(),Input.init(),TermUpl.init(),Screen.load(a,b)}; -'use strict';var _slicedToArray=function(){function a(a,b){var c=[];var d=!0;var e=!1;var f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!(b&&c.length===b));d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h['return']&&h['return']()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError('Invalid attempt to destructure non-iterable instance')}}();$.ready(function(){var a=qs('#softkb-input');if(a){var b=!1;var c=function(){if(b){var c=Screen.gridToScreen(Screen.cursor.x,Screen.cursor.y),d=_slicedToArray(c,2),e=d[0],f=d[1];a.style.transform='translate('+e+'px, '+f+'px)'}};a.addEventListener('focus',function(){b=!0,c()}),a.addEventListener('blur',function(){return b=!1}),Screen.on('cursor-moved',c),window.kbOpen=function(d){b=d,c(),d?a.focus():a.blur()};var d='';var e=!1;var f=function(a){var b=!1;a.length>d.length?a.startsWith(d)?Input.sendString(a.substr(d.length)):b=!0:a.length= 0; i -= 1) {\n\t\t\tfn(nodes[i]);\n\t\t}\n\t}\n\n\t// Convert to camel case\n\tfunction cssCamel(property) {\n\t\treturn property.replace(/-\\w/g, function (result) {\n\t\t\treturn result.charAt(1).toUpperCase();\n\t\t});\n\t}\n\n\t// Get computed style\n\tfunction computeStyle(elm, property) {\n\t\t// IE, everything else or null\n\t\treturn (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null;\n\n\t}\n\n\t// Returns URI encoded query string pair\n\tfunction queryPair(name, value) {\n\t\treturn encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+');\n\t}\n\n\t// Set CSS, important to wrap in try to prevent error thown on unsupported property\n\tfunction setCss(elm, property, value) {\n\t\ttry {\n\t\t\telm.style[cssCamel(property)] = value;\n\t\t} catch (e) {\n\t\t}\n\t}\n\n\t// Show CSS\n\tfunction showCss(elm) {\n\t\telm.style.display = '';\n\t\t// For elements still hidden by style block\n\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\telm.style.display = 'block';\n\t\t}\n\t}\n\n\t// Serialize form & JSON values\n\tfunction serializeData(nodes) {\n\t\tvar querystring = '', subelm, i, j;\n\t\tif (nodes.constructor === Object) { // Serialize JSON data\n\t\t\tfor (subelm in nodes) {\n\t\t\t\tif (nodes.hasOwnProperty(subelm)) {\n\t\t\t\t\tif (nodes[subelm].constructor === Array) {\n\t\t\t\t\t\tfor (i = 0; i < nodes[subelm].length; i += 1) {\n\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm][i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else { // Serialize node data\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (elm.nodeName === 'FORM') {\n\t\t\t\t\tfor (i = 0; i < elm.elements.length; i += 1) {\n\t\t\t\t\t\tsubelm = elm.elements[i];\n\n\t\t\t\t\t\tif (!subelm.disabled) {\n\t\t\t\t\t\t\tswitch (subelm.type) {\n\t\t\t\t\t\t\t\t// Ignore buttons, unsupported XHR 1 form fields\n\t\t\t\t\t\t\t\tcase 'button':\n\t\t\t\t\t\t\t\tcase 'image':\n\t\t\t\t\t\t\t\tcase 'file':\n\t\t\t\t\t\t\t\tcase 'submit':\n\t\t\t\t\t\t\t\tcase 'reset':\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-one':\n\t\t\t\t\t\t\t\t\tif (subelm.length > 0) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-multiple':\n\t\t\t\t\t\t\t\t\tfor (j = 0; j < subelm.length; j += 1) {\n\t\t\t\t\t\t\t\t\t\tif (subelm[j].selected) {\n\t\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm[j].value);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'checkbox':\n\t\t\t\t\t\t\t\tcase 'radio':\n\t\t\t\t\t\t\t\t\tif (subelm.checked) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t// Everything else including shinny new HTML5 input types\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\t// Tidy up first &\n\t\treturn (querystring.length > 0) ? querystring.substring(1) : '';\n\t}\n\n\t// Class helper\n\tfunction classHelper(classes, action, nodes) {\n\t\tvar classarray, search, i, replace, has = false;\n\t\tif (classes) {\n\t\t\t// Trim any whitespace\n\t\t\tclassarray = classes.split(/\\s+/);\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tfor (i = 0; i < classarray.length; i += 1) {\n\t\t\t\t\tvar clz = classarray[i];\n\t\t\t\t\tif (action === 'remove') {\n\t\t\t\t\t\telm.classList.remove(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'add') {\n\t\t\t\t\t\telm.classList.add(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'toggle') {\n\t\t\t\t\t\telm.classList.toggle(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'has') {\n\t\t\t\t\t\tif (elm.classList.contains(clz)) {\n\t\t\t\t\t\t\thas = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// search = new RegExp('\\\\b' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// replace = new RegExp(' *' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// if (action === 'remove') {\n\t\t\t\t\t// \telm.className = elm.className.replace(search, '');\n\t\t\t\t\t// } else if (action === 'toggle') {\n\t\t\t\t\t// \telm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i];\n\t\t\t\t\t// } else if (action === 'has') {\n\t\t\t\t\t// \tif (elm.className.match(search)) {\n\t\t\t\t\t// \t\thas = true;\n\t\t\t\t\t// \t\tbreak;\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\treturn has;\n\t}\n\n\t// HTML insertion helper\n\tfunction insertHtml(value, position, nodes) {\n\t\tvar tmpnodes, tmpnode;\n\t\tif (value) {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead\n\t\t\t\t// Convert string to node. We can't innerHTML on a document fragment\n\t\t\t\ttmpnodes = d.createElement('div');\n\t\t\t\ttmpnodes.innerHTML = value;\n\t\t\t\twhile ((tmpnode = tmpnodes.lastChild) !== null) {\n\t\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (position === 'before') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm);\n\t\t\t\t\t\t} else if (position === 'after') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm.nextSibling);\n\t\t\t\t\t\t} else if (position === 'append') {\n\t\t\t\t\t\t\telm.appendChild(tmpnode);\n\t\t\t\t\t\t} else if (position === 'prepend') {\n\t\t\t\t\t\t\telm.insertBefore(tmpnode, elm.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t}\n\n\t// Get nodes and return chibi\n\tfunction chibi(selector) {\n\t\tvar cb, nodes = [], json = false, nodelist, i;\n\n\t\tif (selector) {\n\n\t\t\t// Element node, would prefer to use (selector instanceof HTMLElement) but no IE support\n\t\t\tif (selector.nodeType && selector.nodeType === 1) {\n\t\t\t\tnodes = [selector]; // return element as node list\n\t\t\t} else if (typeof selector === 'object') {\n\t\t\t\t// JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support\n\t\t\t\tjson = (typeof selector.length !== 'number');\n\t\t\t\tnodes = selector;\n\t\t\t} else if (typeof selector === 'string') {\n\t\t\t\tnodelist = d.querySelectorAll(selector);\n\n\t\t\t\t// Convert node list to array so results have full access to array methods\n\t\t\t\t// Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway\n\t\t\t\tfor (i = 0; i < nodelist.length; i += 1) {\n\t\t\t\t\tnodes[i] = nodelist[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Only attach nodes if not JSON\n\t\tcb = json ? {} : nodes;\n\n\t\t// Public functions\n\n\t\t// Executes a function on nodes\n\t\tcb.each = function (fn) {\n\t\t\tif (typeof fn === 'function') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply\n\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Find first\n\t\tcb.first = function () {\n\t\t\treturn chibi(nodes.shift());\n\t\t};\n\t\t// Find last\n\t\tcb.last = function () {\n\t\t\treturn chibi(nodes.pop());\n\t\t};\n\t\t// Find odd\n\t\tcb.odd = function () {\n\t\t\tvar odds = [], i;\n\t\t\tfor (i = 0; i < nodes.length; i += 2) {\n\t\t\t\todds.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(odds);\n\t\t};\n\t\t// Find even\n\t\tcb.even = function () {\n\t\t\tvar evens = [], i;\n\t\t\tfor (i = 1; i < nodes.length; i += 2) {\n\t\t\t\tevens.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(evens);\n\t\t};\n\t\t// Hide node\n\t\tcb.hide = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\telm.style.display = 'none';\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Show node\n\t\tcb.show = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tshowCss(elm);\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle node display\n\t\tcb.toggle = function (state) {\n\t\t\tif (typeof state != 'undefined') { // ADDED\n\t\t\t\tif (state)\n\t\t\t\t\tcb.show();\n\t\t\t\telse\n\t\t\t\t\tcb.hide();\n\t\t\t} else {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// computeStyle instead of style.display == 'none' catches elements that are hidden via style block\n\t\t\t\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\t\t\t\tshowCss(elm);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telm.style.display = 'none';\n\t\t\t\t\t}\n\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove node\n\t\tcb.remove = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\ttry {\n\t\t\t\t\telm.parentNode.removeChild(elm);\n\t\t\t\t} catch (e) {\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn chibi();\n\t\t};\n\t\t// Get/Set CSS\n\t\tcb.css = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tif (value || value === '') {\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tsetCss(elm, property, value);\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (nodes[0].style[cssCamel(property)]) {\n\t\t\t\t\t\treturn nodes[0].style[cssCamel(property)];\n\t\t\t\t\t}\n\t\t\t\t\tif (computeStyle(nodes[0], property)) {\n\t\t\t\t\t\treturn computeStyle(nodes[0], property);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get class(es)\n\t\tcb.getClass = function () {\n\t\t\tif (nodes[0] && nodes[0].className.length > 0) {\n\t\t\t\t// Weak IE trim support\n\t\t\t\treturn nodes[0].className.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '').replace(/\\s+/, ' ');\n\t\t\t}\n\t\t};\n\t\t// Set (replaces) classes\n\t\tcb.setClass = function (classes) {\n\t\t\tif (classes || classes === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.className = classes;\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Add class\n\t\tcb.addClass = function (classes) {\n\t\t\tclassHelper(classes, 'add', nodes);\n\t\t\t// if (classes) {\n\t\t\t// \tnodeLoop(function (elm) {\n\t\t\t// \t\telm.className += ' ' + classes;\n\t\t\t// \t}, nodes);\n\t\t\t// }\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove class\n\t\tcb.removeClass = function (classes) {\n\t\t\tclassHelper(classes, 'remove', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle class\n\t\tcb.toggleClass = function (classes, set) {\n\t\t\tvar method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove'));\n\t\t\tclassHelper(classes, method, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Has class\n\t\tcb.hasClass = function (classes) {\n\t\t\treturn classHelper(classes, 'has', nodes);\n\t\t};\n\t\t// Get/set HTML\n\t\tcb.html = function (value) {\n\t\t\tif (value || value === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.innerHTML = value;\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\treturn nodes[0].innerHTML;\n\t\t\t}\n\t\t};\n\t\t// Insert HTML before selector\n\t\tcb.htmlBefore = function (value) {\n\t\t\tinsertHtml(value, 'before', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector\n\t\tcb.htmlAfter = function (value) {\n\t\t\tinsertHtml(value, 'after', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector innerHTML\n\t\tcb.htmlAppend = function (value) {\n\t\t\tinsertHtml(value, 'append', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML before selector innerHTML\n\t\tcb.htmlPrepend = function (value) {\n\t\t\tinsertHtml(value, 'prepend', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Get/Set HTML attributes\n\t\tcb.attr = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tproperty = property.toLowerCase();\n\t\t\t\t// IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway\n\t\t\t\tif (typeof value !== 'undefined') {//FIXED BUG HERE\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\t\telm.style.cssText = value;\n\t\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\t\telm.className = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telm.setAttribute(property, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\tif (nodes[0].style.cssText) {\n\t\t\t\t\t\t\treturn nodes[0].style.cssText;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\tif (nodes[0].className) {\n\t\t\t\t\t\t\treturn nodes[0].className;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (nodes[0].getAttribute(property)) {\n\t\t\t\t\t\t\treturn nodes[0].getAttribute(property);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get/Set HTML data property\n\t\tcb.data = function (key, value) {\n\t\t\tif (key) {\n\t\t\t\treturn cb.attr('data-' + key, value);\n\t\t\t}\n\t\t};\n\t\t// Get/Set form element values\n\t\tcb.val = function (value) {\n\t\t\tvar values, i, j;\n\t\t\tif (typeof value != 'undefined') { // FIXED A BUG HERE\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tswitch (elm.nodeName) {\n\t\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\t\t\t\tvalue = [value];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (i = 0; i < elm.length; i += 1) {\n\t\t\t\t\t\t\t\t// Multiple select\n\t\t\t\t\t\t\t\tfor (j = 0; j < value.length; j += 1) {\n\t\t\t\t\t\t\t\t\telm[i].selected = '';\n\t\t\t\t\t\t\t\t\tif (elm[i].value === \"\"+value[j]) {\n\t\t\t\t\t\t\t\t\t\telm[i].selected = 'selected';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\t\telm.value = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\tswitch (nodes[0].nodeName) {\n\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\tvalues = [];\n\t\t\t\t\t\tfor (i = 0; i < nodes[0].length; i += 1) {\n\t\t\t\t\t\t\tif (nodes[0][i].selected) {\n\t\t\t\t\t\t\t\tvalues.push(nodes[0][i].value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (values.length > 1) ? values : values[0];\n\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\treturn nodes[0].value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Return matching checked checkbox or radios\n\t\tcb.checked = function (check) {\n\t\t\tif (typeof check === 'boolean') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tif (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) {\n\t\t\t\t\t\telm.checked = check;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) {\n\t\t\t\treturn (!!nodes[0].checked);\n\t\t\t}\n\t\t};\n\t\t// Add event handler\n\t\tcb.on = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.addEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions)\n\t\t\t\t\telm[event + fn] = function () {\n\t\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t\t};\n\t\t\t\t\telm.attachEvent('on' + event, elm[event + fn]);\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove event handler\n\t\tcb.off = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.removeEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\telm.detachEvent('on' + event, elm[event + fn]);\n\t\t\t\t\t// Tidy up\n\t\t\t\t\telm[event + fn] = null;\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\treturn cb;\n\t}\n\n\t// Basic XHR\n\tchibi.ajax = function (options) { // if options is a number, it's timeout in ms\n\t\tvar opts = extend({\n\t\t\tmethod: 'GET',\n\t\t\tnocache: true,\n\t\t\ttimeout: 5000,\n\t\t\tloader: true,\n\t\t\tcallback: null\n\t\t}, options);\n\t\topts.method = opts.method.toUpperCase();\n\n\t\tvar loaderFn = opts.loader ? chibi._loader : function(){};\n\t\tvar url = opts.url;\n\t\tvar method = opts.method;\n\t\tvar query = null;\n\n\t\tif (opts.data) {\n\t\t\tquery = serializeData(opts.data);\n\t\t}\n\n\t\tif (query && (method === 'GET')) {\n\t\t\turl += (url.indexOf('?') === -1) ? '?' + query : '&' + query;\n\t\t\tquery = null;\n\t\t}\n\n\t\tvar xhr = new XMLHttpRequest();\n\n\t\t// prevent caching\n\t\tif (opts.nocache) {\n\t\t\tvar ts = (+(new Date())).toString(36);\n\t\t\turl += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts;\n\t\t}\n\n\t\tloaderFn(true);\n\n\t\txhr.open(method, url, true);\n\t\txhr.timeout = opts.timeout;\n\n\t\t// Abort after given timeout\n\t\tvar abortTmeo = setTimeout(function () {\n\t\t\tconsole.error(\"XHR timed out.\");\n\t\t\txhr.abort();\n\t\t\tloaderFn(false);\n\t\t}, opts.timeout + 10);\n\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tloaderFn(false);\n\n\t\t\t\topts.callback && opts.callback(xhr.responseText, xhr.status);\n\n\t\t\t\tclearTimeout(abortTmeo);\n\t\t\t}\n\t\t};\n\n\t\txhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\tif (method === 'POST') {\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t}\n\n\t\txhr.send(query);\n\t\treturn xhr;\n\t};\n\n\tchibi._loader = function(){};\n\n\t// Alias to cb.ajax(url, 'get', callback)\n\tchibi.get = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'GET';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Alias to cb.ajax(url, 'post', callback)\n\tchibi.post = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'POST';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Fire on DOM ready\n\tchibi.ready = function (fn) {\n\t\tif (fn) {\n\t\t\tif (domready) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\treadyfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\t// Fire on page loaded\n\tchibi.loaded = function (fn) {\n\t\tif (fn) {\n\t\t\tif (pageloaded) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\tloadedfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar entityMap = {\n\t\t'&': '&',\n\t\t'<': '<',\n\t\t'>': '>',\n\t\t'\"': '"',\n\t\t\"'\": ''',\n\t\t'/': '/',\n\t\t'`': '`',\n\t\t'=': '='\n\t};\n\n\tchibi.htmlEscape = function(string) {\n\t\treturn String(string).replace(/[&<>\"'`=\\/]/g, function (s) {\n\t\t\treturn entityMap[s];\n\t\t});\n\t};\n\n\t// Set Chibi's global namespace here ($)\n\tw.$ = chibi;\n}());\n","// keymaster.js\n// (c) 2011-2013 Thomas Fuchs\n// keymaster.js may be freely distributed under the MIT license.\n\n;(function(global){\n var k,\n _handlers = {},\n _mods = { 16: false, 18: false, 17: false, 91: false },\n _scope = 'all',\n // modifier keys\n _MODIFIERS = {\n '⇧': 16, shift: 16,\n '⌥': 18, alt: 18, option: 18,\n '⌃': 17, ctrl: 17, control: 17,\n '⌘': 91, command: 91\n },\n // special keys\n _MAP = {\n backspace: 8, tab: 9, clear: 12,\n enter: 13, 'return': 13,\n esc: 27, escape: 27, space: 32,\n left: 37, up: 38,\n right: 39, down: 40,\n del: 46, 'delete': 46,\n home: 36, end: 35,\n pageup: 33, pagedown: 34,\n ',': 188, '.': 190, '/': 191,\n '`': 192, '-': 189, '=': 187,\n ';': 186, '\\'': 222,\n '[': 219, ']': 221, '\\\\': 220,\n // added:\n insert: 45,\n np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101,\n\t np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106,\n\t np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144,\n },\n code = function(x){\n return _MAP[x] || x.toUpperCase().charCodeAt(0);\n },\n _downKeys = [];\n\n for(k=1;k<20;k++) _MAP['f'+k] = 111+k;\n\n // IE doesn't support Array#indexOf, so have a simple replacement\n function index(array, item){\n var i = array.length;\n while(i--) if(array[i]===item) return i;\n return -1;\n }\n\n // for comparing mods before unassignment\n function compareArray(a1, a2) {\n if (a1.length != a2.length) return false;\n for (var i = 0; i < a1.length; i++) {\n if (a1[i] !== a2[i]) return false;\n }\n return true;\n }\n\n var modifierMap = {\n 16:'shiftKey',\n 18:'altKey',\n 17:'ctrlKey',\n 91:'metaKey'\n };\n function updateModifierKey(event) {\n for(k in _mods) _mods[k] = event[modifierMap[k]];\n };\n\n function isModifierPressed(mod) {\n if (mod=='control'||mod=='ctrl') return _mods[17];\n\tif (mod=='shift') return _mods[16];\n\tif (mod=='meta') return _mods[91];\n\tif (mod=='alt') return _mods[18];\n\treturn false;\n }\n\n // handle keydown event\n function dispatch(event) {\n var key, handler, k, i, modifiersMatch, scope;\n key = event.keyCode;\n\n if (index(_downKeys, key) == -1) {\n _downKeys.push(key);\n }\n\n // if a modifier key, set the key. property to true and return\n if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko\n if(key in _mods) {\n _mods[key] = true;\n // 'assignKey' from inside this closure is exported to window.key\n for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true;\n return;\n }\n updateModifierKey(event);\n\n // see if we need to ignore the keypress (filter() can can be overridden)\n // by default ignore key presses if a select, textarea, or input is focused\n if(!assignKey.filter.call(this, event)) return;\n\n // abort if no potentially matching shortcuts found\n if (!(key in _handlers)) return;\n\n scope = getScope();\n\n // for each potential shortcut\n for (i = 0; i < _handlers[key].length; i++) {\n handler = _handlers[key][i];\n\n // see if it's in the current scope\n if(handler.scope == scope || handler.scope == 'all'){\n // check if modifiers match if any\n modifiersMatch = handler.mods.length > 0;\n for(k in _mods)\n if((!_mods[k] && index(handler.mods, +k) > -1) ||\n (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false;\n // call the handler and stop the event if neccessary\n if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){\n if(handler.method(event, handler)===false){\n if(event.preventDefault) event.preventDefault();\n else event.returnValue = false;\n if(event.stopPropagation) event.stopPropagation();\n if(event.cancelBubble) event.cancelBubble = true;\n }\n }\n }\n }\n };\n\n // unset modifier keys on keyup\n function clearModifier(event){\n var key = event.keyCode, k,\n i = index(_downKeys, key);\n\n // remove key from _downKeys\n if (i >= 0) {\n _downKeys.splice(i, 1);\n }\n\n if(key == 93 || key == 224) key = 91;\n if(key in _mods) {\n _mods[key] = false;\n for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false;\n }\n };\n\n function resetModifiers() {\n for(k in _mods) _mods[k] = false;\n for(k in _MODIFIERS) assignKey[k] = false;\n };\n\n // parse and assign shortcut\n function assignKey(key, scope, method){\n var keys, mods;\n keys = getKeys(key);\n if (method === undefined) {\n method = scope;\n scope = 'all';\n }\n\n // for each shortcut\n for (var i = 0; i < keys.length; i++) {\n // set modifier keys if any\n mods = [];\n key = keys[i].split('+');\n if (key.length > 1){\n mods = getMods(key);\n key = [key[key.length-1]];\n }\n // convert to keycode and...\n key = key[0]\n key = code(key);\n // ...store handler\n if (!(key in _handlers)) _handlers[key] = [];\n _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods });\n }\n };\n\n // unbind all handlers for given key in current scope\n function unbindKey(key, scope) {\n var multipleKeys, keys,\n mods = [],\n i, j, obj;\n\n multipleKeys = getKeys(key);\n\n for (j = 0; j < multipleKeys.length; j++) {\n keys = multipleKeys[j].split('+');\n\n if (keys.length > 1) {\n mods = getMods(keys);\n }\n\n key = keys[keys.length - 1];\n key = code(key);\n\n if (scope === undefined) {\n scope = getScope();\n }\n if (!_handlers[key]) {\n return;\n }\n for (i = 0; i < _handlers[key].length; i++) {\n obj = _handlers[key][i];\n // only clear handlers if correct scope and mods match\n if (obj.scope === scope && compareArray(obj.mods, mods)) {\n _handlers[key][i] = {};\n }\n }\n }\n };\n\n // Returns true if the key with code 'keyCode' is currently down\n // Converts strings into key codes.\n function isPressed(keyCode) {\n if (typeof(keyCode)=='string') {\n keyCode = code(keyCode);\n }\n return index(_downKeys, keyCode) != -1;\n }\n\n function getPressedKeyCodes() {\n return _downKeys.slice(0);\n }\n\n function filter(event){\n var tagName = (event.target || event.srcElement).tagName;\n // ignore keypressed in any elements that support keyboard data input\n return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');\n }\n\n // initialize key. to false\n for(k in _MODIFIERS) assignKey[k] = false;\n\n // set current scope (default 'all')\n function setScope(scope){ _scope = scope || 'all' };\n function getScope(){ return _scope || 'all' };\n\n // delete all handlers for a given scope\n function deleteScope(scope){\n var key, handlers, i;\n\n for (key in _handlers) {\n handlers = _handlers[key];\n for (i = 0; i < handlers.length; ) {\n if (handlers[i].scope === scope) handlers.splice(i, 1);\n else i++;\n }\n }\n };\n\n // abstract key logic for assign and unassign\n function getKeys(key) {\n var keys;\n key = key.replace(/\\s/g, '');\n keys = key.split(',');\n if ((keys[keys.length - 1]) == '') {\n keys[keys.length - 2] += ',';\n }\n return keys;\n }\n\n // abstract mods logic for assign and unassign\n function getMods(key) {\n var mods = key.slice(0, key.length - 1);\n for (var mi = 0; mi < mods.length; mi++)\n mods[mi] = _MODIFIERS[mods[mi]];\n return mods;\n }\n\n // cross-browser events\n function addEvent(object, event, method) {\n if (object.addEventListener)\n object.addEventListener(event, method, false);\n else if(object.attachEvent)\n object.attachEvent('on'+event, function(){ method(window.event) });\n };\n\n // set the handlers globally on document\n addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48\n addEvent(document, 'keyup', clearModifier);\n\n // reset modifiers to false whenever the window is (re)focused.\n addEvent(window, 'focus', resetModifiers);\n\n // store previously defined key\n var previousKey = global.key;\n\n // restore previously defined key and return reference to our key object\n function noConflict() {\n var k = global.key;\n global.key = previousKey;\n return k;\n }\n\n // set window.key and window.key.set/get/deleteScope, and the default filter\n global.key = assignKey;\n global.key.setScope = setScope;\n global.key.getScope = getScope;\n global.key.deleteScope = deleteScope;\n global.key.filter = filter;\n global.key.isPressed = isPressed;\n global.key.isModifier = isModifierPressed;\n global.key.getPressedKeyCodes = getPressedKeyCodes;\n global.key.noConflict = noConflict;\n global.key.unbind = unbindKey;\n\n if(typeof module !== 'undefined') module.exports = assignKey;\n\n})(window);\n\n","/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\nif (!String.fromCodePoint) {\n (function () {\n var defineProperty = (function () {\n // IE 8 only supports `Object.defineProperty` on DOM elements\n try {\n var object = {};\n var $defineProperty = Object.defineProperty;\n var result = $defineProperty(object, object, object) && $defineProperty;\n } catch (error) {\n }\n return result;\n }());\n var stringFromCharCode = String.fromCharCode;\n var floor = Math.floor;\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000;\n var codeUnits = [];\n var highSurrogate;\n var lowSurrogate;\n var index = -1;\n var length = arguments.length;\n if (!length) {\n return '';\n }\n var result = '';\n while (++index < length) {\n var codePoint = Number(arguments[index]);\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) != codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint);\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint);\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n highSurrogate = (codePoint >> 10) + 0xD800;\n lowSurrogate = (codePoint % 0x400) + 0xDC00;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 == length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n if (defineProperty) {\n defineProperty(String, 'fromCodePoint', {\n 'value': fromCodePoint,\n 'configurable': true,\n 'writable': true\n });\n } else {\n String.fromCodePoint = fromCodePoint;\n }\n }());\n}\n","/** Make a node */\nfunction mk (e) {\n return document.createElement(e)\n}\n\n/** Find one by query */\nfunction qs (s) {\n return document.querySelector(s)\n}\n\n/** Find all by query */\nfunction qsa (s) {\n return document.querySelectorAll(s)\n}\n\n/** Convert any to bool safely */\nfunction bool (x) {\n return (x === 1 || x === '1' || x === true || x === 'true')\n}\n\n/**\n * Filter 'spacebar' and 'return' from keypress handler,\n * and when they're pressed, fire the callback.\n * use $(...).on('keypress', cr(handler))\n */\nfunction cr (hdl) {\n return function (e) {\n if (e.which === 10 || e.which === 13 || e.which === 32) {\n hdl()\n }\n }\n}\n\n/** Extend an objects with options */\nfunction extend (defaults, options) {\n let target = {}\n\n Object.keys(defaults).forEach(function (k) {\n target[k] = defaults[k]\n })\n\n Object.keys(options).forEach(function (k) {\n target[k] = options[k]\n })\n\n return target\n}\n\n/** Escape string for use as literal in RegExp */\nfunction rgxe (str) {\n return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&')\n}\n\n/** Format number to N decimal places, output as string */\nfunction numfmt (x, places) {\n const pow = Math.pow(10, places)\n return Math.round(x * pow) / pow\n}\n\n/** Get millisecond timestamp */\nfunction msNow () {\n return +(new Date())\n}\n\n/** Get ms elapsed since msNow() */\nfunction msElapsed (start) {\n return msNow() - start\n}\n\n/** Shim for log base 10 */\nMath.log10 = Math.log10 || function (x) {\n return Math.log(x) / Math.LN10\n}\n\n/** HTML escape */\nfunction esc (str) {\n return $.htmlEscape(str)\n}\n\n/** Check for undefined */\nfunction undef (x) {\n return typeof x == 'undefined'\n}\n\n/** Safe json parse */\nfunction jsp (str) {\n try {\n return JSON.parse(str)\n } catch (e) {\n console.error(e)\n return null\n }\n}\n\n/** Create a character from ASCII code */\nfunction Chr (n) {\n return String.fromCharCode(n)\n}\n\n/** Decode number from 2B encoding */\nfunction parse2B (s, i = 0) {\n return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127\n}\n\n/** Decode number from 3B encoding */\nfunction parse3B (s, i = 0) {\n return (s.charCodeAt(i) - 1) + (s.charCodeAt(i + 1) - 1) * 127 + (s.charCodeAt(i + 2) - 1) * 127 * 127\n}\n\n/** Encode using 2B encoding, returns string. */\nfunction encode2B (n) {\n let lsb, msb\n lsb = (n % 127)\n n = ((n - lsb) / 127)\n lsb += 1\n msb = (n + 1)\n return Chr(lsb) + Chr(msb)\n}\n\n/** Encode using 3B encoding, returns string. */\nfunction encode3B (n) {\n let lsb, msb, xsb\n lsb = (n % 127)\n n = (n - lsb) / 127\n lsb += 1\n msb = (n % 127)\n n = (n - msb) / 127\n msb += 1\n xsb = (n + 1)\n return Chr(lsb) + Chr(msb) + Chr(xsb)\n}\n","/** Module for toggling a modal overlay */\n(function () {\n let modal = {}\n let curCloseCb = null\n\n modal.show = function (sel, closeCb) {\n let $m = $(sel)\n $m.removeClass('hidden visible')\n setTimeout(function () {\n $m.addClass('visible')\n }, 1)\n curCloseCb = closeCb\n }\n\n modal.hide = function (sel) {\n let $m = $(sel)\n $m.removeClass('visible')\n setTimeout(function () {\n $m.addClass('hidden')\n if (curCloseCb) curCloseCb()\n }, 500) // transition time\n }\n\n modal.init = function () {\n // close modal by click outside the dialog\n $('.Modal').on('click', function () {\n if ($(this).hasClass('no-close')) return // this is a no-close modal\n modal.hide(this)\n })\n\n $('.Dialog').on('click', function (e) {\n e.stopImmediatePropagation()\n })\n\n // Hide all modals on esc\n $(window).on('keydown', function (e) {\n if (e.which === 27) {\n modal.hide('.Modal')\n }\n })\n }\n\n window.Modal = modal\n})()\n","window.Notify = (function () {\n let nt = {}\n const sel = '#notif'\n\n let hideTmeo1 // timeout to start hiding (transition)\n let hideTmeo2 // timeout to add the hidden class\n\n nt.show = function (message, timeout) {\n $(sel).html(message)\n Modal.show(sel)\n\n clearTimeout(hideTmeo1)\n clearTimeout(hideTmeo2)\n\n if (undef(timeout)) timeout = 2500\n\n hideTmeo1 = setTimeout(nt.hide, timeout)\n }\n\n nt.hide = function () {\n let $m = $(sel)\n $m.removeClass('visible')\n hideTmeo2 = setTimeout(function () {\n $m.addClass('hidden')\n }, 250) // transition time\n }\n\n nt.init = function () {\n $(sel).on('click', function () {\n nt.hide(this)\n })\n }\n\n return nt\n})()\n","/** Global generic init */\n$.ready(function () {\n // Checkbox UI (checkbox CSS and hidden input with int value)\n $('.Row.checkbox').forEach(function (x) {\n let inp = x.querySelector('input')\n let box = x.querySelector('.box')\n\n $(box).toggleClass('checked', inp.value)\n\n let hdl = function () {\n inp.value = 1 - inp.value\n $(box).toggleClass('checked', inp.value)\n }\n\n $(x).on('click', hdl).on('keypress', cr(hdl))\n })\n\n // Expanding boxes on mobile\n $('.Box.mobcol,.Box.fold').forEach(function (x) {\n let h = x.querySelector('h2')\n\n let hdl = function () {\n $(x).toggleClass('expanded')\n }\n $(h).on('click', hdl).on('keypress', cr(hdl))\n })\n\n $('form').forEach(function (x) {\n $(x).on('keypress', function (e) {\n if ((e.keyCode === 10 || e.keyCode === 13) && e.ctrlKey) {\n x.submit()\n }\n })\n })\n\n // loader dots...\n setInterval(function () {\n $('.anim-dots').each(function (x) {\n let $x = $(x)\n let dots = $x.html() + '.'\n if (dots.length === 5) dots = '.'\n $x.html(dots)\n })\n }, 1000)\n\n // flipping number boxes with the mouse wheel\n $('input[type=number]').on('mousewheel', function (e) {\n let $this = $(this)\n let val = +$this.val()\n if (isNaN(val)) val = 1\n\n const step = +($this.attr('step') || 1)\n const min = +$this.attr('min')\n const max = +$this.attr('max')\n if (e.wheelDelta > 0) {\n val += step\n } else {\n val -= step\n }\n\n if (undef(min)) val = Math.max(val, +min)\n if (undef(max)) val = Math.min(val, +max)\n $this.val(val)\n\n if ('createEvent' in document) {\n let evt = document.createEvent('HTMLEvents')\n evt.initEvent('change', false, true)\n $this[0].dispatchEvent(evt)\n } else {\n $this[0].fireEvent('onchange')\n }\n\n e.preventDefault()\n })\n\n // populate the form errors box from GET arg ?err=...\n // (a way to pass errors back from server via redirect)\n let errAt = location.search.indexOf('err=')\n if (errAt !== -1 && qs('.Box.errors')) {\n let errs = location.search.substr(errAt + 4).split(',')\n let hres = []\n errs.forEach(function (er) {\n let lbl = qs('label[for=\"' + er + '\"]')\n if (lbl) {\n lbl.classList.add('error')\n hres.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, ''))\n } else {\n hres.push(er)\n }\n })\n\n qs('.Box.errors .list').innerHTML = hres.join(', ')\n qs('.Box.errors').classList.remove('hidden')\n }\n\n Modal.init()\n Notify.init()\n\n // remove tabindixes from h2 if wide\n if (window.innerWidth > 550) {\n $('.Box h2').forEach(function (x) {\n x.removeAttribute('tabindex')\n })\n\n // brand works as a link back to term in widescreen mode\n let br = qs('#brand')\n br && br.addEventListener('click', function () {\n location.href = '/' // go to terminal\n })\n }\n})\n\n// setup the ajax loader\n$._loader = function (vis) {\n $('#loader').toggleClass('show', vis)\n}\n\n// reveal content on load\nfunction showPage () {\n $('#content').addClass('load')\n}\n\n// Auto reveal pages other than the terminal (sets window.noAutoShow)\n$.ready(function () {\n if (window.noAutoShow !== true) {\n setTimeout(function () {\n showPage()\n }, 1)\n }\n})\n","// Generated from PHP locale file\nlet _tr = {\n \"wifi.connected_ip_is\": \"Connected, IP is \",\n \"wifi.not_conn\": \"Not connected.\",\n \"wifi.enter_passwd\": \"Enter password for \\\":ssid:\\\"\"\n};\n\nfunction tr (key) { return _tr[key] || '?' + key + '?' }\n","(function (w) {\n const authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']\n let curSSID\n\n // Get XX % for a slider input\n function rangePt (inp) {\n return Math.round(((inp.value / inp.max) * 100)) + '%'\n }\n\n // Display selected STA SSID etc\n function selectSta (name, password, ip) {\n $('#sta_ssid').val(name)\n $('#sta_password').val(password)\n\n $('#sta-nw').toggleClass('hidden', name.length === 0)\n $('#sta-nw-nil').toggleClass('hidden', name.length > 0)\n\n $('#sta-nw .essid').html(esc(name))\n const nopw = undef(password) || password.length === 0\n $('#sta-nw .passwd').toggleClass('hidden', nopw)\n $('#sta-nw .nopasswd').toggleClass('hidden', !nopw)\n $('#sta-nw .ip').html(ip.length > 0 ? tr('wifi.connected_ip_is') + ip : tr('wifi.not_conn'))\n }\n\n /** Update display for received response */\n function onScan (resp, status) {\n // var ap_json = {\n // \"result\": {\n // \"inProgress\": \"0\",\n // \"APs\": [\n // {\"essid\": \"Chlivek\", \"bssid\": \"88:f7:c7:52:b3:99\", \"rssi\": \"204\", \"enc\": \"4\", \"channel\": \"1\"},\n // {\"essid\": \"TyNikdy\", \"bssid\": \"5c:f4:ab:0d:f1:1b\", \"rssi\": \"164\", \"enc\": \"3\", \"channel\": \"1\"},\n // ]\n // }\n // };\n\n if (status !== 200) {\n // bad response\n rescan(5000) // wait 5sm then retry\n return\n }\n\n try {\n resp = JSON.parse(resp)\n } catch (e) {\n console.log(e)\n rescan(5000)\n return\n }\n\n const done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0)\n rescan(done ? 15000 : 1000)\n if (!done) return // no redraw yet\n\n // clear the AP list\n let $list = $('#ap-list')\n // remove old APs\n $('#ap-list .AP').remove()\n\n $list.toggleClass('hidden', !done)\n $('#ap-loader').toggleClass('hidden', done)\n\n // scan done\n resp.result.APs.sort(function (a, b) {\n return b.rssi - a.rssi\n }).forEach(function (ap) {\n ap.enc = parseInt(ap.enc)\n\n if (ap.enc > 4) return // hide unsupported auths\n\n let item = mk('div')\n\n let $item = $(item)\n .data('ssid', ap.essid)\n .data('pwd', ap.enc)\n .attr('tabindex', 0)\n .addClass('AP')\n\n // mark current SSID\n if (ap.essid === curSSID) {\n $item.addClass('selected')\n }\n\n let inner = mk('div')\n let escapedSSID = $.htmlEscape(ap.essid)\n $(inner).addClass('inner')\n .htmlAppend(`
${ap.rssi_perc}
`)\n .htmlAppend(`
${escapedSSID}
`)\n .htmlAppend(`
${authStr[ap.enc]}
`)\n\n $item.on('click', function () {\n let $th = $(this)\n\n const conn_ssid = $th.data('ssid')\n let conn_pass = ''\n\n if (+$th.data('pwd')) {\n // this AP needs a password\n conn_pass = prompt(tr('wifi.enter_passwd').replace(':ssid:', conn_ssid))\n if (!conn_pass) return\n }\n\n $('#sta_password').val(conn_pass)\n $('#sta_ssid').val(conn_ssid)\n selectSta(conn_ssid, conn_pass, '')\n })\n\n item.appendChild(inner)\n $list[0].appendChild(item)\n })\n }\n\n function startScanning () {\n $('#ap-loader').removeClass('hidden')\n $('#ap-scan').addClass('hidden')\n $('#ap-loader .anim-dots').html('.')\n\n scanAPs()\n }\n\n /** Ask the CGI what APs are visible (async) */\n function scanAPs () {\n if (_demo) {\n onScan(_demo_aps, 200)\n } else {\n $.get('http://' + _root + '/cfg/wifi/scan', onScan)\n }\n }\n\n function rescan (time) {\n setTimeout(scanAPs, time)\n }\n\n /** Set up the WiFi page */\n function wifiInit (cfg) {\n // Update slider value displays\n $('.Row.range').forEach(function (x) {\n let inp = x.querySelector('input')\n let disp1 = x.querySelector('.x-disp1')\n let disp2 = x.querySelector('.x-disp2')\n let t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n $(inp).on('input', function () {\n t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n })\n })\n\n // Forget STA credentials\n $('#forget-sta').on('click', function () {\n selectSta('', '', '')\n return false\n })\n\n selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip)\n curSSID = cfg.sta_active_ssid\n }\n\n w.init = wifiInit\n w.startScanning = startScanning\n})(window.WiFi = {})\n","/** Handle connections */\nwindow.Conn = (function () {\n let ws\n let heartbeatTout\n let pingIv\n let xoff = false\n let autoXoffTout\n let reconTout\n\n let pageShown = false\n\n function onOpen (evt) {\n console.log('CONNECTED')\n heartbeat()\n doSend('i')\n }\n\n function onClose (evt) {\n console.warn('SOCKET CLOSED, code ' + evt.code + '. Reconnecting...')\n clearTimeout(reconTout)\n reconTout = setTimeout(function () {\n init()\n }, 2000)\n // this happens when the buffer gets fucked up via invalid unicode.\n // we basically use polling instead of socket then\n }\n\n function onMessage (evt) {\n try {\n // . = heartbeat\n switch (evt.data.charAt(0)) {\n case '.':\n // heartbeat, no-op message\n break\n\n case '-':\n // console.log('xoff');\n xoff = true\n autoXoffTout = setTimeout(function () {\n xoff = false\n }, 250)\n break\n\n case '+':\n // console.log('xon');\n xoff = false\n clearTimeout(autoXoffTout)\n break\n\n default:\n Screen.load(evt.data)\n if (!pageShown) {\n showPage()\n pageShown = true\n }\n break\n }\n heartbeat()\n } catch (e) {\n console.error(e)\n }\n }\n\n function canSend () {\n return !xoff\n }\n\n function doSend (message) {\n if (_demo) {\n console.log('TX: ', message)\n return true // Simulate success\n }\n if (xoff) {\n // TODO queue\n console.log(\"Can't send, flood control.\")\n return false\n }\n\n if (!ws) return false // for dry testing\n if (ws.readyState !== 1) {\n console.error('Socket not ready')\n return false\n }\n if (typeof message != 'string') {\n message = JSON.stringify(message)\n }\n ws.send(message)\n return true\n }\n\n function init () {\n if (_demo) {\n console.log('Demo mode!')\n Screen.load(_demo_screen)\n showPage()\n return\n }\n\n clearTimeout(reconTout)\n clearTimeout(heartbeatTout)\n\n ws = new WebSocket('ws://' + _root + '/term/update.ws')\n ws.onopen = onOpen\n ws.onclose = onClose\n ws.onmessage = onMessage\n console.log('Opening socket.')\n heartbeat()\n }\n\n function heartbeat () {\n clearTimeout(heartbeatTout)\n heartbeatTout = setTimeout(heartbeatFail, 2000)\n }\n\n function heartbeatFail () {\n console.error('Heartbeat lost, probing server...')\n pingIv = setInterval(function () {\n console.log('> ping')\n $.get('http://' + _root + '/system/ping', function (resp, status) {\n if (status === 200) {\n clearInterval(pingIv)\n console.info('Server ready, reloading page...')\n location.reload()\n }\n }, {\n timeout: 100\n })\n }, 1000)\n }\n\n return {\n ws: null,\n init: init,\n send: doSend,\n canSend: canSend // check flood control\n }\n})()\n","/**\n * User input\n *\n * --- Rx messages: ---\n * S - screen content (binary encoding of the entire screen with simple compression)\n * T - text labels - Title and buttons, \\0x01-separated\n * B - beep\n * . - heartbeat\n *\n * --- Tx messages ---\n * s - string\n * b - action button\n * p - mb press\n * r - mb release\n * m - mouse move\n */\nwindow.Input = (function () {\n let opts = {\n np_alt: false,\n cu_alt: false,\n fn_alt: false,\n mt_click: false,\n mt_move: false,\n no_keys: false,\n crlf_mode: false\n }\n\n /** Send a literal message */\n function sendStrMsg (str) {\n return Conn.send('s' + str)\n }\n\n /** Send a button event */\n function sendBtnMsg (n) {\n Conn.send('b' + Chr(n))\n }\n\n /** Fn alt choice for key message */\n function fa (alt, normal) {\n return opts.fn_alt ? alt : normal\n }\n\n /** Cursor alt choice for key message */\n function ca (alt, normal) {\n return opts.cu_alt ? alt : normal\n }\n\n /** Numpad alt choice for key message */\n function na (alt, normal) {\n return opts.np_alt ? alt : normal\n }\n\n function _bindFnKeys () {\n const keymap = {\n 'tab': '\\x09',\n 'backspace': '\\x08',\n 'enter': opts.crlf_mode ? '\\x0d\\x0a' : '\\x0d',\n 'ctrl+enter': '\\x0a',\n 'esc': '\\x1b',\n 'up': ca('\\x1bOA', '\\x1b[A'),\n 'down': ca('\\x1bOB', '\\x1b[B'),\n 'right': ca('\\x1bOC', '\\x1b[C'),\n 'left': ca('\\x1bOD', '\\x1b[D'),\n 'home': ca('\\x1bOH', fa('\\x1b[H', '\\x1b[1~')),\n 'insert': '\\x1b[2~',\n 'delete': '\\x1b[3~',\n 'end': ca('\\x1bOF', fa('\\x1b[F', '\\x1b[4~')),\n 'pageup': '\\x1b[5~',\n 'pagedown': '\\x1b[6~',\n 'f1': fa('\\x1bOP', '\\x1b[11~'),\n 'f2': fa('\\x1bOQ', '\\x1b[12~'),\n 'f3': fa('\\x1bOR', '\\x1b[13~'),\n 'f4': fa('\\x1bOS', '\\x1b[14~'),\n 'f5': '\\x1b[15~', // note the disconnect\n 'f6': '\\x1b[17~',\n 'f7': '\\x1b[18~',\n 'f8': '\\x1b[19~',\n 'f9': '\\x1b[20~',\n 'f10': '\\x1b[21~', // note the disconnect\n 'f11': '\\x1b[23~',\n 'f12': '\\x1b[24~',\n 'shift+f1': fa('\\x1bO1;2P', '\\x1b[25~'),\n 'shift+f2': fa('\\x1bO1;2Q', '\\x1b[26~'), // note the disconnect\n 'shift+f3': fa('\\x1bO1;2R', '\\x1b[28~'),\n 'shift+f4': fa('\\x1bO1;2S', '\\x1b[29~'), // note the disconnect\n 'shift+f5': fa('\\x1b[15;2~', '\\x1b[31~'),\n 'shift+f6': fa('\\x1b[17;2~', '\\x1b[32~'),\n 'shift+f7': fa('\\x1b[18;2~', '\\x1b[33~'),\n 'shift+f8': fa('\\x1b[19;2~', '\\x1b[34~'),\n 'shift+f9': fa('\\x1b[20;2~', '\\x1b[35~'), // 35-38 are not standard - but what is?\n 'shift+f10': fa('\\x1b[21;2~', '\\x1b[36~'),\n 'shift+f11': fa('\\x1b[22;2~', '\\x1b[37~'),\n 'shift+f12': fa('\\x1b[23;2~', '\\x1b[38~'),\n 'np_0': na('\\x1bOp', '0'),\n 'np_1': na('\\x1bOq', '1'),\n 'np_2': na('\\x1bOr', '2'),\n 'np_3': na('\\x1bOs', '3'),\n 'np_4': na('\\x1bOt', '4'),\n 'np_5': na('\\x1bOu', '5'),\n 'np_6': na('\\x1bOv', '6'),\n 'np_7': na('\\x1bOw', '7'),\n 'np_8': na('\\x1bOx', '8'),\n 'np_9': na('\\x1bOy', '9'),\n 'np_mul': na('\\x1bOR', '*'),\n 'np_add': na('\\x1bOl', '+'),\n 'np_sub': na('\\x1bOS', '-'),\n 'np_point': na('\\x1bOn', '.'),\n 'np_div': na('\\x1bOQ', '/')\n // we don't implement numlock key (should change in numpad_alt mode, but it's even more useless than the rest)\n }\n\n for (let k in keymap) {\n if (keymap.hasOwnProperty(k)) {\n bind(k, keymap[k])\n }\n }\n }\n\n /** Bind a keystroke to message */\n function bind (combo, str) {\n // mac fix - allow also cmd\n if (combo.indexOf('ctrl+') !== -1) {\n combo += ',' + combo.replace('ctrl', 'command')\n }\n\n // unbind possible old binding\n key.unbind(combo)\n\n key(combo, function (e) {\n if (opts.no_keys) return\n e.preventDefault()\n sendStrMsg(str)\n })\n }\n\n /** Bind/rebind key messages */\n function _initKeys () {\n // This takes care of text characters typed\n window.addEventListener('keypress', function (evt) {\n if (opts.no_keys) return\n let str = ''\n if (evt.key) str = evt.key\n else if (evt.which) str = String.fromCodePoint(evt.which)\n if (str.length > 0 && str.charCodeAt(0) >= 32) {\n // console.log(\"Typed \", str);\n // prevent space from scrolling\n if (evt.which === 32) evt.preventDefault()\n sendStrMsg(str)\n }\n })\n\n // ctrl-letter codes are sent as simple low ASCII codes\n for (let i = 1; i <= 26; i++) {\n bind('ctrl+' + String.fromCharCode(96 + i), String.fromCharCode(i))\n }\n /* eslint-disable */\n bind('ctrl+]', '\\x1b') // alternate way to enter ESC\n bind('ctrl+\\\\', '\\x1c')\n bind('ctrl+[', '\\x1d')\n bind('ctrl+^', '\\x1e')\n bind('ctrl+_', '\\x1f')\n\n // extra ctrl-\n bind('ctrl+left', '\\x1f[1;5D')\n bind('ctrl+right', '\\x1f[1;5C')\n bind('ctrl+up', '\\x1f[1;5A')\n bind('ctrl+down', '\\x1f[1;5B')\n bind('ctrl+home', '\\x1f[1;5H')\n bind('ctrl+end', '\\x1f[1;5F')\n\n // extra shift-\n bind('shift+left', '\\x1f[1;2D')\n bind('shift+right', '\\x1f[1;2C')\n bind('shift+up', '\\x1f[1;2A')\n bind('shift+down', '\\x1f[1;2B')\n bind('shift+home', '\\x1f[1;2H')\n bind('shift+end', '\\x1f[1;2F')\n\n // macOS editing commands\n bind('⌥+left', '\\x1fb') // ⌥← to go back a word (^[b)\n bind('⌥+right', '\\x1ff') // ⌥→ to go forward one word (^[f)\n bind('⌘+left', '\\x01') // ⌘← to go to the beginning of a line (^A)\n bind('⌘+right', '\\x05') // ⌘→ to go to the end of a line (^E)\n bind('⌥+backspace', '\\x17') // ⌥⌫ to delete a word (^W, I think)\n bind('⌘+backspace', '\\x15') // ⌘⌫ to delete to the beginning of a line (possibly ^U)\n /* eslint-enable */\n\n _bindFnKeys()\n }\n\n // mouse button states\n let mb1 = 0\n let mb2 = 0\n let mb3 = 0\n\n /** Init the Input module */\n function init () {\n _initKeys()\n\n // Button presses\n $('#action-buttons button').forEach(function (s) {\n s.addEventListener('click', function () {\n sendBtnMsg(+this.dataset['n'])\n })\n })\n\n // global mouse state tracking - for motion reporting\n window.addEventListener('mousedown', function (evt) {\n if (evt.button === 0) mb1 = 1\n if (evt.button === 1) mb2 = 1\n if (evt.button === 2) mb3 = 1\n })\n\n window.addEventListener('mouseup', function (evt) {\n if (evt.button === 0) mb1 = 0\n if (evt.button === 1) mb2 = 0\n if (evt.button === 2) mb3 = 0\n })\n }\n\n /** Prepare modifiers byte for mouse message */\n function packModifiersForMouse () {\n return (key.isModifier('ctrl') ? 1 : 0) |\n (key.isModifier('shift') ? 2 : 0) |\n (key.isModifier('alt') ? 4 : 0) |\n (key.isModifier('meta') ? 8 : 0)\n }\n\n return {\n /** Init the Input module */\n init: init,\n\n /** Send a literal string message */\n sendString: sendStrMsg,\n\n /** Enable alternate key modes (cursors, numpad, fn) */\n setAlts: function (cu, np, fn, crlf) {\n if (opts.cu_alt !== cu || opts.np_alt !== np || opts.fn_alt !== fn || opts.crlf_mode !== crlf) {\n opts.cu_alt = cu\n opts.np_alt = np\n opts.fn_alt = fn\n opts.crlf_mode = crlf\n\n // rebind keys - codes have changed\n _bindFnKeys()\n }\n },\n\n setMouseMode: function (click, move) {\n opts.mt_click = click\n opts.mt_move = move\n },\n\n // Mouse events\n onMouseMove: function (x, y) {\n if (!opts.mt_move) return\n const b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0\n const m = packModifiersForMouse()\n Conn.send('m' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n },\n\n onMouseDown: function (x, y, b) {\n if (!opts.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n Conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseUp: function (x, y, b) {\n if (!opts.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n Conn.send('r' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseWheel: function (x, y, dir) {\n if (!opts.mt_click) return\n // -1 ... btn 4 (away from user)\n // +1 ... btn 5 (towards user)\n const m = packModifiersForMouse()\n const b = (dir < 0 ? 4 : 5)\n Conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n mouseTracksClicks: function () {\n return opts.mt_click\n },\n\n blockKeys: function (yes) {\n opts.no_keys = yes\n }\n }\n})()\n","// Some non-bold Fraktur symbols are outside the contiguous block\nconst frakturExceptions = {\n 'C': '\\u212d',\n 'H': '\\u210c',\n 'I': '\\u2111',\n 'R': '\\u211c',\n 'Z': '\\u2128'\n}\n\n// constants for decoding the update blob\nconst SEQ_REPEAT = 2\nconst SEQ_SET_COLORS = 3\nconst SEQ_SET_ATTRS = 4\nconst SEQ_SET_FG = 5\nconst SEQ_SET_BG = 6\n\nconst SELECTION_BG = '#b2d7fe'\nconst SELECTION_FG = '#333'\n\nconst themes = [\n [ // Tango\n '#111213', '#CC0000', '#4E9A06', '#C4A000', '#3465A4', '#75507B', '#06989A', '#D3D7CF',\n '#555753', '#EF2929', '#8AE234', '#FCE94F', '#729FCF', '#AD7FA8', '#34E2E2', '#EEEEEC'\n ],\n [ // Linux\n '#000000', '#aa0000', '#00aa00', '#aa5500', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa',\n '#555555', '#ff5555', '#55ff55', '#ffff55', '#5555ff', '#ff55ff', '#55ffff', '#ffffff'\n ],\n [ // xterm\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5',\n '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // rxvt\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000cd', '#cd00cd', '#00cdcd', '#faebd7',\n '#404040', '#ff0000', '#00ff00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // Ambience\n '#2e3436', '#cc0000', '#4e9a06', '#c4a000', '#3465a4', '#75507b', '#06989a', '#d3d7cf',\n '#555753', '#ef2929', '#8ae234', '#fce94f', '#729fcf', '#ad7fa8', '#34e2e2', '#eeeeec'\n ],\n [ // Solarized\n '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5',\n '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3'\n ]\n]\n\n// TODO move this to the initializer so it's not run on non-terminal pages\n\n// 256color lookup table\n// should not be used to look up 0-15 (will return transparent)\nconst colorTable256 = new Array(16).fill('rgba(0, 0, 0, 0)')\n\n// fill color table\n// colors 16-231 are a 6x6x6 color cube\nfor (let red = 0; red < 6; red++) {\n for (let green = 0; green < 6; green++) {\n for (let blue = 0; blue < 6; blue++) {\n let redValue = red * 40 + (red ? 55 : 0)\n let greenValue = green * 40 + (green ? 55 : 0)\n let blueValue = blue * 40 + (blue ? 55 : 0)\n colorTable256.push(`rgb(${redValue}, ${greenValue}, ${blueValue})`)\n }\n }\n}\n// colors 232-255 are a grayscale ramp, sans black and white\nfor (let gray = 0; gray < 24; gray++) {\n let value = gray * 10 + 8\n colorTable256.push(`rgb(${value}, ${value}, ${value})`)\n}\n\nclass TermScreen {\n constructor () {\n this.canvas = mk('canvas')\n this.ctx = this.canvas.getContext('2d')\n\n if ('AudioContext' in window || 'webkitAudioContext' in window) {\n this.audioCtx = new (window.AudioContext || window.webkitAudioContext)()\n } else {\n console.warn('No AudioContext!')\n }\n\n this.cursor = {\n x: 0,\n y: 0,\n fg: 7,\n bg: 0,\n attrs: 0,\n blinkOn: false,\n blinking: true,\n visible: true,\n hanging: false,\n style: 'block',\n blinkEnable: true,\n blinkInterval: 0\n }\n\n this._palette = null\n\n this._window = {\n width: 0,\n height: 0,\n devicePixelRatio: 1,\n fontFamily: '\"DejaVu Sans Mono\", \"Liberation Mono\", \"Inconsolata\", \"Menlo\", monospace',\n fontSize: 20,\n gridScaleX: 1.0,\n gridScaleY: 1.2,\n blinkStyleOn: true,\n blinkInterval: null,\n fitIntoWidth: 0,\n fitIntoHeight: 0,\n debug: false\n }\n\n // properties of this.window that require updating size and redrawing\n this.windowState = {\n width: 0,\n height: 0,\n devicePixelRatio: 0,\n gridScaleX: 0,\n gridScaleY: 0,\n fontFamily: '',\n fontSize: 0,\n fitIntoWidth: 0,\n fitIntoHeight: 0\n }\n\n // current selection\n this.selection = {\n // when false, this will prevent selection in favor of mouse events,\n // though alt can be held to override it\n selectable: true,\n\n start: [0, 0],\n end: [0, 0]\n }\n\n this.mouseMode = { clicks: false, movement: false }\n\n // event listeners\n this._listeners = {}\n\n const self = this\n this.window = new Proxy(this._window, {\n set (target, key, value, receiver) {\n target[key] = value\n self.scheduleSizeUpdate()\n self.scheduleDraw(`window:${key}=${value}`)\n return true\n }\n })\n\n this.blinkingCellCount = 0\n\n this.screen = []\n this.screenFG = []\n this.screenBG = []\n this.screenAttrs = []\n\n // used to determine if a cell should be redrawn\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n\n this.resetBlink()\n this.resetCursorBlink()\n\n let selecting = false\n\n let selectStart = (x, y) => {\n if (selecting) return\n selecting = true\n this.selection.start = this.selection.end = this.screenToGrid(x, y)\n this.scheduleDraw('select-start')\n }\n\n let selectMove = (x, y) => {\n if (!selecting) return\n this.selection.end = this.screenToGrid(x, y)\n this.scheduleDraw('select-move')\n }\n\n let selectEnd = (x, y) => {\n if (!selecting) return\n selecting = false\n this.selection.end = this.screenToGrid(x, y)\n this.scheduleDraw('select-end')\n Object.assign(this.selection, this.getNormalizedSelection())\n }\n\n this.canvas.addEventListener('mousedown', e => {\n if ((this.selection.selectable || e.altKey) && e.button === 0) {\n selectStart(e.offsetX, e.offsetY)\n } else {\n Input.onMouseDown(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n window.addEventListener('mousemove', e => {\n selectMove(e.offsetX, e.offsetY)\n })\n\n window.addEventListener('mouseup', e => {\n selectEnd(e.offsetX, e.offsetY)\n })\n\n let touchPosition = null\n let touchDownTime = 0\n let touchSelectMinTime = 500\n let touchDidMove = false\n\n let getTouchPositionOffset = touch => {\n let rect = this.canvas.getBoundingClientRect()\n return [touch.clientX - rect.left, touch.clientY - rect.top]\n }\n\n this.canvas.addEventListener('touchstart', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n touchDidMove = false\n touchDownTime = Date.now()\n })\n\n this.canvas.addEventListener('touchmove', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n\n if (!selecting && touchDidMove === false) {\n if (touchDownTime < Date.now() - touchSelectMinTime) {\n selectStart(...touchPosition)\n }\n } else if (selecting) {\n e.preventDefault()\n selectMove(...touchPosition)\n }\n\n touchDidMove = true\n })\n\n this.canvas.addEventListener('touchend', e => {\n if (e.touches[0]) {\n touchPosition = getTouchPositionOffset(e.touches[0])\n }\n\n if (selecting) {\n e.preventDefault()\n selectEnd(...touchPosition)\n\n let touchSelectMenu = qs('#touch-select-menu')\n touchSelectMenu.classList.add('open')\n let rect = touchSelectMenu.getBoundingClientRect()\n\n // use middle position for x and one line above for y\n let selectionPos = this.gridToScreen(\n (this.selection.start[0] + this.selection.end[0]) / 2,\n this.selection.start[1] - 1\n )\n selectionPos[0] -= rect.width / 2\n selectionPos[1] -= rect.height / 2\n touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${\n selectionPos[1]}px)`\n }\n\n if (!touchDidMove) {\n this.emit('tap', Object.assign(e, {\n x: touchPosition[0],\n y: touchPosition[1]\n }))\n }\n\n touchPosition = null\n })\n\n this.on('tap', e => {\n if (this.selection.start[0] !== this.selection.end[0] ||\n this.selection.start[1] !== this.selection.end[1]) {\n // selection is not empty\n // reset selection\n this.selection.start = this.selection.end = [0, 0]\n qs('#touch-select-menu').classList.remove('open')\n this.scheduleDraw('select-reset')\n } else {\n e.preventDefault()\n this.emit('open-soft-keyboard')\n }\n })\n\n $.ready(() => {\n let copyButton = qs('#touch-select-copy-btn')\n if (copyButton) {\n copyButton.addEventListener('click', () => {\n this.copySelectionToClipboard()\n })\n }\n })\n\n this.canvas.addEventListener('mousemove', e => {\n if (!selecting) {\n Input.onMouseMove(...this.screenToGrid(e.offsetX, e.offsetY))\n }\n })\n\n this.canvas.addEventListener('mouseup', e => {\n if (!selecting) {\n Input.onMouseUp(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n this.canvas.addEventListener('wheel', e => {\n if (this.mouseMode.clicks) {\n Input.onMouseWheel(...this.screenToGrid(e.offsetX, e.offsetY),\n e.deltaY > 0 ? 1 : -1)\n\n // prevent page scrolling\n e.preventDefault()\n }\n })\n\n this.canvas.addEventListener('contextmenu', e => {\n if (this.mouseMode.clicks) {\n // prevent mouse keys getting stuck\n e.preventDefault()\n }\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // bind ctrl+shift+c to copy\n key('⌃+⇧+c', e => {\n e.preventDefault()\n this.copySelectionToClipboard()\n })\n }\n\n on (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener })\n }\n\n once (event, listener) {\n if (!this._listeners[event]) this._listeners[event] = []\n this._listeners[event].push({ listener, once: true })\n }\n\n off (event, listener) {\n let listeners = this._listeners[event]\n if (listeners) {\n for (let i in listeners) {\n if (listeners[i].listener === listener) {\n listeners.splice(i, 1)\n break\n }\n }\n }\n }\n\n emit (event, ...args) {\n let listeners = this._listeners[event]\n if (listeners) {\n let remove = []\n for (let listener of listeners) {\n try {\n listener.listener(...args)\n if (listener.once) remove.push(listener)\n } catch (err) {\n console.error(err)\n }\n }\n\n // this needs to be done in this roundabout way because for loops\n // do not like arrays with changing lengths\n for (let listener of remove) {\n listeners.splice(listeners.indexOf(listener), 1)\n }\n }\n }\n\n get palette () {\n return this._palette || themes[0]\n }\n\n set palette (palette) {\n if (this._palette !== palette) {\n this._palette = palette\n this.scheduleDraw('palette')\n }\n }\n\n getColor (i) {\n // return palette color if it exists\n if (this.palette[i]) return this.palette[i]\n\n // -1 for selection foreground, -2 for selection background\n if (i === -1) return SELECTION_FG\n if (i === -2) return SELECTION_BG\n\n // 256 color\n if (i > 15 && i < 256) return colorTable256[i]\n\n // true color, encoded as (hex) + 256 (such that #000 == 256)\n if (i > 255) {\n i -= 256\n let red = (i >> 16) & 0xFF\n let green = (i >> 8) & 0xFF\n let blue = i & 0xFF\n return `rgb(${red}, ${green}, ${blue})`\n }\n\n // default to transparent\n return 'rgba(0, 0, 0, 0)'\n }\n\n // schedule a size update in the next tick\n scheduleSizeUpdate () {\n clearTimeout(this._scheduledSizeUpdate)\n this._scheduledSizeUpdate = setTimeout(() => this.updateSize(), 1)\n }\n\n // schedule a draw in the next tick\n scheduleDraw (why, aggregateTime = 1) {\n clearTimeout(this._scheduledDraw)\n this._scheduledDraw = setTimeout(() => this.draw(why), aggregateTime)\n }\n\n getFont (modifiers = {}) {\n let fontStyle = modifiers.style || 'normal'\n let fontWeight = modifiers.weight || 'normal'\n return `${fontStyle} normal ${fontWeight} ${this.window.fontSize}px ${this.window.fontFamily}`\n }\n\n getCharSize () {\n this.ctx.font = this.getFont()\n\n return {\n width: Math.floor(this.ctx.measureText(' ').width),\n height: this.window.fontSize\n }\n }\n\n getCellSize () {\n let charSize = this.getCharSize()\n\n return {\n width: Math.ceil(charSize.width * this.window.gridScaleX),\n height: Math.ceil(charSize.height * this.window.gridScaleY)\n }\n }\n\n updateSize () {\n this._window.devicePixelRatio = window.devicePixelRatio || 1\n\n let didChange = false\n for (let key in this.windowState) {\n if (this.windowState.hasOwnProperty(key) && this.windowState[key] !== this.window[key]) {\n didChange = true\n this.windowState[key] = this.window[key]\n }\n }\n\n if (didChange) {\n const {\n width,\n height,\n devicePixelRatio,\n gridScaleX,\n gridScaleY,\n fitIntoWidth,\n fitIntoHeight\n } = this.window\n const cellSize = this.getCellSize()\n\n // real height of the canvas element in pixels\n let realWidth = width * cellSize.width\n let realHeight = height * cellSize.height\n\n if (fitIntoWidth && fitIntoHeight) {\n if (realWidth > fitIntoWidth || realHeight > fitIntoHeight) {\n let terminalAspect = realWidth / realHeight\n let fitAspect = fitIntoWidth / fitIntoHeight\n\n if (terminalAspect < fitAspect) {\n // align heights\n realHeight = fitIntoHeight\n realWidth = realHeight * terminalAspect\n } else {\n // align widths\n realWidth = fitIntoWidth\n realHeight = realWidth / terminalAspect\n }\n }\n } else if (fitIntoWidth && realWidth > fitIntoWidth) {\n realHeight = fitIntoWidth / (realWidth / realHeight)\n realWidth = fitIntoWidth\n } else if (fitIntoHeight && realHeight > fitIntoHeight) {\n realWidth = fitIntoHeight * (realWidth / realHeight)\n realHeight = fitIntoHeight\n }\n\n this.canvas.width = width * devicePixelRatio * cellSize.width\n this.canvas.style.width = `${realWidth}px`\n this.canvas.height = height * devicePixelRatio * cellSize.height\n this.canvas.style.height = `${realHeight}px`\n\n // the screen has been cleared (by changing canvas width)\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n\n // draw immediately; the canvas shouldn't flash\n this.draw('init')\n }\n }\n\n resetCursorBlink () {\n this.cursor.blinkOn = true\n clearInterval(this.cursor.blinkInterval)\n this.cursor.blinkInterval = setInterval(() => {\n this.cursor.blinkOn = this.cursor.blinking\n ? !this.cursor.blinkOn\n : true\n if (this.cursor.blinking) this.scheduleDraw('cursor-blink')\n }, 500)\n }\n\n resetBlink () {\n this.window.blinkStyleOn = true\n clearInterval(this.window.blinkInterval)\n let intervals = 0\n this.window.blinkInterval = setInterval(() => {\n if (this.blinkingCellCount <= 0) return\n\n intervals++\n if (intervals >= 4 && this.window.blinkStyleOn) {\n this.window.blinkStyleOn = false\n intervals = 0\n } else if (intervals >= 1 && !this.window.blinkStyleOn) {\n this.window.blinkStyleOn = true\n intervals = 0\n }\n }, 200)\n }\n\n getNormalizedSelection () {\n let { start, end } = this.selection\n // if the start line is after the end line, or if they're both on the same\n // line but the start column comes after the end column, swap\n if (start[1] > end[1] || (start[1] === end[1] && start[0] > end[0])) {\n [start, end] = [end, start]\n }\n return { start, end }\n }\n\n isInSelection (col, line) {\n let { start, end } = this.getNormalizedSelection()\n let colAfterStart = start[0] <= col\n let colBeforeEnd = col < end[0]\n let onStartLine = line === start[1]\n let onEndLine = line === end[1]\n\n if (onStartLine && onEndLine) return colAfterStart && colBeforeEnd\n else if (onStartLine) return colAfterStart\n else if (onEndLine) return colBeforeEnd\n else return start[1] < line && line < end[1]\n }\n\n getSelectedText () {\n const screenLength = this.window.width * this.window.height\n let lines = []\n let previousLineIndex = -1\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % this.window.width\n let y = Math.floor(cell / this.window.width)\n\n if (this.isInSelection(x, y)) {\n if (previousLineIndex !== y) {\n previousLineIndex = y\n lines.push('')\n }\n lines[lines.length - 1] += this.screen[cell]\n }\n }\n\n return lines.join('\\n')\n }\n\n copySelectionToClipboard () {\n let selectedText = this.getSelectedText()\n // don't copy anything if nothing is selected\n if (!selectedText) return\n let textarea = mk('textarea')\n document.body.appendChild(textarea)\n textarea.value = selectedText\n textarea.select()\n if (document.execCommand('copy')) {\n Notify.show('Copied to clipboard')\n } else {\n Notify.show('Failed to copy')\n }\n document.body.removeChild(textarea)\n }\n\n screenToGrid (x, y) {\n let cellSize = this.getCellSize()\n\n return [\n Math.floor((x + cellSize.width / 2) / cellSize.width),\n Math.floor(y / cellSize.height)\n ]\n }\n\n gridToScreen (x, y) {\n let cellSize = this.getCellSize()\n\n return [ x * cellSize.width, y * cellSize.height ]\n }\n\n drawCellBackground ({ x, y, cellWidth, cellHeight, bg }) {\n const ctx = this.ctx\n ctx.fillStyle = this.getColor(bg)\n ctx.clearRect(x * cellWidth, y * cellHeight, Math.ceil(cellWidth), Math.ceil(cellHeight))\n ctx.fillRect(x * cellWidth, y * cellHeight, Math.ceil(cellWidth), Math.ceil(cellHeight))\n }\n\n drawCell ({ x, y, charSize, cellWidth, cellHeight, text, fg, bg, attrs }) {\n if (!text) return\n\n const ctx = this.ctx\n\n let underline = false\n let strike = false\n let overline = false\n if (attrs & (1 << 1)) ctx.globalAlpha = 0.5\n if (attrs & (1 << 3)) underline = true\n if (attrs & (1 << 5)) text = TermScreen.alphaToFraktur(text)\n if (attrs & (1 << 6)) strike = true\n if (attrs & (1 << 7)) overline = true\n\n ctx.fillStyle = this.getColor(fg)\n ctx.fillText(text, (x + 0.5) * cellWidth, (y + 0.5) * cellHeight)\n\n if (underline || strike || overline) {\n ctx.strokeStyle = this.getColor(fg)\n ctx.lineWidth = 1\n ctx.lineCap = 'round'\n ctx.beginPath()\n\n if (underline) {\n let lineY = Math.round(y * cellHeight + charSize.height) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (strike) {\n let lineY = Math.round((y + 0.5) * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (overline) {\n let lineY = Math.round(y * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n ctx.stroke()\n }\n\n ctx.globalAlpha = 1\n }\n\n getAdjacentCells (cell, radius = 1) {\n const { width, height } = this.window\n const screenLength = width * height\n\n let cells = []\n\n for (let x = -radius; x <= radius; x++) {\n for (let y = -radius; y <= radius; y++) {\n if (x === 0 && y === 0) continue\n cells.push(cell + x + y * width)\n }\n }\n\n return cells.filter(cell => cell >= 0 && cell < screenLength)\n }\n\n draw (why) {\n const ctx = this.ctx\n const {\n width,\n height,\n devicePixelRatio,\n gridScaleX,\n gridScaleY\n } = this.window\n\n const charSize = this.getCharSize()\n const { width: cellWidth, height: cellHeight } = this.getCellSize()\n const screenWidth = width * cellWidth\n const screenHeight = height * cellHeight\n const screenLength = width * height\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n\n if (this.window.debug) {\n // differentiate static cells from updated cells\n ctx.fillStyle = 'rgba(255, 0, 255, 0.3)'\n ctx.fillRect(0, 0, screenWidth, screenHeight)\n console.log(`draw: ${why}`)\n }\n\n ctx.font = this.getFont()\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n\n // bits in the attr value that affect the font\n const FONT_MASK = 0b101\n\n // Map of (attrs & FONT_MASK) -> Array of cell indices\n let fontGroups = new Map()\n\n // Map of (cell index) -> boolean, whether or not a cell has updated\n let updateMap = new Map()\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % width\n let y = Math.floor(cell / width)\n let isCursor = !this.cursor.hanging &&\n this.cursor.x === x &&\n this.cursor.y === y\n\n let invertForCursor = isCursor && this.cursor.blinkOn &&\n this.cursor.style === 'block'\n\n let inSelection = this.isInSelection(x, y)\n\n let text = this.screen[cell]\n let fg = invertForCursor ? this.screenBG[cell] : this.screenFG[cell]\n let bg = invertForCursor ? this.screenFG[cell] : this.screenBG[cell]\n let attrs = this.screenAttrs[cell]\n\n if (attrs & (1 << 4) && !this.window.blinkStyleOn) {\n // blinking is enabled and blink style is off\n // set text to nothing so drawCell doesn't draw anything\n text = ''\n }\n\n // HACK: ensure cursor is visible\n if (invertForCursor && fg === bg) bg = fg === 0 ? 7 : 0\n\n if (inSelection) {\n fg = -1\n bg = -2\n }\n\n let didUpdate = text !== this.drawnScreen[cell] ||\n fg !== this.drawnScreenFG[cell] ||\n bg !== this.drawnScreenBG[cell] ||\n attrs !== this.drawnScreenAttrs[cell] ||\n isCursor\n\n let font = attrs & FONT_MASK\n if (!fontGroups.has(font)) fontGroups.set(font, [])\n\n fontGroups.get(font).push([cell, x, y, text, fg, bg, attrs, isCursor])\n updateMap.set(cell, didUpdate)\n }\n\n // Map of (cell index) -> boolean, whether or not a cell should be redrawn\n const redrawMap = new Map()\n\n let isTextWide = text =>\n text !== ' ' && ctx.measureText(text).width >= (cellWidth + 0.05)\n\n // decide for each cell if it should be redrawn\n let updateRedrawMapAt = cell => {\n let shouldUpdate = updateMap.get(cell) || redrawMap.get(cell)\n\n // TODO: fonts (necessary?)\n let text = this.screen[cell]\n let isWideCell = isTextWide(text)\n let checkRadius = isWideCell ? 2 : 1\n\n if (!shouldUpdate) {\n // check adjacent cells\n let adjacentDidUpdate = false\n\n for (let adjacentCell of this.getAdjacentCells(cell, checkRadius)) {\n if (updateMap.get(adjacentCell)) {\n adjacentDidUpdate = true\n break\n }\n }\n\n if (adjacentDidUpdate) shouldUpdate = true\n }\n\n if (shouldUpdate) {\n if (isWideCell) {\n // set redraw for adjacent cells\n for (let adjacentCell of this.getAdjacentCells(cell)) {\n redrawMap.set(adjacentCell, true)\n }\n\n // update previous wide cells as well\n let index = cell - 1\n while (index > 0) {\n let text = this.screen[index]\n let isWide = isTextWide(text)\n\n if (redrawMap.get(index - 1)) break\n\n // might be out of bounds but that doesn't matter\n redrawMap.set(index - width, true)\n redrawMap.set(index + width, true)\n redrawMap.set(index--, true)\n\n if (!isWide) break\n }\n }\n }\n\n redrawMap.set(cell, shouldUpdate)\n }\n\n for (let cell of updateMap.keys()) updateRedrawMapAt(cell)\n\n // pass 1: backgrounds\n for (let font of fontGroups.keys()) {\n for (let data of fontGroups.get(font)) {\n let [cell, x, y, text, fg, bg, attrs, isCursor] = data\n\n if (redrawMap.get(cell)) {\n this.drawCellBackground({ x, y, cellWidth, cellHeight, bg })\n }\n }\n }\n\n // pass 2: characters\n for (let font of fontGroups.keys()) {\n // set font once because in Firefox, this is a really slow action for some\n // reason\n let modifiers = {}\n if (font & 1) modifiers.weight = 'bold'\n if (font & 1 << 2) modifiers.style = 'italic'\n ctx.font = this.getFont(modifiers)\n\n for (let data of fontGroups.get(font)) {\n let [cell, x, y, text, fg, bg, attrs, isCursor] = data\n\n if (redrawMap.get(cell)) {\n this.drawCell({\n x, y, charSize, cellWidth, cellHeight, text, fg, bg, attrs\n })\n\n this.drawnScreen[cell] = text\n this.drawnScreenFG[cell] = fg\n this.drawnScreenBG[cell] = bg\n this.drawnScreenAttrs[cell] = attrs\n\n if (this.window.debug) {\n // add cell data\n ctx.save()\n ctx.fillStyle = '#0f0'\n ctx.font = '6px monospace'\n ctx.textAlign = 'left'\n ctx.textBaseline = 'top'\n ctx.fillText(+isTextWide(text), x * cellWidth, y * cellHeight)\n ctx.fillText(+updateMap.get(cell), x * cellWidth, y * cellHeight + 6)\n ctx.restore()\n }\n }\n\n if (isCursor && this.cursor.blinkOn && this.cursor.style !== 'block') {\n ctx.save()\n ctx.beginPath()\n if (this.cursor.style === 'bar') {\n // vertical bar\n let barWidth = 2\n ctx.rect(x * cellWidth, y * cellHeight, barWidth, cellHeight)\n } else if (this.cursor.style === 'line') {\n // underline\n let lineHeight = 2\n ctx.rect(x * cellWidth, y * cellHeight + charSize.height,\n cellWidth, lineHeight)\n }\n ctx.clip()\n\n // swap foreground/background\n fg = this.screenBG[cell]\n bg = this.screenFG[cell]\n // HACK: ensure cursor is visible\n if (fg === bg) bg = fg === 0 ? 7 : 0\n\n this.drawCell({\n x, y, charSize, cellWidth, cellHeight, text, fg, bg, attrs\n })\n ctx.restore()\n }\n }\n }\n }\n\n loadContent (str) {\n // current index\n let i = 0\n\n // window size\n const newHeight = parse2B(str, i)\n const newWidth = parse2B(str, i + 2)\n const resized = (this.window.height !== newHeight) || (this.window.width !== newWidth)\n this.window.height = newHeight\n this.window.width = newWidth\n i += 4\n\n // cursor position\n let [cursorY, cursorX] = [parse2B(str, i), parse2B(str, i + 2)]\n i += 4\n let cursorMoved = (cursorX !== this.cursor.x || cursorY !== this.cursor.y)\n this.cursor.x = cursorX\n this.cursor.y = cursorY\n\n if (cursorMoved) {\n this.resetCursorBlink()\n this.emit('cursor-moved')\n }\n\n // attributes\n let attributes = parse3B(str, i)\n i += 3\n\n this.cursor.visible = !!(attributes & 1)\n this.cursor.hanging = !!(attributes & (1 << 1))\n\n Input.setAlts(\n !!(attributes & (1 << 2)), // cursors alt\n !!(attributes & (1 << 3)), // numpad alt\n !!(attributes & (1 << 4)), // fn keys alt\n !!(attributes & (1 << 12)) // crlf mode\n )\n\n let trackMouseClicks = !!(attributes & (1 << 5))\n let trackMouseMovement = !!(attributes & (1 << 6))\n\n // 0 - Block blink 2 - Block steady (1 is unused)\n // 3 - Underline blink 4 - Underline steady\n // 5 - I-bar blink 6 - I-bar steady\n let cursorShape = (attributes >> 9) & 0x07\n\n // if it's not zero, decrement such that the two most significant bits\n // are the type and the least significant bit is the blink state\n if (cursorShape > 0) cursorShape--\n\n let cursorStyle = cursorShape >> 1\n let cursorBlinking = !(cursorShape & 1)\n\n if (cursorStyle === 0) this.cursor.style = 'block'\n else if (cursorStyle === 1) this.cursor.style = 'line'\n else if (cursorStyle === 2) this.cursor.style = 'bar'\n\n if (this.cursor.blinking !== cursorBlinking) {\n this.cursor.blinking = cursorBlinking\n this.resetCursorBlink()\n }\n\n Input.setMouseMode(trackMouseClicks, trackMouseMovement)\n this.selection.selectable = !trackMouseMovement\n $(this.canvas).toggleClass('selectable', !trackMouseMovement)\n this.mouseMode = {\n clicks: trackMouseClicks,\n movement: trackMouseMovement\n }\n\n let showButtons = !!(attributes & (1 << 7))\n let showConfigLinks = !!(attributes & (1 << 8))\n\n $('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks)\n $('#action-buttons').toggleClass('hidden', !showButtons)\n\n // content\n let fg = 7\n let bg = 0\n let attrs = 0\n let cell = 0 // cell index\n let lastChar = ' '\n let screenLength = this.window.width * this.window.height\n\n if (resized) {\n this.updateSize()\n this.blinkingCellCount = 0\n this.screen = new Array(screenLength).fill(' ')\n this.screenFG = new Array(screenLength).fill(' ')\n this.screenBG = new Array(screenLength).fill(' ')\n this.screenAttrs = new Array(screenLength).fill(' ')\n }\n\n let strArray = !undef(Array.from) ? Array.from(str) : str.split('')\n\n const MASK_LINE_ATTR = 0xC8\n const MASK_BLINK = 1 << 4\n\n let setCellContent = () => {\n // Remove blink attribute if it wouldn't have any effect\n let myAttrs = attrs\n if ((myAttrs & MASK_BLINK) !== 0 &&\n ((lastChar === ' ' && ((myAttrs & MASK_LINE_ATTR) === 0)) || // no line styles\n fg === bg // invisible text\n )\n ) {\n myAttrs ^= MASK_BLINK\n }\n // update blinking cells counter if blink state changed\n if ((this.screenAttrs[cell] & MASK_BLINK) !== (myAttrs & MASK_BLINK)) {\n if (myAttrs & MASK_BLINK) this.blinkingCellCount++\n else this.blinkingCellCount--\n }\n\n this.screen[cell] = lastChar\n this.screenFG[cell] = fg\n this.screenBG[cell] = bg\n this.screenAttrs[cell] = myAttrs\n }\n\n while (i < strArray.length && cell < screenLength) {\n let character = strArray[i++]\n let charCode = character.codePointAt(0)\n\n let data\n switch (charCode) {\n case SEQ_REPEAT:\n let count = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n for (let j = 0; j < count; j++) {\n setCellContent(cell)\n if (++cell > screenLength) break\n }\n break\n\n case SEQ_SET_COLORS:\n data = parse3B(strArray[i] + strArray[i + 1] + strArray[i + 2])\n i += 3\n fg = data & 0xFF\n bg = (data >> 8) & 0xFF\n break\n\n case SEQ_SET_ATTRS:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n attrs = data & 0xFF\n break\n\n case SEQ_SET_FG:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n fg = data & 0xFF\n break\n\n case SEQ_SET_BG:\n data = parse2B(strArray[i] + strArray[i + 1])\n i += 2\n bg = data & 0xFF\n break\n\n default:\n if (charCode < 32) character = '\\ufffd'\n lastChar = character\n setCellContent(cell)\n cell++\n }\n }\n\n if (this.window.debug) console.log(`Blinky cells = ${this.blinkingCellCount}`)\n\n this.scheduleDraw('load', 16)\n this.emit('load')\n }\n\n /** Apply labels to buttons and screen title (leading T removed already) */\n loadLabels (str) {\n let pieces = str.split('\\x01')\n qs('h1').textContent = pieces[0]\n $('#action-buttons button').forEach((button, i) => {\n let label = pieces[i + 1].trim()\n // if empty string, use the \"dim\" effect and put nbsp instead to\n // stretch the button vertically\n button.innerHTML = label ? esc(label) : ' '\n button.style.opacity = label ? 1 : 0.2\n })\n }\n\n showNotification (text) {\n console.info(`Notification: ${text}`)\n if (Notification && Notification.permission === 'granted') {\n let notification = new Notification('ESPTerm', {\n body: text\n })\n notification.addEventListener('click', () => window.focus())\n } else {\n if (Notification && Notification.permission !== 'denied') {\n Notification.requestPermission()\n } else {\n // Fallback using the built-in notification balloon\n Notify.show(text)\n }\n }\n }\n\n load (str, theme = -1) {\n const content = str.substr(1)\n if (theme >= 0 && theme < themes.length) {\n Screen.palette = themes[theme]\n }\n\n switch (str[0]) {\n case 'S':\n this.loadContent(content)\n break\n\n case 'T':\n this.loadLabels(content)\n break\n\n case 'B':\n this.beep()\n break\n\n case 'G':\n this.showNotification(content)\n break\n\n default:\n console.warn(`Bad data message type; ignoring.\\n${JSON.stringify(str)}`)\n }\n }\n\n beep () {\n const audioCtx = this.audioCtx\n if (!audioCtx) return\n\n // prevent screeching\n if (this._lastBeep && this._lastBeep > Date.now() - 50) return\n this._lastBeep = Date.now()\n\n let osc, gain\n\n // main beep\n osc = audioCtx.createOscillator()\n gain = audioCtx.createGain()\n osc.connect(gain)\n gain.connect(audioCtx.destination)\n gain.gain.value = 0.5\n osc.frequency.value = 750\n osc.type = 'sine'\n osc.start()\n osc.stop(audioCtx.currentTime + 0.05)\n\n // surrogate beep (making it sound like 'oops')\n osc = audioCtx.createOscillator()\n gain = audioCtx.createGain()\n osc.connect(gain)\n gain.connect(audioCtx.destination)\n gain.gain.value = 0.2\n osc.frequency.value = 400\n osc.type = 'sine'\n osc.start(audioCtx.currentTime + 0.05)\n osc.stop(audioCtx.currentTime + 0.08)\n }\n\n static alphaToFraktur (character) {\n if (character >= 'a' && character <= 'z') {\n character = String.fromCodePoint(0x1d51e - 0x61 + character.charCodeAt(0))\n } else if (character >= 'A' && character <= 'Z') {\n character = frakturExceptions[character] || String.fromCodePoint(\n 0x1d504 - 0x41 + character.charCodeAt(0))\n }\n return character\n }\n}\n\nconst Screen = new TermScreen()\n\nScreen.once('load', () => {\n qs('#screen').appendChild(Screen.canvas)\n})\n\nlet fitScreen = false\nfunction fitScreenIfNeeded () {\n Screen.window.fitIntoWidth = fitScreen ? window.innerWidth - 20 : 0\n Screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0\n}\nfitScreenIfNeeded()\nwindow.addEventListener('resize', fitScreenIfNeeded)\n\nwindow.toggleFitScreen = function () {\n fitScreen = !fitScreen\n const resizeButtonIcon = qs('#resize-button-icon')\n if (fitScreen) {\n resizeButtonIcon.classList.remove('icn-resize-small')\n resizeButtonIcon.classList.add('icn-resize-full')\n } else {\n resizeButtonIcon.classList.remove('icn-resize-full')\n resizeButtonIcon.classList.add('icn-resize-small')\n }\n fitScreenIfNeeded()\n}\n","/** File upload utility */\nwindow.TermUpl = (function () {\n let lines, // array of lines without newlines\n line_i, // current line index\n fuTout, // timeout handle for line sending\n send_delay_ms, // delay between lines (ms)\n nl_str, // newline string to use\n curLine, // current line (when using fuOil)\n inline_pos // Offset in line (for long lines)\n\n // lines longer than this are split to chunks\n // sending a super-ling string through the socket is not a good idea\n const MAX_LINE_LEN = 128\n\n function fuOpen () {\n fuStatus('Ready...')\n Modal.show('#fu_modal', onClose)\n $('#fu_form').toggleClass('busy', false)\n Input.blockKeys(true)\n }\n\n function onClose () {\n console.log('Upload modal closed.')\n clearTimeout(fuTout)\n line_i = 0\n Input.blockKeys(false)\n }\n\n function fuStatus (msg) {\n qs('#fu_prog').textContent = msg\n }\n\n function fuSend () {\n let v = qs('#fu_text').value\n if (!v.length) {\n fuClose()\n return\n }\n\n lines = v.split('\\n')\n line_i = 0\n inline_pos = 0 // offset in line\n send_delay_ms = qs('#fu_delay').value\n\n // sanitize - 0 causes overflows\n if (send_delay_ms < 0) {\n send_delay_ms = 0\n qs('#fu_delay').value = send_delay_ms\n }\n\n nl_str = {\n 'CR': '\\r',\n 'LF': '\\n',\n 'CRLF': '\\r\\n'\n }[qs('#fu_crlf').value]\n\n $('#fu_form').toggleClass('busy', true)\n fuStatus('Starting...')\n fuSendLine()\n }\n\n function fuSendLine () {\n if (!$('#fu_modal').hasClass('visible')) {\n // Modal is closed, cancel\n return\n }\n\n if (!Conn.canSend()) {\n // postpone\n fuTout = setTimeout(fuSendLine, 1)\n return\n }\n\n if (inline_pos === 0) {\n curLine = lines[line_i++] + nl_str\n }\n\n let chunk\n if ((curLine.length - inline_pos) <= MAX_LINE_LEN) {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos = 0\n } else {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos += MAX_LINE_LEN\n }\n\n if (!Input.sendString(chunk)) {\n fuStatus('FAILED!')\n return\n }\n\n let all = lines.length\n\n fuStatus(line_i + ' / ' + all + ' (' + (Math.round((line_i / all) * 1000) / 10) + '%)')\n\n if (lines.length > line_i || inline_pos > 0) {\n fuTout = setTimeout(fuSendLine, send_delay_ms)\n } else {\n closeWhenReady()\n }\n }\n\n function closeWhenReady () {\n if (!Conn.canSend()) {\n // stuck in XOFF still, wait to process...\n fuStatus('Waiting for Tx buffer...')\n setTimeout(closeWhenReady, 100)\n } else {\n fuStatus('Done.')\n // delay to show it\n setTimeout(function () {\n fuClose()\n }, 100)\n }\n }\n\n function fuClose () {\n Modal.hide('#fu_modal')\n }\n\n return {\n init: function () {\n qs('#fu_file').addEventListener('change', function (evt) {\n let reader = new FileReader()\n let file = evt.target.files[0]\n console.log('Selected file type: ' + file.type)\n if (!file.type.match(/text\\/.*|application\\/(json|csv|.*xml.*|.*script.*)/)) {\n // Deny load of blobs like img - can crash browser and will get corrupted anyway\n if (!confirm('This does not look like a text file: ' + file.type + '\\nReally load?')) {\n qs('#fu_file').value = ''\n return\n }\n }\n reader.onload = function (e) {\n const txt = e.target.result.replace(/[\\r\\n]+/, '\\n')\n qs('#fu_text').value = txt\n }\n console.log('Loading file...')\n reader.readAsText(file)\n }, false)\n },\n close: fuClose,\n start: fuSend,\n open: fuOpen\n }\n})()\n","/** Init the terminal sub-module - called from HTML */\nwindow.termInit = function (labels, theme) {\n Conn.init()\n Input.init()\n TermUpl.init()\n Screen.load(labels, theme) // populate labels\n}\n","$.ready(() => {\n const input = qs('#softkb-input')\n if (!input) return // abort, we're not on the terminal page\n\n let keyboardOpen = false\n\n let updateInputPosition = function () {\n if (!keyboardOpen) return\n\n let [x, y] = Screen.gridToScreen(Screen.cursor.x, Screen.cursor.y)\n input.style.transform = `translate(${x}px, ${y}px)`\n }\n\n input.addEventListener('focus', () => {\n keyboardOpen = true\n updateInputPosition()\n })\n\n input.addEventListener('blur', () => (keyboardOpen = false))\n\n Screen.on('cursor-moved', updateInputPosition)\n\n window.kbOpen = function openSoftKeyboard (open) {\n keyboardOpen = open\n updateInputPosition()\n if (open) input.focus()\n else input.blur()\n }\n\n let lastCompositionString = ''\n let compositing = false\n\n let sendInputDelta = function (newValue) {\n let resend = false\n if (newValue.length > lastCompositionString.length) {\n if (newValue.startsWith(lastCompositionString)) {\n // characters have been added at the end\n Input.sendString(newValue.substr(lastCompositionString.length))\n } else resend = true\n } else if (newValue.length < lastCompositionString.length) {\n if (lastCompositionString.startsWith(newValue)) {\n // characters have been removed at the end\n Input.sendString('\\b'.repeat(lastCompositionString.length -\n newValue.length))\n } else resend = true\n } else if (newValue !== lastCompositionString) resend = true\n\n if (resend) {\n // the entire string changed; resend everything\n Input.sendString('\\b'.repeat(lastCompositionString.length) +\n newValue)\n }\n lastCompositionString = newValue\n }\n\n input.addEventListener('keydown', e => {\n if (e.key === 'Unidentified') return\n\n e.preventDefault()\n input.value = ''\n\n if (e.key === 'Backspace') Input.sendString('\\b')\n else if (e.key === 'Enter') Input.sendString('\\x0d')\n })\n\n input.addEventListener('input', e => {\n e.stopPropagation()\n\n if (e.isComposing) {\n sendInputDelta(e.data)\n } else {\n if (e.data) Input.sendString(e.data)\n else if (e.inputType === 'deleteContentBackward') {\n lastCompositionString = ''\n sendInputDelta('')\n }\n }\n })\n\n input.addEventListener('compositionstart', e => {\n lastCompositionString = ''\n compositing = true\n })\n\n input.addEventListener('compositionend', e => {\n lastCompositionString = ''\n compositing = false\n input.value = ''\n })\n\n Screen.on('open-soft-keyboard', () => input.focus())\n})\n"]} \ No newline at end of file diff --git a/term.html b/term.html index 672b791..225f24d 100644 --- a/term.html +++ b/term.html @@ -3,10 +3,10 @@ - + Terminal :: ESPTerm - - + + @@ -58,6 +58,7 @@

+
@@ -77,8 +78,7 @@
ESPTermv1.1.2, built 2017-09-15 at 8:54v???, built 2017-09-24 at 20:55 CEST
Git hashback-end: 0012c92, - front-end: 6241b01back-end: 00000000, + front-end: 310033b
libesphttpd