First attempt at MSTSC.js support.

Ylian Saint-Hilaire committed Jun 9, 2020 at 18:17 UTC b7f09f32f8b09ff29cb8635a123ff98fcb28b14f
17 files changed +28365 -1237
MeshCentralServer.njsproj
+132
@@ -119,7 +119,64 @@
119 <Compile Include="meshuser.js" />
120 <Compile Include="mpsserver.js" />
121 <Compile Include="mqttbroker.js" />
122 + <Compile Include="mstsc.js" />
123 <Compile Include="pluginHandler.js" />
124 + <Compile Include="public\mstsc\js\canvas.js" />
125 + <Compile Include="public\mstsc\js\client.js" />
126 + <Compile Include="public\mstsc\js\keyboard.js" />
127 + <Compile Include="public\mstsc\js\mstsc.js" />
128 + <Compile Include="public\mstsc\js\rle.js" />
129 + <Compile Include="public\novnc\app\error-handler.js" />
130 + <Compile Include="public\novnc\app\localization.js" />
131 + <Compile Include="public\novnc\app\ui.js" />
132 + <Compile Include="public\novnc\app\webutil.js" />
133 + <Compile Include="public\novnc\core\base64.js" />
134 + <Compile Include="public\novnc\core\decoders\copyrect.js" />
135 + <Compile Include="public\novnc\core\decoders\hextile.js" />
136 + <Compile Include="public\novnc\core\decoders\raw.js" />
137 + <Compile Include="public\novnc\core\decoders\rre.js" />
138 + <Compile Include="public\novnc\core\decoders\tight.js" />
139 + <Compile Include="public\novnc\core\decoders\tightpng.js" />
140 + <Compile Include="public\novnc\core\des.js" />
141 + <Compile Include="public\novnc\core\display.js" />
142 + <Compile Include="public\novnc\core\encodings.js" />
143 + <Compile Include="public\novnc\core\inflator.js" />
144 + <Compile Include="public\novnc\core\input\domkeytable.js" />
145 + <Compile Include="public\novnc\core\input\fixedkeys.js" />
146 + <Compile Include="public\novnc\core\input\keyboard.js" />
147 + <Compile Include="public\novnc\core\input\keysym.js" />
148 + <Compile Include="public\novnc\core\input\keysymdef.js" />
149 + <Compile Include="public\novnc\core\input\mouse.js" />
150 + <Compile Include="public\novnc\core\input\util.js" />
151 + <Compile Include="public\novnc\core\input\vkeys.js" />
152 + <Compile Include="public\novnc\core\input\xtscancodes.js" />
153 + <Compile Include="public\novnc\core\rfb.js" />
154 + <Compile Include="public\novnc\core\util\browser.js" />
155 + <Compile Include="public\novnc\core\util\cursor.js" />
156 + <Compile Include="public\novnc\core\util\events.js" />
157 + <Compile Include="public\novnc\core\util\eventtarget.js" />
158 + <Compile Include="public\novnc\core\util\logging.js" />
159 + <Compile Include="public\novnc\core\util\polyfill.js" />
160 + <Compile Include="public\novnc\core\util\strings.js" />
161 + <Compile Include="public\novnc\core\websock.js" />
162 + <Compile Include="public\novnc\vendor\browser-es-module-loader\dist\babel-worker.js" />
163 + <Compile Include="public\novnc\vendor\browser-es-module-loader\dist\browser-es-module-loader.js" />
164 + <Compile Include="public\novnc\vendor\browser-es-module-loader\rollup.config.js" />
165 + <Compile Include="public\novnc\vendor\browser-es-module-loader\src\babel-worker.js" />
166 + <Compile Include="public\novnc\vendor\browser-es-module-loader\src\browser-es-module-loader.js" />
167 + <Compile Include="public\novnc\vendor\pako\lib\utils\common.js" />
168 + <Compile Include="public\novnc\vendor\pako\lib\zlib\adler32.js" />
169 + <Compile Include="public\novnc\vendor\pako\lib\zlib\constants.js" />
170 + <Compile Include="public\novnc\vendor\pako\lib\zlib\crc32.js" />
171 + <Compile Include="public\novnc\vendor\pako\lib\zlib\deflate.js" />
172 + <Compile Include="public\novnc\vendor\pako\lib\zlib\gzheader.js" />
173 + <Compile Include="public\novnc\vendor\pako\lib\zlib\inffast.js" />
174 + <Compile Include="public\novnc\vendor\pako\lib\zlib\inflate.js" />
175 + <Compile Include="public\novnc\vendor\pako\lib\zlib\inftrees.js" />
176 + <Compile Include="public\novnc\vendor\pako\lib\zlib\messages.js" />
177 + <Compile Include="public\novnc\vendor\pako\lib\zlib\trees.js" />
178 + <Compile Include="public\novnc\vendor\pako\lib\zlib\zstream.js" />
179 + <Compile Include="public\novnc\vendor\promise.js" />
180 <Compile Include="public\scripts\agent-redir-rtc-0.1.0.js" />
181 <Compile Include="swarmserver.js" />
182 <Compile Include="multiserver.js" />
@@ -405,6 +462,60 @@
462 <Content Include="public\images\mapmarker.png" />
463 <Content Include="public\images\meshicon50.png" />
464 <Content Include="public\images\trash.png" />
465 + <Content Include="public\mstsc\css\bootstrap.min.css" />
466 + <Content Include="public\mstsc\css\signin.css" />
467 + <Content Include="public\mstsc\index.html" />
468 + <Content Include="public\mstsc\keymap.html" />
469 + <Content Include="public\mstsc\LICENSE" />
470 + <Content Include="public\novnc\app\images\alt.svg" />
471 + <Content Include="public\novnc\app\images\clipboard.svg" />
472 + <Content Include="public\novnc\app\images\connect.svg" />
473 + <Content Include="public\novnc\app\images\ctrl.svg" />
474 + <Content Include="public\novnc\app\images\ctrlaltdel.svg" />
475 + <Content Include="public\novnc\app\images\disconnect.svg" />
476 + <Content Include="public\novnc\app\images\drag.svg" />
477 + <Content Include="public\novnc\app\images\error.svg" />
478 + <Content Include="public\novnc\app\images\esc.svg" />
479 + <Content Include="public\novnc\app\images\expander.svg" />
480 + <Content Include="public\novnc\app\images\fullscreen.svg" />
481 + <Content Include="public\novnc\app\images\handle.svg" />
482 + <Content Include="public\novnc\app\images\handle_bg.svg" />
483 + <Content Include="public\novnc\app\images\info.svg" />
484 + <Content Include="public\novnc\app\images\keyboard.svg" />
485 + <Content Include="public\novnc\app\images\mouse_left.svg" />
486 + <Content Include="public\novnc\app\images\mouse_middle.svg" />
487 + <Content Include="public\novnc\app\images\mouse_none.svg" />
488 + <Content Include="public\novnc\app\images\mouse_right.svg" />
489 + <Content Include="public\novnc\app\images\power.svg" />
490 + <Content Include="public\novnc\app\images\settings.svg" />
491 + <Content Include="public\novnc\app\images\tab.svg" />
492 + <Content Include="public\novnc\app\images\toggleextrakeys.svg" />
493 + <Content Include="public\novnc\app\images\warning.svg" />
494 + <Content Include="public\novnc\app\images\windows.svg" />
495 + <Content Include="public\novnc\app\locale\cs.json" />
496 + <Content Include="public\novnc\app\locale\de.json" />
497 + <Content Include="public\novnc\app\locale\el.json" />
498 + <Content Include="public\novnc\app\locale\es.json" />
499 + <Content Include="public\novnc\app\locale\ko.json" />
500 + <Content Include="public\novnc\app\locale\nl.json" />
501 + <Content Include="public\novnc\app\locale\pl.json" />
502 + <Content Include="public\novnc\app\locale\ru.json" />
503 + <Content Include="public\novnc\app\locale\sv.json" />
504 + <Content Include="public\novnc\app\locale\tr.json" />
505 + <Content Include="public\novnc\app\locale\zh_CN.json" />
506 + <Content Include="public\novnc\app\locale\zh_TW.json" />
507 + <Content Include="public\novnc\app\sounds\bell.mp3" />
508 + <Content Include="public\novnc\app\sounds\bell.oga" />
509 + <Content Include="public\novnc\app\sounds\CREDITS" />
510 + <Content Include="public\novnc\app\styles\base.css" />
511 + <Content Include="public\novnc\app\styles\Orbitron700.ttf" />
512 + <Content Include="public\novnc\app\styles\Orbitron700.woff" />
513 + <Content Include="public\novnc\LICENSE.txt" />
514 + <Content Include="public\novnc\vendor\browser-es-module-loader\dist\browser-es-module-loader.js.map" />
515 + <Content Include="public\novnc\vendor\browser-es-module-loader\README.md" />
516 + <Content Include="public\novnc\vendor\pako\LICENSE" />
517 + <Content Include="public\novnc\vendor\pako\README.md" />
518 + <Content Include="public\novnc\vnc.html" />
519 <Content Include="public\scriptblocks.txt" />
520 <Content Include="public\sounds\chimes.mp3" />
521 <Content Include="public\styles\font-awesome\css\font-awesome.min.css" />
@@ -483,6 +594,27 @@
594 <Folder Include="public\email\translations\" />
595 <Folder Include="public\images-isdu" />
596 <Folder Include="public\images\" />
597 + <Folder Include="public\mstsc\" />
598 + <Folder Include="public\mstsc\css\" />
599 + <Folder Include="public\mstsc\js\" />
600 + <Folder Include="public\novnc\" />
601 + <Folder Include="public\novnc\app\" />
602 + <Folder Include="public\novnc\app\images\" />
603 + <Folder Include="public\novnc\app\locale\" />
604 + <Folder Include="public\novnc\app\sounds\" />
605 + <Folder Include="public\novnc\app\styles\" />
606 + <Folder Include="public\novnc\core\" />
607 + <Folder Include="public\novnc\core\decoders\" />
608 + <Folder Include="public\novnc\core\input\" />
609 + <Folder Include="public\novnc\core\util\" />
610 + <Folder Include="public\novnc\vendor\" />
611 + <Folder Include="public\novnc\vendor\browser-es-module-loader\" />
612 + <Folder Include="public\novnc\vendor\browser-es-module-loader\dist\" />
613 + <Folder Include="public\novnc\vendor\browser-es-module-loader\src\" />
614 + <Folder Include="public\novnc\vendor\pako\" />
615 + <Folder Include="public\novnc\vendor\pako\lib\" />
616 + <Folder Include="public\novnc\vendor\pako\lib\utils\" />
617 + <Folder Include="public\novnc\vendor\pako\lib\zlib\" />
618 <Folder Include="public\scripts\" />
619 <Folder Include="public\sounds\" />
620 <Folder Include="public\styles\" />
meshcentral.js
+3
@@ -2551,6 +2551,7 @@ function mainStart() {
2551 var passport = null;
2552 var allsspi = true;
2553 var yubikey = false;
2554 + var mstsc = false;
2555 var recordingIndex = false;
2556 var domainCount = 0;
2557 if (require('os').platform() == 'win32') { for (var i in config.domains) { domainCount++; if (config.domains[i].auth == 'sspi') { sspi = true; } else { allsspi = false; } } } else { allsspi = false; }
@@ -2558,6 +2559,7 @@ function mainStart() {
2559 for (var i in config.domains) {
2560 if (config.domains[i].yubikey != null) { yubikey = true; }
2561 if (config.domains[i].auth == 'ldap') { ldap = true; }
2562 + if (config.domains[i].mstsc === true) { mstsc = true; }
2563 if ((typeof config.domains[i].authstrategies == 'object')) {
2564 if (passport == null) { passport = ['passport']; }
2565 if ((typeof config.domains[i].authstrategies.twitter == 'object') && (typeof config.domains[i].authstrategies.twitter.apikey == 'string') && (typeof config.domains[i].authstrategies.twitter.apisecret == 'string') && (passport.indexOf('passport-twitter') == -1)) { passport.push('passport-twitter'); }
@@ -2577,6 +2579,7 @@ function mainStart() {
2579 var modules = ['ws', 'cbor', 'nedb', 'https', 'yauzl', 'xmldom', 'ipcheck', 'express', 'archiver', 'multiparty', 'node-forge', 'express-ws', 'compression', 'body-parser', 'connect-redis', 'cookie-session', 'express-handlebars'];
2580 if (require('os').platform() == 'win32') { modules.push('node-windows'); if (sspi == true) { modules.push('node-sspi'); } } // Add Windows modules
2581 if (ldap == true) { modules.push('ldapauth-fork'); }
2582 + if (mstsc == true) { modules.push('node-rdpjs-2'); }
2583 if (passport != null) { modules.push(...passport); }
2584 if (recordingIndex == true) { modules.push('image-size'); } // Need to get the remote desktop JPEG sizes to index the recodring file.
2585 if (config.letsencrypt != null) { if (nodeVersion < 8) { addServerWarning("Let's Encrypt support requires Node v8.x or higher.", !args.launch); } else { modules.push('acme-client'); } } // Add acme-client module
mstsc.js new
+122
@@ -0,0 +1,122 @@
1 +/**
2 +* @description MeshCentral MSTSC relay
3 +* @author Ylian Saint-Hilaire & Bryan Roe
4 +* @copyright Intel Corporation 2018-2020
5 +* @license Apache-2.0
6 +* @version v0.0.1
7 +*/
8 +
9 +/*jslint node: true */
10 +/*jshint node: true */
11 +/*jshint strict:false */
12 +/*jshint -W097 */
13 +/*jshint esversion: 6 */
14 +"use strict";
15 +
16 +// Construct a MSTSC Relay object, called upon connection
17 +// This is a bit of a hack as we are going to run the RDP connection thru a loopback connection.
18 +// If the "node-rdpjs-2" module supported passing a socket, we would do something different.
19 +module.exports.CreateMstscRelay = function (parent, db, ws, req, args, domain, user) {
20 + const Net = require('net');
21 + const WebSocket = require('ws');
22 +
23 + var obj = {};
24 + obj.user = user;
25 + obj.domain = domain;
26 + obj.ws = ws;
27 + obj.wsClient = null;
28 + obj.tcpServer = null;
29 + obj.tcpServerPort = 0;
30 + obj.relaySocket = null;
31 + obj.relayActive = false;
32 + obj.infos = null;
33 + var rdpClient = null;
34 +
35 + // Disconnect this user
36 + obj.close = function (arg) {
37 + if ((arg == 1) || (arg == null)) { try { ws.close(); } catch (e) { console.log(e); } } // Soft close, close the websocket
38 + if (arg == 2) { try { ws._socket._parent.end(); } catch (e) { console.log(e); } } // Hard close, close the TCP socket
39 + if (obj.wsClient) { obj.wsClient.close(); obj.wsClient = null; }
40 + if (obj.tcpServer) { obj.tcpServer.close(); obj.tcpServer = null; }
41 + if (rdpClient) { rdpClient.close(); rdpClient = null; }
42 + delete obj.user;
43 + delete obj.domain;
44 + delete obj.ws;
45 + };
46 +
47 + // Start the looppback server
48 + function startTcpServer() {
49 + obj.tcpServer = new Net.Server();
50 + obj.tcpServer.listen(0, '127.0.0.1', function () { obj.tcpServerPort = obj.tcpServer.address().port; startRdp(obj.tcpServerPort); });
51 + obj.tcpServer.on('connection', function (socket) {
52 + if (obj.relaySocket != null) {
53 + socket.close();
54 + } else {
55 + obj.relaySocket = socket;
56 + obj.relaySocket.pause();
57 + obj.relaySocket.on('data', function (chunk) { if (obj.relayActive == true) { obj.wsClient.send(chunk); } });
58 + obj.relaySocket.on('end', function () { obj.close(0); });
59 + obj.relaySocket.on('error', function (err) { obj.close(0); });
60 +
61 + // TODO: Use correct URL with domain and use TLS only if needed.
62 + obj.wsClient = new WebSocket('wss://127.0.0.1/meshrelay.ashx?auth=' + obj.infos.ip, { rejectUnauthorized: false });
63 +
64 + obj.wsClient.on('open', function () { });
65 + obj.wsClient.on('message', function (data) { if ((obj.relayActive == false) && (data == 'c')) { obj.relayActive = true; obj.relaySocket.resume(); } else { obj.relaySocket.write(data); } });
66 + obj.wsClient.on('close', function () { obj.close(0); });
67 + obj.tcpServer.close();
68 + obj.tcpServer = null;
69 + }
70 + });
71 + }
72 +
73 + // Start the RDP client
74 + function startRdp(port) {
75 + rdpClient = require('node-rdpjs-2').createClient({
76 + logLevel: 'ERROR',
77 + domain: obj.infos.domain,
78 + userName: obj.infos.username,
79 + password: obj.infos.password,
80 + enablePerf: true,
81 + autoLogin: true,
82 + screen: obj.infos.screen,
83 + locale: obj.infos.locale
84 + }).on('connect', function () {
85 + send(['rdp-connect']);
86 + }).on('bitmap', function (bitmap) {
87 + send(['rdp-bitmap', bitmap]);
88 + }).on('close', function () {
89 + send(['rdp-close']);
90 + }).on('error', function (err) {
91 + send(['rdp-error', err]);
92 + }).connect('127.0.0.1', obj.tcpServerPort);
93 + }
94 +
95 + // When data is received from the web socket
96 + // RDP default port is 3389
97 + ws.on('message', function (msg) {
98 + msg = JSON.parse(msg);
99 + switch (msg[0]) {
100 + case 'infos': { obj.infos = msg[1]; startTcpServer(); break; }
101 + case 'mouse': { if (rdpClient) { rdpClient.sendPointerEvent(msg[1], msg[2], msg[3], msg[4]); } break; }
102 + case 'wheel': { if (rdpClient) { rdpClient.sendWheelEvent(msg[1], msg[2], msg[3], msg[4]); } break; }
103 + case 'scancode': { if (rdpClient) { rdpClient.sendKeyEventScancode(msg[1], msg[2]); } break; }
104 + case 'unicode': { if (rdpClient) { rdpClient.sendKeyEventUnicode(msg[1], msg[2]); } break; }
105 + case 'disconnect': { obj.close(0); break; }
106 + }
107 + });
108 +
109 + // If error, do nothing
110 + ws.on('error', function (err) { console.log(err); obj.close(0); });
111 +
112 + // If the web socket is closed
113 + ws.on('close', function (req) { obj.close(0); });
114 +
115 + // Send an object
116 + function send(obj) { try { ws.send(JSON.stringify(obj)); } catch (ex) { } }
117 +
118 + // We are all set, start receiving data
119 + ws._socket.resume();
120 +
121 + return obj;
122 +};
\ No newline at end of file
public/mstsc/LICENSE new
+674
@@ -0,0 +1,674 @@
1 +GNU GENERAL PUBLIC LICENSE
2 + Version 3, 29 June 2007
3 +
4 + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5 + Everyone is permitted to copy and distribute verbatim copies
6 + of this license document, but changing it is not allowed.
7 +
8 + Preamble
9 +
10 + The GNU General Public License is a free, copyleft license for
11 +software and other kinds of works.
12 +
13 + The licenses for most software and other practical works are designed
14 +to take away your freedom to share and change the works. By contrast,
15 +the GNU General Public License is intended to guarantee your freedom to
16 +share and change all versions of a program--to make sure it remains free
17 +software for all its users. We, the Free Software Foundation, use the
18 +GNU General Public License for most of our software; it applies also to
19 +any other work released this way by its authors. You can apply it to
20 +your programs, too.
21 +
22 + When we speak of free software, we are referring to freedom, not
23 +price. Our General Public Licenses are designed to make sure that you
24 +have the freedom to distribute copies of free software (and charge for
25 +them if you wish), that you receive source code or can get it if you
26 +want it, that you can change the software or use pieces of it in new
27 +free programs, and that you know you can do these things.
28 +
29 + To protect your rights, we need to prevent others from denying you
30 +these rights or asking you to surrender the rights. Therefore, you have
31 +certain responsibilities if you distribute copies of the software, or if
32 +you modify it: responsibilities to respect the freedom of others.
33 +
34 + For example, if you distribute copies of such a program, whether
35 +gratis or for a fee, you must pass on to the recipients the same
36 +freedoms that you received. You must make sure that they, too, receive
37 +or can get the source code. And you must show them these terms so they
38 +know their rights.
39 +
40 + Developers that use the GNU GPL protect your rights with two steps:
41 +(1) assert copyright on the software, and (2) offer you this License
42 +giving you legal permission to copy, distribute and/or modify it.
43 +
44 + For the developers' and authors' protection, the GPL clearly explains
45 +that there is no warranty for this free software. For both users' and
46 +authors' sake, the GPL requires that modified versions be marked as
47 +changed, so that their problems will not be attributed erroneously to
48 +authors of previous versions.
49 +
50 + Some devices are designed to deny users access to install or run
51 +modified versions of the software inside them, although the manufacturer
52 +can do so. This is fundamentally incompatible with the aim of
53 +protecting users' freedom to change the software. The systematic
54 +pattern of such abuse occurs in the area of products for individuals to
55 +use, which is precisely where it is most unacceptable. Therefore, we
56 +have designed this version of the GPL to prohibit the practice for those
57 +products. If such problems arise substantially in other domains, we
58 +stand ready to extend this provision to those domains in future versions
59 +of the GPL, as needed to protect the freedom of users.
60 +
61 + Finally, every program is threatened constantly by software patents.
62 +States should not allow patents to restrict development and use of
63 +software on general-purpose computers, but in those that do, we wish to
64 +avoid the special danger that patents applied to a free program could
65 +make it effectively proprietary. To prevent this, the GPL assures that
66 +patents cannot be used to render the program non-free.
67 +
68 + The precise terms and conditions for copying, distribution and
69 +modification follow.
70 +
71 + TERMS AND CONDITIONS
72 +
73 + 0. Definitions.
74 +
75 + "This License" refers to version 3 of the GNU General Public License.
76 +
77 + "Copyright" also means copyright-like laws that apply to other kinds of
78 +works, such as semiconductor masks.
79 +
80 + "The Program" refers to any copyrightable work licensed under this
81 +License. Each licensee is addressed as "you". "Licensees" and
82 +"recipients" may be individuals or organizations.
83 +
84 + To "modify" a work means to copy from or adapt all or part of the work
85 +in a fashion requiring copyright permission, other than the making of an
86 +exact copy. The resulting work is called a "modified version" of the
87 +earlier work or a work "based on" the earlier work.
88 +
89 + A "covered work" means either the unmodified Program or a work based
90 +on the Program.
91 +
92 + To "propagate" a work means to do anything with it that, without
93 +permission, would make you directly or secondarily liable for
94 +infringement under applicable copyright law, except executing it on a
95 +computer or modifying a private copy. Propagation includes copying,
96 +distribution (with or without modification), making available to the
97 +public, and in some countries other activities as well.
98 +
99 + To "convey" a work means any kind of propagation that enables other
100 +parties to make or receive copies. Mere interaction with a user through
101 +a computer network, with no transfer of a copy, is not conveying.
102 +
103 + An interactive user interface displays "Appropriate Legal Notices"
104 +to the extent that it includes a convenient and prominently visible
105 +feature that (1) displays an appropriate copyright notice, and (2)
106 +tells the user that there is no warranty for the work (except to the
107 +extent that warranties are provided), that licensees may convey the
108 +work under this License, and how to view a copy of this License. If
109 +the interface presents a list of user commands or options, such as a
110 +menu, a prominent item in the list meets this criterion.
111 +
112 + 1. Source Code.
113 +
114 + The "source code" for a work means the preferred form of the work
115 +for making modifications to it. "Object code" means any non-source
116 +form of a work.
117 +
118 + A "Standard Interface" means an interface that either is an official
119 +standard defined by a recognized standards body, or, in the case of
120 +interfaces specified for a particular programming language, one that
121 +is widely used among developers working in that language.
122 +
123 + The "System Libraries" of an executable work include anything, other
124 +than the work as a whole, that (a) is included in the normal form of
125 +packaging a Major Component, but which is not part of that Major
126 +Component, and (b) serves only to enable use of the work with that
127 +Major Component, or to implement a Standard Interface for which an
128 +implementation is available to the public in source code form. A
129 +"Major Component", in this context, means a major essential component
130 +(kernel, window system, and so on) of the specific operating system
131 +(if any) on which the executable work runs, or a compiler used to
132 +produce the work, or an object code interpreter used to run it.
133 +
134 + The "Corresponding Source" for a work in object code form means all
135 +the source code needed to generate, install, and (for an executable
136 +work) run the object code and to modify the work, including scripts to
137 +control those activities. However, it does not include the work's
138 +System Libraries, or general-purpose tools or generally available free
139 +programs which are used unmodified in performing those activities but
140 +which are not part of the work. For example, Corresponding Source
141 +includes interface definition files associated with source files for
142 +the work, and the source code for shared libraries and dynamically
143 +linked subprograms that the work is specifically designed to require,
144 +such as by intimate data communication or control flow between those
145 +subprograms and other parts of the work.
146 +
147 + The Corresponding Source need not include anything that users
148 +can regenerate automatically from other parts of the Corresponding
149 +Source.
150 +
151 + The Corresponding Source for a work in source code form is that
152 +same work.
153 +
154 + 2. Basic Permissions.
155 +
156 + All rights granted under this License are granted for the term of
157 +copyright on the Program, and are irrevocable provided the stated
158 +conditions are met. This License explicitly affirms your unlimited
159 +permission to run the unmodified Program. The output from running a
160 +covered work is covered by this License only if the output, given its
161 +content, constitutes a covered work. This License acknowledges your
162 +rights of fair use or other equivalent, as provided by copyright law.
163 +
164 + You may make, run and propagate covered works that you do not
165 +convey, without conditions so long as your license otherwise remains
166 +in force. You may convey covered works to others for the sole purpose
167 +of having them make modifications exclusively for you, or provide you
168 +with facilities for running those works, provided that you comply with
169 +the terms of this License in conveying all material for which you do
170 +not control copyright. Those thus making or running the covered works
171 +for you must do so exclusively on your behalf, under your direction
172 +and control, on terms that prohibit them from making any copies of
173 +your copyrighted material outside their relationship with you.
174 +
175 + Conveying under any other circumstances is permitted solely under
176 +the conditions stated below. Sublicensing is not allowed; section 10
177 +makes it unnecessary.
178 +
179 + 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 +
181 + No covered work shall be deemed part of an effective technological
182 +measure under any applicable law fulfilling obligations under article
183 +11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 +similar laws prohibiting or restricting circumvention of such
185 +measures.
186 +
187 + When you convey a covered work, you waive any legal power to forbid
188 +circumvention of technological measures to the extent such circumvention
189 +is effected by exercising rights under this License with respect to
190 +the covered work, and you disclaim any intention to limit operation or
191 +modification of the work as a means of enforcing, against the work's
192 +users, your or third parties' legal rights to forbid circumvention of
193 +technological measures.
194 +
195 + 4. Conveying Verbatim Copies.
196 +
197 + You may convey verbatim copies of the Program's source code as you
198 +receive it, in any medium, provided that you conspicuously and
199 +appropriately publish on each copy an appropriate copyright notice;
200 +keep intact all notices stating that this License and any
201 +non-permissive terms added in accord with section 7 apply to the code;
202 +keep intact all notices of the absence of any warranty; and give all
203 +recipients a copy of this License along with the Program.
204 +
205 + You may charge any price or no price for each copy that you convey,
206 +and you may offer support or warranty protection for a fee.
207 +
208 + 5. Conveying Modified Source Versions.
209 +
210 + You may convey a work based on the Program, or the modifications to
211 +produce it from the Program, in the form of source code under the
212 +terms of section 4, provided that you also meet all of these conditions:
213 +
214 + a) The work must carry prominent notices stating that you modified
215 + it, and giving a relevant date.
216 +
217 + b) The work must carry prominent notices stating that it is
218 + released under this License and any conditions added under section
219 + 7. This requirement modifies the requirement in section 4 to
220 + "keep intact all notices".
221 +
222 + c) You must license the entire work, as a whole, under this
223 + License to anyone who comes into possession of a copy. This
224 + License will therefore apply, along with any applicable section 7
225 + additional terms, to the whole of the work, and all its parts,
226 + regardless of how they are packaged. This License gives no
227 + permission to license the work in any other way, but it does not
228 + invalidate such permission if you have separately received it.
229 +
230 + d) If the work has interactive user interfaces, each must display
231 + Appropriate Legal Notices; however, if the Program has interactive
232 + interfaces that do not display Appropriate Legal Notices, your
233 + work need not make them do so.
234 +
235 + A compilation of a covered work with other separate and independent
236 +works, which are not by their nature extensions of the covered work,
237 +and which are not combined with it such as to form a larger program,
238 +in or on a volume of a storage or distribution medium, is called an
239 +"aggregate" if the compilation and its resulting copyright are not
240 +used to limit the access or legal rights of the compilation's users
241 +beyond what the individual works permit. Inclusion of a covered work
242 +in an aggregate does not cause this License to apply to the other
243 +parts of the aggregate.
244 +
245 + 6. Conveying Non-Source Forms.
246 +
247 + You may convey a covered work in object code form under the terms
248 +of sections 4 and 5, provided that you also convey the
249 +machine-readable Corresponding Source under the terms of this License,
250 +in one of these ways:
251 +
252 + a) Convey the object code in, or embodied in, a physical product
253 + (including a physical distribution medium), accompanied by the
254 + Corresponding Source fixed on a durable physical medium
255 + customarily used for software interchange.
256 +
257 + b) Convey the object code in, or embodied in, a physical product
258 + (including a physical distribution medium), accompanied by a
259 + written offer, valid for at least three years and valid for as
260 + long as you offer spare parts or customer support for that product
261 + model, to give anyone who possesses the object code either (1) a
262 + copy of the Corresponding Source for all the software in the
263 + product that is covered by this License, on a durable physical
264 + medium customarily used for software interchange, for a price no
265 + more than your reasonable cost of physically performing this
266 + conveying of source, or (2) access to copy the
267 + Corresponding Source from a network server at no charge.
268 +
269 + c) Convey individual copies of the object code with a copy of the
270 + written offer to provide the Corresponding Source. This
271 + alternative is allowed only occasionally and noncommercially, and
272 + only if you received the object code with such an offer, in accord
273 + with subsection 6b.
274 +
275 + d) Convey the object code by offering access from a designated
276 + place (gratis or for a charge), and offer equivalent access to the
277 + Corresponding Source in the same way through the same place at no
278 + further charge. You need not require recipients to copy the
279 + Corresponding Source along with the object code. If the place to
280 + copy the object code is a network server, the Corresponding Source
281 + may be on a different server (operated by you or a third party)
282 + that supports equivalent copying facilities, provided you maintain
283 + clear directions next to the object code saying where to find the
284 + Corresponding Source. Regardless of what server hosts the
285 + Corresponding Source, you remain obligated to ensure that it is
286 + available for as long as needed to satisfy these requirements.
287 +
288 + e) Convey the object code using peer-to-peer transmission, provided
289 + you inform other peers where the object code and Corresponding
290 + Source of the work are being offered to the general public at no
291 + charge under subsection 6d.
292 +
293 + A separable portion of the object code, whose source code is excluded
294 +from the Corresponding Source as a System Library, need not be
295 +included in conveying the object code work.
296 +
297 + A "User Product" is either (1) a "consumer product", which means any
298 +tangible personal property which is normally used for personal, family,
299 +or household purposes, or (2) anything designed or sold for incorporation
300 +into a dwelling. In determining whether a product is a consumer product,
301 +doubtful cases shall be resolved in favor of coverage. For a particular
302 +product received by a particular user, "normally used" refers to a
303 +typical or common use of that class of product, regardless of the status
304 +of the particular user or of the way in which the particular user
305 +actually uses, or expects or is expected to use, the product. A product
306 +is a consumer product regardless of whether the product has substantial
307 +commercial, industrial or non-consumer uses, unless such uses represent
308 +the only significant mode of use of the product.
309 +
310 + "Installation Information" for a User Product means any methods,
311 +procedures, authorization keys, or other information required to install
312 +and execute modified versions of a covered work in that User Product from
313 +a modified version of its Corresponding Source. The information must
314 +suffice to ensure that the continued functioning of the modified object
315 +code is in no case prevented or interfered with solely because
316 +modification has been made.
317 +
318 + If you convey an object code work under this section in, or with, or
319 +specifically for use in, a User Product, and the conveying occurs as
320 +part of a transaction in which the right of possession and use of the
321 +User Product is transferred to the recipient in perpetuity or for a
322 +fixed term (regardless of how the transaction is characterized), the
323 +Corresponding Source conveyed under this section must be accompanied
324 +by the Installation Information. But this requirement does not apply
325 +if neither you nor any third party retains the ability to install
326 +modified object code on the User Product (for example, the work has
327 +been installed in ROM).
328 +
329 + The requirement to provide Installation Information does not include a
330 +requirement to continue to provide support service, warranty, or updates
331 +for a work that has been modified or installed by the recipient, or for
332 +the User Product in which it has been modified or installed. Access to a
333 +network may be denied when the modification itself materially and
334 +adversely affects the operation of the network or violates the rules and
335 +protocols for communication across the network.
336 +
337 + Corresponding Source conveyed, and Installation Information provided,
338 +in accord with this section must be in a format that is publicly
339 +documented (and with an implementation available to the public in
340 +source code form), and must require no special password or key for
341 +unpacking, reading or copying.
342 +
343 + 7. Additional Terms.
344 +
345 + "Additional permissions" are terms that supplement the terms of this
346 +License by making exceptions from one or more of its conditions.
347 +Additional permissions that are applicable to the entire Program shall
348 +be treated as though they were included in this License, to the extent
349 +that they are valid under applicable law. If additional permissions
350 +apply only to part of the Program, that part may be used separately
351 +under those permissions, but the entire Program remains governed by
352 +this License without regard to the additional permissions.
353 +
354 + When you convey a copy of a covered work, you may at your option
355 +remove any additional permissions from that copy, or from any part of
356 +it. (Additional permissions may be written to require their own
357 +removal in certain cases when you modify the work.) You may place
358 +additional permissions on material, added by you to a covered work,
359 +for which you have or can give appropriate copyright permission.
360 +
361 + Notwithstanding any other provision of this License, for material you
362 +add to a covered work, you may (if authorized by the copyright holders of
363 +that material) supplement the terms of this License with terms:
364 +
365 + a) Disclaiming warranty or limiting liability differently from the
366 + terms of sections 15 and 16 of this License; or
367 +
368 + b) Requiring preservation of specified reasonable legal notices or
369 + author attributions in that material or in the Appropriate Legal
370 + Notices displayed by works containing it; or
371 +
372 + c) Prohibiting misrepresentation of the origin of that material, or
373 + requiring that modified versions of such material be marked in
374 + reasonable ways as different from the original version; or
375 +
376 + d) Limiting the use for publicity purposes of names of licensors or
377 + authors of the material; or
378 +
379 + e) Declining to grant rights under trademark law for use of some
380 + trade names, trademarks, or service marks; or
381 +
382 + f) Requiring indemnification of licensors and authors of that
383 + material by anyone who conveys the material (or modified versions of
384 + it) with contractual assumptions of liability to the recipient, for
385 + any liability that these contractual assumptions directly impose on
386 + those licensors and authors.
387 +
388 + All other non-permissive additional terms are considered "further
389 +restrictions" within the meaning of section 10. If the Program as you
390 +received it, or any part of it, contains a notice stating that it is
391 +governed by this License along with a term that is a further
392 +restriction, you may remove that term. If a license document contains
393 +a further restriction but permits relicensing or conveying under this
394 +License, you may add to a covered work material governed by the terms
395 +of that license document, provided that the further restriction does
396 +not survive such relicensing or conveying.
397 +
398 + If you add terms to a covered work in accord with this section, you
399 +must place, in the relevant source files, a statement of the
400 +additional terms that apply to those files, or a notice indicating
401 +where to find the applicable terms.
402 +
403 + Additional terms, permissive or non-permissive, may be stated in the
404 +form of a separately written license, or stated as exceptions;
405 +the above requirements apply either way.
406 +
407 + 8. Termination.
408 +
409 + You may not propagate or modify a covered work except as expressly
410 +provided under this License. Any attempt otherwise to propagate or
411 +modify it is void, and will automatically terminate your rights under
412 +this License (including any patent licenses granted under the third
413 +paragraph of section 11).
414 +
415 + However, if you cease all violation of this License, then your
416 +license from a particular copyright holder is reinstated (a)
417 +provisionally, unless and until the copyright holder explicitly and
418 +finally terminates your license, and (b) permanently, if the copyright
419 +holder fails to notify you of the violation by some reasonable means
420 +prior to 60 days after the cessation.
421 +
422 + Moreover, your license from a particular copyright holder is
423 +reinstated permanently if the copyright holder notifies you of the
424 +violation by some reasonable means, this is the first time you have
425 +received notice of violation of this License (for any work) from that
426 +copyright holder, and you cure the violation prior to 30 days after
427 +your receipt of the notice.
428 +
429 + Termination of your rights under this section does not terminate the
430 +licenses of parties who have received copies or rights from you under
431 +this License. If your rights have been terminated and not permanently
432 +reinstated, you do not qualify to receive new licenses for the same
433 +material under section 10.
434 +
435 + 9. Acceptance Not Required for Having Copies.
436 +
437 + You are not required to accept this License in order to receive or
438 +run a copy of the Program. Ancillary propagation of a covered work
439 +occurring solely as a consequence of using peer-to-peer transmission
440 +to receive a copy likewise does not require acceptance. However,
441 +nothing other than this License grants you permission to propagate or
442 +modify any covered work. These actions infringe copyright if you do
443 +not accept this License. Therefore, by modifying or propagating a
444 +covered work, you indicate your acceptance of this License to do so.
445 +
446 + 10. Automatic Licensing of Downstream Recipients.
447 +
448 + Each time you convey a covered work, the recipient automatically
449 +receives a license from the original licensors, to run, modify and
450 +propagate that work, subject to this License. You are not responsible
451 +for enforcing compliance by third parties with this License.
452 +
453 + An "entity transaction" is a transaction transferring control of an
454 +organization, or substantially all assets of one, or subdividing an
455 +organization, or merging organizations. If propagation of a covered
456 +work results from an entity transaction, each party to that
457 +transaction who receives a copy of the work also receives whatever
458 +licenses to the work the party's predecessor in interest had or could
459 +give under the previous paragraph, plus a right to possession of the
460 +Corresponding Source of the work from the predecessor in interest, if
461 +the predecessor has it or can get it with reasonable efforts.
462 +
463 + You may not impose any further restrictions on the exercise of the
464 +rights granted or affirmed under this License. For example, you may
465 +not impose a license fee, royalty, or other charge for exercise of
466 +rights granted under this License, and you may not initiate litigation
467 +(including a cross-claim or counterclaim in a lawsuit) alleging that
468 +any patent claim is infringed by making, using, selling, offering for
469 +sale, or importing the Program or any portion of it.
470 +
471 + 11. Patents.
472 +
473 + A "contributor" is a copyright holder who authorizes use under this
474 +License of the Program or a work on which the Program is based. The
475 +work thus licensed is called the contributor's "contributor version".
476 +
477 + A contributor's "essential patent claims" are all patent claims
478 +owned or controlled by the contributor, whether already acquired or
479 +hereafter acquired, that would be infringed by some manner, permitted
480 +by this License, of making, using, or selling its contributor version,
481 +but do not include claims that would be infringed only as a
482 +consequence of further modification of the contributor version. For
483 +purposes of this definition, "control" includes the right to grant
484 +patent sublicenses in a manner consistent with the requirements of
485 +this License.
486 +
487 + Each contributor grants you a non-exclusive, worldwide, royalty-free
488 +patent license under the contributor's essential patent claims, to
489 +make, use, sell, offer for sale, import and otherwise run, modify and
490 +propagate the contents of its contributor version.
491 +
492 + In the following three paragraphs, a "patent license" is any express
493 +agreement or commitment, however denominated, not to enforce a patent
494 +(such as an express permission to practice a patent or covenant not to
495 +sue for patent infringement). To "grant" such a patent license to a
496 +party means to make such an agreement or commitment not to enforce a
497 +patent against the party.
498 +
499 + If you convey a covered work, knowingly relying on a patent license,
500 +and the Corresponding Source of the work is not available for anyone
501 +to copy, free of charge and under the terms of this License, through a
502 +publicly available network server or other readily accessible means,
503 +then you must either (1) cause the Corresponding Source to be so
504 +available, or (2) arrange to deprive yourself of the benefit of the
505 +patent license for this particular work, or (3) arrange, in a manner
506 +consistent with the requirements of this License, to extend the patent
507 +license to downstream recipients. "Knowingly relying" means you have
508 +actual knowledge that, but for the patent license, your conveying the
509 +covered work in a country, or your recipient's use of the covered work
510 +in a country, would infringe one or more identifiable patents in that
511 +country that you have reason to believe are valid.
512 +
513 + If, pursuant to or in connection with a single transaction or
514 +arrangement, you convey, or propagate by procuring conveyance of, a
515 +covered work, and grant a patent license to some of the parties
516 +receiving the covered work authorizing them to use, propagate, modify
517 +or convey a specific copy of the covered work, then the patent license
518 +you grant is automatically extended to all recipients of the covered
519 +work and works based on it.
520 +
521 + A patent license is "discriminatory" if it does not include within
522 +the scope of its coverage, prohibits the exercise of, or is
523 +conditioned on the non-exercise of one or more of the rights that are
524 +specifically granted under this License. You may not convey a covered
525 +work if you are a party to an arrangement with a third party that is
526 +in the business of distributing software, under which you make payment
527 +to the third party based on the extent of your activity of conveying
528 +the work, and under which the third party grants, to any of the
529 +parties who would receive the covered work from you, a discriminatory
530 +patent license (a) in connection with copies of the covered work
531 +conveyed by you (or copies made from those copies), or (b) primarily
532 +for and in connection with specific products or compilations that
533 +contain the covered work, unless you entered into that arrangement,
534 +or that patent license was granted, prior to 28 March 2007.
535 +
536 + Nothing in this License shall be construed as excluding or limiting
537 +any implied license or other defenses to infringement that may
538 +otherwise be available to you under applicable patent law.
539 +
540 + 12. No Surrender of Others' Freedom.
541 +
542 + If conditions are imposed on you (whether by court order, agreement or
543 +otherwise) that contradict the conditions of this License, they do not
544 +excuse you from the conditions of this License. If you cannot convey a
545 +covered work so as to satisfy simultaneously your obligations under this
546 +License and any other pertinent obligations, then as a consequence you may
547 +not convey it at all. For example, if you agree to terms that obligate you
548 +to collect a royalty for further conveying from those to whom you convey
549 +the Program, the only way you could satisfy both those terms and this
550 +License would be to refrain entirely from conveying the Program.
551 +
552 + 13. Use with the GNU Affero General Public License.
553 +
554 + Notwithstanding any other provision of this License, you have
555 +permission to link or combine any covered work with a work licensed
556 +under version 3 of the GNU Affero General Public License into a single
557 +combined work, and to convey the resulting work. The terms of this
558 +License will continue to apply to the part which is the covered work,
559 +but the special requirements of the GNU Affero General Public License,
560 +section 13, concerning interaction through a network will apply to the
561 +combination as such.
562 +
563 + 14. Revised Versions of this License.
564 +
565 + The Free Software Foundation may publish revised and/or new versions of
566 +the GNU General Public License from time to time. Such new versions will
567 +be similar in spirit to the present version, but may differ in detail to
568 +address new problems or concerns.
569 +
570 + Each version is given a distinguishing version number. If the
571 +Program specifies that a certain numbered version of the GNU General
572 +Public License "or any later version" applies to it, you have the
573 +option of following the terms and conditions either of that numbered
574 +version or of any later version published by the Free Software
575 +Foundation. If the Program does not specify a version number of the
576 +GNU General Public License, you may choose any version ever published
577 +by the Free Software Foundation.
578 +
579 + If the Program specifies that a proxy can decide which future
580 +versions of the GNU General Public License can be used, that proxy's
581 +public statement of acceptance of a version permanently authorizes you
582 +to choose that version for the Program.
583 +
584 + Later license versions may give you additional or different
585 +permissions. However, no additional obligations are imposed on any
586 +author or copyright holder as a result of your choosing to follow a
587 +later version.
588 +
589 + 15. Disclaimer of Warranty.
590 +
591 + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 +
600 + 16. Limitation of Liability.
601 +
602 + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 +SUCH DAMAGES.
611 +
612 + 17. Interpretation of Sections 15 and 16.
613 +
614 + If the disclaimer of warranty and limitation of liability provided
615 +above cannot be given local legal effect according to their terms,
616 +reviewing courts shall apply local law that most closely approximates
617 +an absolute waiver of all civil liability in connection with the
618 +Program, unless a warranty or assumption of liability accompanies a
619 +copy of the Program in return for a fee.
620 +
621 + END OF TERMS AND CONDITIONS
622 +
623 + How to Apply These Terms to Your New Programs
624 +
625 + If you develop a new program, and you want it to be of the greatest
626 +possible use to the public, the best way to achieve this is to make it
627 +free software which everyone can redistribute and change under these terms.
628 +
629 + To do so, attach the following notices to the program. It is safest
630 +to attach them to the start of each source file to most effectively
631 +state the exclusion of warranty; and each file should have at least
632 +the "copyright" line and a pointer to where the full notice is found.
633 +
634 + {one line to give the program's name and a brief idea of what it does.}
635 + Copyright (C) {year} {name of author}
636 +
637 + This program is free software: you can redistribute it and/or modify
638 + it under the terms of the GNU General Public License as published by
639 + the Free Software Foundation, either version 3 of the License, or
640 + (at your option) any later version.
641 +
642 + This program is distributed in the hope that it will be useful,
643 + but WITHOUT ANY WARRANTY; without even the implied warranty of
644 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 + GNU General Public License for more details.
646 +
647 + You should have received a copy of the GNU General Public License
648 + along with this program. If not, see <http://www.gnu.org/licenses/>.
649 +
650 +Also add information on how to contact you by electronic and paper mail.
651 +
652 + If the program does terminal interaction, make it output a short
653 +notice like this when it starts in an interactive mode:
654 +
655 + {project} Copyright (C) {year} {fullname}
656 + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 + This is free software, and you are welcome to redistribute it
658 + under certain conditions; type `show c' for details.
659 +
660 +The hypothetical commands `show w' and `show c' should show the appropriate
661 +parts of the General Public License. Of course, your program's commands
662 +might be different; for a GUI interface, you would use an "about box".
663 +
664 + You should also get your employer (if you work as a programmer) or school,
665 +if any, to sign a "copyright disclaimer" for the program, if necessary.
666 +For more information on this, and how to apply and follow the GNU GPL, see
667 +<http://www.gnu.org/licenses/>.
668 +
669 + The GNU General Public License does not permit incorporating your program
670 +into proprietary programs. If your program is a subroutine library, you
671 +may consider it more useful to permit linking proprietary applications with
672 +the library. If this is what you want to do, use the GNU Lesser General
673 +Public License instead of this License. But first, please read
674 +<http://www.gnu.org/philosophy/why-not-lgpl.html>.
public/mstsc/css/bootstrap.min.css new
+7271
@@ -0,0 +1,7271 @@
1 +/*!
2 + * Bootstrap v3.3.5 (http://getbootstrap.com)
3 + * Copyright 2011-2015 Twitter, Inc.
4 + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{
6 + font-family:sans-serif;
7 + -webkit-text-size-adjust:100%;
8 + -ms-text-size-adjust:100%
9 +}
10 +
11 +body{
12 + margin:0
13 +}
14 +
15 +article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{
16 + display:block
17 +}
18 +
19 +audio,canvas,progress,video{
20 + display:inline-block;
21 + vertical-align:baseline
22 +}
23 +
24 +audio:not([controls]){
25 + display:none;
26 + height:0
27 +}
28 +
29 +[hidden],template{
30 + display:none
31 +}
32 +
33 +a{
34 + background-color:transparent
35 +}
36 +
37 +a:active,a:hover{
38 + outline:0
39 +}
40 +
41 +abbr[title]{
42 + border-bottom:1px dotted
43 +}
44 +
45 +b,strong{
46 + font-weight:700
47 +}
48 +
49 +dfn{
50 + font-style:italic
51 +}
52 +
53 +h1{
54 + margin:.67em 0;
55 + font-size:2em
56 +}
57 +
58 +mark{
59 + color:#000;
60 + background:#ff0
61 +}
62 +
63 +small{
64 + font-size:80%
65 +}
66 +
67 +sub,sup{
68 + position:relative;
69 + font-size:75%;
70 + line-height:0;
71 + vertical-align:baseline
72 +}
73 +
74 +sup{
75 + top:-.5em
76 +}
77 +
78 +sub{
79 + bottom:-.25em
80 +}
81 +
82 +img{
83 + border:0
84 +}
85 +
86 +svg:not(:root){
87 + overflow:hidden
88 +}
89 +
90 +figure{
91 + margin:1em 40px
92 +}
93 +
94 +hr{
95 + height:0;
96 + -webkit-box-sizing:content-box;
97 + -moz-box-sizing:content-box;
98 + box-sizing:content-box
99 +}
100 +
101 +pre{
102 + overflow:auto
103 +}
104 +
105 +code,kbd,pre,samp{
106 + font-family:monospace,monospace;
107 + font-size:1em
108 +}
109 +
110 +button,input,optgroup,select,textarea{
111 + margin:0;
112 + font:inherit;
113 + color:inherit
114 +}
115 +
116 +button{
117 + overflow:visible
118 +}
119 +
120 +button,select{
121 + text-transform:none
122 +}
123 +
124 +button,html input[type=button],input[type=reset],input[type=submit]{
125 + -webkit-appearance:button;
126 + cursor:pointer
127 +}
128 +
129 +button[disabled],html input[disabled]{
130 + cursor:default
131 +}
132 +
133 +button::-moz-focus-inner,input::-moz-focus-inner{
134 + padding:0;
135 + border:0
136 +}
137 +
138 +input{
139 + line-height:normal
140 +}
141 +
142 +input[type=checkbox],input[type=radio]{
143 + -webkit-box-sizing:border-box;
144 + -moz-box-sizing:border-box;
145 + box-sizing:border-box;
146 + padding:0
147 +}
148 +
149 +input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{
150 + height:auto
151 +}
152 +
153 +input[type=search]{
154 + -webkit-box-sizing:content-box;
155 + -moz-box-sizing:content-box;
156 + box-sizing:content-box;
157 + -webkit-appearance:textfield
158 +}
159 +
160 +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{
161 + -webkit-appearance:none
162 +}
163 +
164 +fieldset{
165 + padding:.35em .625em .75em;
166 + margin:0 2px;
167 + border:1px solid silver
168 +}
169 +
170 +legend{
171 + padding:0;
172 + border:0
173 +}
174 +
175 +textarea{
176 + overflow:auto
177 +}
178 +
179 +optgroup{
180 + font-weight:700
181 +}
182 +
183 +table{
184 + border-spacing:0;
185 + border-collapse:collapse
186 +}
187 +
188 +td,th{
189 + padding:0
190 +}
191 +
192 +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{
193 + *,:after,:before{
194 + color:#000!important;
195 + text-shadow:none!important;
196 + background:0 0!important;
197 + -webkit-box-shadow:none!important;
198 + box-shadow:none!important
199 + }
200 +
201 + a,a:visited{
202 + text-decoration:underline
203 + }
204 +
205 + a[href]:after{
206 + content:" (" attr(href) ")"
207 + }
208 +
209 + abbr[title]:after{
210 + content:" (" attr(title) ")"
211 + }
212 +
213 + a[href^="javascript:"]:after,a[href^="#"]:after{
214 + content:""
215 + }
216 +
217 + blockquote,pre{
218 + border:1px solid #999;
219 + page-break-inside:avoid
220 + }
221 +
222 + thead{
223 + display:table-header-group
224 + }
225 +
226 + img,tr{
227 + page-break-inside:avoid
228 + }
229 +
230 + img{
231 + max-width:100%!important
232 + }
233 +
234 + h2,h3,p{
235 + orphans:3;
236 + widows:3
237 + }
238 +
239 + h2,h3{
240 + page-break-after:avoid
241 + }
242 +
243 + .navbar{
244 + display:none
245 + }
246 +
247 + .btn>.caret,.dropup>.btn>.caret{
248 + border-top-color:#000!important
249 + }
250 +
251 + .label{
252 + border:1px solid #000
253 + }
254 +
255 + .table{
256 + border-collapse:collapse!important
257 + }
258 +
259 + .table td,.table th{
260 + background-color:#fff!important
261 + }
262 +
263 + .table-bordered td,.table-bordered th{
264 + border:1px solid #ddd!important
265 + }
266 +
267 +}
268 +
269 +@font-face{
270 + font-family:'Glyphicons Halflings';
271 + src:url(../fonts/glyphicons-halflings-regular.eot);
272 + src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')
273 +}
274 +
275 +.glyphicon{
276 + position:relative;
277 + top:1px;
278 + display:inline-block;
279 + font-family:'Glyphicons Halflings';
280 + font-style:normal;
281 + font-weight:400;
282 + line-height:1;
283 + -webkit-font-smoothing:antialiased;
284 + -moz-osx-font-smoothing:grayscale
285 +}
286 +
287 +.glyphicon-asterisk:before{
288 + content:"\2a"
289 +}
290 +
291 +.glyphicon-plus:before{
292 + content:"\2b"
293 +}
294 +
295 +.glyphicon-eur:before,.glyphicon-euro:before{
296 + content:"\20ac"
297 +}
298 +
299 +.glyphicon-minus:before{
300 + content:"\2212"
301 +}
302 +
303 +.glyphicon-cloud:before{
304 + content:"\2601"
305 +}
306 +
307 +.glyphicon-envelope:before{
308 + content:"\2709"
309 +}
310 +
311 +.glyphicon-pencil:before{
312 + content:"\270f"
313 +}
314 +
315 +.glyphicon-glass:before{
316 + content:"\e001"
317 +}
318 +
319 +.glyphicon-music:before{
320 + content:"\e002"
321 +}
322 +
323 +.glyphicon-search:before{
324 + content:"\e003"
325 +}
326 +
327 +.glyphicon-heart:before{
328 + content:"\e005"
329 +}
330 +
331 +.glyphicon-star:before{
332 + content:"\e006"
333 +}
334 +
335 +.glyphicon-star-empty:before{
336 + content:"\e007"
337 +}
338 +
339 +.glyphicon-user:before{
340 + content:"\e008"
341 +}
342 +
343 +.glyphicon-film:before{
344 + content:"\e009"
345 +}
346 +
347 +.glyphicon-th-large:before{
348 + content:"\e010"
349 +}
350 +
351 +.glyphicon-th:before{
352 + content:"\e011"
353 +}
354 +
355 +.glyphicon-th-list:before{
356 + content:"\e012"
357 +}
358 +
359 +.glyphicon-ok:before{
360 + content:"\e013"
361 +}
362 +
363 +.glyphicon-remove:before{
364 + content:"\e014"
365 +}
366 +
367 +.glyphicon-zoom-in:before{
368 + content:"\e015"
369 +}
370 +
371 +.glyphicon-zoom-out:before{
372 + content:"\e016"
373 +}
374 +
375 +.glyphicon-off:before{
376 + content:"\e017"
377 +}
378 +
379 +.glyphicon-signal:before{
380 + content:"\e018"
381 +}
382 +
383 +.glyphicon-cog:before{
384 + content:"\e019"
385 +}
386 +
387 +.glyphicon-trash:before{
388 + content:"\e020"
389 +}
390 +
391 +.glyphicon-home:before{
392 + content:"\e021"
393 +}
394 +
395 +.glyphicon-file:before{
396 + content:"\e022"
397 +}
398 +
399 +.glyphicon-time:before{
400 + content:"\e023"
401 +}
402 +
403 +.glyphicon-road:before{
404 + content:"\e024"
405 +}
406 +
407 +.glyphicon-download-alt:before{
408 + content:"\e025"
409 +}
410 +
411 +.glyphicon-download:before{
412 + content:"\e026"
413 +}
414 +
415 +.glyphicon-upload:before{
416 + content:"\e027"
417 +}
418 +
419 +.glyphicon-inbox:before{
420 + content:"\e028"
421 +}
422 +
423 +.glyphicon-play-circle:before{
424 + content:"\e029"
425 +}
426 +
427 +.glyphicon-repeat:before{
428 + content:"\e030"
429 +}
430 +
431 +.glyphicon-refresh:before{
432 + content:"\e031"
433 +}
434 +
435 +.glyphicon-list-alt:before{
436 + content:"\e032"
437 +}
438 +
439 +.glyphicon-lock:before{
440 + content:"\e033"
441 +}
442 +
443 +.glyphicon-flag:before{
444 + content:"\e034"
445 +}
446 +
447 +.glyphicon-headphones:before{
448 + content:"\e035"
449 +}
450 +
451 +.glyphicon-volume-off:before{
452 + content:"\e036"
453 +}
454 +
455 +.glyphicon-volume-down:before{
456 + content:"\e037"
457 +}
458 +
459 +.glyphicon-volume-up:before{
460 + content:"\e038"
461 +}
462 +
463 +.glyphicon-qrcode:before{
464 + content:"\e039"
465 +}
466 +
467 +.glyphicon-barcode:before{
468 + content:"\e040"
469 +}
470 +
471 +.glyphicon-tag:before{
472 + content:"\e041"
473 +}
474 +
475 +.glyphicon-tags:before{
476 + content:"\e042"
477 +}
478 +
479 +.glyphicon-book:before{
480 + content:"\e043"
481 +}
482 +
483 +.glyphicon-bookmark:before{
484 + content:"\e044"
485 +}
486 +
487 +.glyphicon-print:before{
488 + content:"\e045"
489 +}
490 +
491 +.glyphicon-camera:before{
492 + content:"\e046"
493 +}
494 +
495 +.glyphicon-font:before{
496 + content:"\e047"
497 +}
498 +
499 +.glyphicon-bold:before{
500 + content:"\e048"
501 +}
502 +
503 +.glyphicon-italic:before{
504 + content:"\e049"
505 +}
506 +
507 +.glyphicon-text-height:before{
508 + content:"\e050"
509 +}
510 +
511 +.glyphicon-text-width:before{
512 + content:"\e051"
513 +}
514 +
515 +.glyphicon-align-left:before{
516 + content:"\e052"
517 +}
518 +
519 +.glyphicon-align-center:before{
520 + content:"\e053"
521 +}
522 +
523 +.glyphicon-align-right:before{
524 + content:"\e054"
525 +}
526 +
527 +.glyphicon-align-justify:before{
528 + content:"\e055"
529 +}
530 +
531 +.glyphicon-list:before{
532 + content:"\e056"
533 +}
534 +
535 +.glyphicon-indent-left:before{
536 + content:"\e057"
537 +}
538 +
539 +.glyphicon-indent-right:before{
540 + content:"\e058"
541 +}
542 +
543 +.glyphicon-facetime-video:before{
544 + content:"\e059"
545 +}
546 +
547 +.glyphicon-picture:before{
548 + content:"\e060"
549 +}
550 +
551 +.glyphicon-map-marker:before{
552 + content:"\e062"
553 +}
554 +
555 +.glyphicon-adjust:before{
556 + content:"\e063"
557 +}
558 +
559 +.glyphicon-tint:before{
560 + content:"\e064"
561 +}
562 +
563 +.glyphicon-edit:before{
564 + content:"\e065"
565 +}
566 +
567 +.glyphicon-share:before{
568 + content:"\e066"
569 +}
570 +
571 +.glyphicon-check:before{
572 + content:"\e067"
573 +}
574 +
575 +.glyphicon-move:before{
576 + content:"\e068"
577 +}
578 +
579 +.glyphicon-step-backward:before{
580 + content:"\e069"
581 +}
582 +
583 +.glyphicon-fast-backward:before{
584 + content:"\e070"
585 +}
586 +
587 +.glyphicon-backward:before{
588 + content:"\e071"
589 +}
590 +
591 +.glyphicon-play:before{
592 + content:"\e072"
593 +}
594 +
595 +.glyphicon-pause:before{
596 + content:"\e073"
597 +}
598 +
599 +.glyphicon-stop:before{
600 + content:"\e074"
601 +}
602 +
603 +.glyphicon-forward:before{
604 + content:"\e075"
605 +}
606 +
607 +.glyphicon-fast-forward:before{
608 + content:"\e076"
609 +}
610 +
611 +.glyphicon-step-forward:before{
612 + content:"\e077"
613 +}
614 +
615 +.glyphicon-eject:before{
616 + content:"\e078"
617 +}
618 +
619 +.glyphicon-chevron-left:before{
620 + content:"\e079"
621 +}
622 +
623 +.glyphicon-chevron-right:before{
624 + content:"\e080"
625 +}
626 +
627 +.glyphicon-plus-sign:before{
628 + content:"\e081"
629 +}
630 +
631 +.glyphicon-minus-sign:before{
632 + content:"\e082"
633 +}
634 +
635 +.glyphicon-remove-sign:before{
636 + content:"\e083"
637 +}
638 +
639 +.glyphicon-ok-sign:before{
640 + content:"\e084"
641 +}
642 +
643 +.glyphicon-question-sign:before{
644 + content:"\e085"
645 +}
646 +
647 +.glyphicon-info-sign:before{
648 + content:"\e086"
649 +}
650 +
651 +.glyphicon-screenshot:before{
652 + content:"\e087"
653 +}
654 +
655 +.glyphicon-remove-circle:before{
656 + content:"\e088"
657 +}
658 +
659 +.glyphicon-ok-circle:before{
660 + content:"\e089"
661 +}
662 +
663 +.glyphicon-ban-circle:before{
664 + content:"\e090"
665 +}
666 +
667 +.glyphicon-arrow-left:before{
668 + content:"\e091"
669 +}
670 +
671 +.glyphicon-arrow-right:before{
672 + content:"\e092"
673 +}
674 +
675 +.glyphicon-arrow-up:before{
676 + content:"\e093"
677 +}
678 +
679 +.glyphicon-arrow-down:before{
680 + content:"\e094"
681 +}
682 +
683 +.glyphicon-share-alt:before{
684 + content:"\e095"
685 +}
686 +
687 +.glyphicon-resize-full:before{
688 + content:"\e096"
689 +}
690 +
691 +.glyphicon-resize-small:before{
692 + content:"\e097"
693 +}
694 +
695 +.glyphicon-exclamation-sign:before{
696 + content:"\e101"
697 +}
698 +
699 +.glyphicon-gift:before{
700 + content:"\e102"
701 +}
702 +
703 +.glyphicon-leaf:before{
704 + content:"\e103"
705 +}
706 +
707 +.glyphicon-fire:before{
708 + content:"\e104"
709 +}
710 +
711 +.glyphicon-eye-open:before{
712 + content:"\e105"
713 +}
714 +
715 +.glyphicon-eye-close:before{
716 + content:"\e106"
717 +}
718 +
719 +.glyphicon-warning-sign:before{
720 + content:"\e107"
721 +}
722 +
723 +.glyphicon-plane:before{
724 + content:"\e108"
725 +}
726 +
727 +.glyphicon-calendar:before{
728 + content:"\e109"
729 +}
730 +
731 +.glyphicon-random:before{
732 + content:"\e110"
733 +}
734 +
735 +.glyphicon-comment:before{
736 + content:"\e111"
737 +}
738 +
739 +.glyphicon-magnet:before{
740 + content:"\e112"
741 +}
742 +
743 +.glyphicon-chevron-up:before{
744 + content:"\e113"
745 +}
746 +
747 +.glyphicon-chevron-down:before{
748 + content:"\e114"
749 +}
750 +
751 +.glyphicon-retweet:before{
752 + content:"\e115"
753 +}
754 +
755 +.glyphicon-shopping-cart:before{
756 + content:"\e116"
757 +}
758 +
759 +.glyphicon-folder-close:before{
760 + content:"\e117"
761 +}
762 +
763 +.glyphicon-folder-open:before{
764 + content:"\e118"
765 +}
766 +
767 +.glyphicon-resize-vertical:before{
768 + content:"\e119"
769 +}
770 +
771 +.glyphicon-resize-horizontal:before{
772 + content:"\e120"
773 +}
774 +
775 +.glyphicon-hdd:before{
776 + content:"\e121"
777 +}
778 +
779 +.glyphicon-bullhorn:before{
780 + content:"\e122"
781 +}
782 +
783 +.glyphicon-bell:before{
784 + content:"\e123"
785 +}
786 +
787 +.glyphicon-certificate:before{
788 + content:"\e124"
789 +}
790 +
791 +.glyphicon-thumbs-up:before{
792 + content:"\e125"
793 +}
794 +
795 +.glyphicon-thumbs-down:before{
796 + content:"\e126"
797 +}
798 +
799 +.glyphicon-hand-right:before{
800 + content:"\e127"
801 +}
802 +
803 +.glyphicon-hand-left:before{
804 + content:"\e128"
805 +}
806 +
807 +.glyphicon-hand-up:before{
808 + content:"\e129"
809 +}
810 +
811 +.glyphicon-hand-down:before{
812 + content:"\e130"
813 +}
814 +
815 +.glyphicon-circle-arrow-right:before{
816 + content:"\e131"
817 +}
818 +
819 +.glyphicon-circle-arrow-left:before{
820 + content:"\e132"
821 +}
822 +
823 +.glyphicon-circle-arrow-up:before{
824 + content:"\e133"
825 +}
826 +
827 +.glyphicon-circle-arrow-down:before{
828 + content:"\e134"
829 +}
830 +
831 +.glyphicon-globe:before{
832 + content:"\e135"
833 +}
834 +
835 +.glyphicon-wrench:before{
836 + content:"\e136"
837 +}
838 +
839 +.glyphicon-tasks:before{
840 + content:"\e137"
841 +}
842 +
843 +.glyphicon-filter:before{
844 + content:"\e138"
845 +}
846 +
847 +.glyphicon-briefcase:before{
848 + content:"\e139"
849 +}
850 +
851 +.glyphicon-fullscreen:before{
852 + content:"\e140"
853 +}
854 +
855 +.glyphicon-dashboard:before{
856 + content:"\e141"
857 +}
858 +
859 +.glyphicon-paperclip:before{
860 + content:"\e142"
861 +}
862 +
863 +.glyphicon-heart-empty:before{
864 + content:"\e143"
865 +}
866 +
867 +.glyphicon-link:before{
868 + content:"\e144"
869 +}
870 +
871 +.glyphicon-phone:before{
872 + content:"\e145"
873 +}
874 +
875 +.glyphicon-pushpin:before{
876 + content:"\e146"
877 +}
878 +
879 +.glyphicon-usd:before{
880 + content:"\e148"
881 +}
882 +
883 +.glyphicon-gbp:before{
884 + content:"\e149"
885 +}
886 +
887 +.glyphicon-sort:before{
888 + content:"\e150"
889 +}
890 +
891 +.glyphicon-sort-by-alphabet:before{
892 + content:"\e151"
893 +}
894 +
895 +.glyphicon-sort-by-alphabet-alt:before{
896 + content:"\e152"
897 +}
898 +
899 +.glyphicon-sort-by-order:before{
900 + content:"\e153"
901 +}
902 +
903 +.glyphicon-sort-by-order-alt:before{
904 + content:"\e154"
905 +}
906 +
907 +.glyphicon-sort-by-attributes:before{
908 + content:"\e155"
909 +}
910 +
911 +.glyphicon-sort-by-attributes-alt:before{
912 + content:"\e156"
913 +}
914 +
915 +.glyphicon-unchecked:before{
916 + content:"\e157"
917 +}
918 +
919 +.glyphicon-expand:before{
920 + content:"\e158"
921 +}
922 +
923 +.glyphicon-collapse-down:before{
924 + content:"\e159"
925 +}
926 +
927 +.glyphicon-collapse-up:before{
928 + content:"\e160"
929 +}
930 +
931 +.glyphicon-log-in:before{
932 + content:"\e161"
933 +}
934 +
935 +.glyphicon-flash:before{
936 + content:"\e162"
937 +}
938 +
939 +.glyphicon-log-out:before{
940 + content:"\e163"
941 +}
942 +
943 +.glyphicon-new-window:before{
944 + content:"\e164"
945 +}
946 +
947 +.glyphicon-record:before{
948 + content:"\e165"
949 +}
950 +
951 +.glyphicon-save:before{
952 + content:"\e166"
953 +}
954 +
955 +.glyphicon-open:before{
956 + content:"\e167"
957 +}
958 +
959 +.glyphicon-saved:before{
960 + content:"\e168"
961 +}
962 +
963 +.glyphicon-import:before{
964 + content:"\e169"
965 +}
966 +
967 +.glyphicon-export:before{
968 + content:"\e170"
969 +}
970 +
971 +.glyphicon-send:before{
972 + content:"\e171"
973 +}
974 +
975 +.glyphicon-floppy-disk:before{
976 + content:"\e172"
977 +}
978 +
979 +.glyphicon-floppy-saved:before{
980 + content:"\e173"
981 +}
982 +
983 +.glyphicon-floppy-remove:before{
984 + content:"\e174"
985 +}
986 +
987 +.glyphicon-floppy-save:before{
988 + content:"\e175"
989 +}
990 +
991 +.glyphicon-floppy-open:before{
992 + content:"\e176"
993 +}
994 +
995 +.glyphicon-credit-card:before{
996 + content:"\e177"
997 +}
998 +
999 +.glyphicon-transfer:before{
1000 + content:"\e178"
1001 +}
1002 +
1003 +.glyphicon-cutlery:before{
1004 + content:"\e179"
1005 +}
1006 +
1007 +.glyphicon-header:before{
1008 + content:"\e180"
1009 +}
1010 +
1011 +.glyphicon-compressed:before{
1012 + content:"\e181"
1013 +}
1014 +
1015 +.glyphicon-earphone:before{
1016 + content:"\e182"
1017 +}
1018 +
1019 +.glyphicon-phone-alt:before{
1020 + content:"\e183"
1021 +}
1022 +
1023 +.glyphicon-tower:before{
1024 + content:"\e184"
1025 +}
1026 +
1027 +.glyphicon-stats:before{
1028 + content:"\e185"
1029 +}
1030 +
1031 +.glyphicon-sd-video:before{
1032 + content:"\e186"
1033 +}
1034 +
1035 +.glyphicon-hd-video:before{
1036 + content:"\e187"
1037 +}
1038 +
1039 +.glyphicon-subtitles:before{
1040 + content:"\e188"
1041 +}
1042 +
1043 +.glyphicon-sound-stereo:before{
1044 + content:"\e189"
1045 +}
1046 +
1047 +.glyphicon-sound-dolby:before{
1048 + content:"\e190"
1049 +}
1050 +
1051 +.glyphicon-sound-5-1:before{
1052 + content:"\e191"
1053 +}
1054 +
1055 +.glyphicon-sound-6-1:before{
1056 + content:"\e192"
1057 +}
1058 +
1059 +.glyphicon-sound-7-1:before{
1060 + content:"\e193"
1061 +}
1062 +
1063 +.glyphicon-copyright-mark:before{
1064 + content:"\e194"
1065 +}
1066 +
1067 +.glyphicon-registration-mark:before{
1068 + content:"\e195"
1069 +}
1070 +
1071 +.glyphicon-cloud-download:before{
1072 + content:"\e197"
1073 +}
1074 +
1075 +.glyphicon-cloud-upload:before{
1076 + content:"\e198"
1077 +}
1078 +
1079 +.glyphicon-tree-conifer:before{
1080 + content:"\e199"
1081 +}
1082 +
1083 +.glyphicon-tree-deciduous:before{
1084 + content:"\e200"
1085 +}
1086 +
1087 +.glyphicon-cd:before{
1088 + content:"\e201"
1089 +}
1090 +
1091 +.glyphicon-save-file:before{
1092 + content:"\e202"
1093 +}
1094 +
1095 +.glyphicon-open-file:before{
1096 + content:"\e203"
1097 +}
1098 +
1099 +.glyphicon-level-up:before{
1100 + content:"\e204"
1101 +}
1102 +
1103 +.glyphicon-copy:before{
1104 + content:"\e205"
1105 +}
1106 +
1107 +.glyphicon-paste:before{
1108 + content:"\e206"
1109 +}
1110 +
1111 +.glyphicon-alert:before{
1112 + content:"\e209"
1113 +}
1114 +
1115 +.glyphicon-equalizer:before{
1116 + content:"\e210"
1117 +}
1118 +
1119 +.glyphicon-king:before{
1120 + content:"\e211"
1121 +}
1122 +
1123 +.glyphicon-queen:before{
1124 + content:"\e212"
1125 +}
1126 +
1127 +.glyphicon-pawn:before{
1128 + content:"\e213"
1129 +}
1130 +
1131 +.glyphicon-bishop:before{
1132 + content:"\e214"
1133 +}
1134 +
1135 +.glyphicon-knight:before{
1136 + content:"\e215"
1137 +}
1138 +
1139 +.glyphicon-baby-formula:before{
1140 + content:"\e216"
1141 +}
1142 +
1143 +.glyphicon-tent:before{
1144 + content:"\26fa"
1145 +}
1146 +
1147 +.glyphicon-blackboard:before{
1148 + content:"\e218"
1149 +}
1150 +
1151 +.glyphicon-bed:before{
1152 + content:"\e219"
1153 +}
1154 +
1155 +.glyphicon-apple:before{
1156 + content:"\f8ff"
1157 +}
1158 +
1159 +.glyphicon-erase:before{
1160 + content:"\e221"
1161 +}
1162 +
1163 +.glyphicon-hourglass:before{
1164 + content:"\231b"
1165 +}
1166 +
1167 +.glyphicon-lamp:before{
1168 + content:"\e223"
1169 +}
1170 +
1171 +.glyphicon-duplicate:before{
1172 + content:"\e224"
1173 +}
1174 +
1175 +.glyphicon-piggy-bank:before{
1176 + content:"\e225"
1177 +}
1178 +
1179 +.glyphicon-scissors:before{
1180 + content:"\e226"
1181 +}
1182 +
1183 +.glyphicon-bitcoin:before{
1184 + content:"\e227"
1185 +}
1186 +
1187 +.glyphicon-btc:before{
1188 + content:"\e227"
1189 +}
1190 +
1191 +.glyphicon-xbt:before{
1192 + content:"\e227"
1193 +}
1194 +
1195 +.glyphicon-yen:before{
1196 + content:"\00a5"
1197 +}
1198 +
1199 +.glyphicon-jpy:before{
1200 + content:"\00a5"
1201 +}
1202 +
1203 +.glyphicon-ruble:before{
1204 + content:"\20bd"
1205 +}
1206 +
1207 +.glyphicon-rub:before{
1208 + content:"\20bd"
1209 +}
1210 +
1211 +.glyphicon-scale:before{
1212 + content:"\e230"
1213 +}
1214 +
1215 +.glyphicon-ice-lolly:before{
1216 + content:"\e231"
1217 +}
1218 +
1219 +.glyphicon-ice-lolly-tasted:before{
1220 + content:"\e232"
1221 +}
1222 +
1223 +.glyphicon-education:before{
1224 + content:"\e233"
1225 +}
1226 +
1227 +.glyphicon-option-horizontal:before{
1228 + content:"\e234"
1229 +}
1230 +
1231 +.glyphicon-option-vertical:before{
1232 + content:"\e235"
1233 +}
1234 +
1235 +.glyphicon-menu-hamburger:before{
1236 + content:"\e236"
1237 +}
1238 +
1239 +.glyphicon-modal-window:before{
1240 + content:"\e237"
1241 +}
1242 +
1243 +.glyphicon-oil:before{
1244 + content:"\e238"
1245 +}
1246 +
1247 +.glyphicon-grain:before{
1248 + content:"\e239"
1249 +}
1250 +
1251 +.glyphicon-sunglasses:before{
1252 + content:"\e240"
1253 +}
1254 +
1255 +.glyphicon-text-size:before{
1256 + content:"\e241"
1257 +}
1258 +
1259 +.glyphicon-text-color:before{
1260 + content:"\e242"
1261 +}
1262 +
1263 +.glyphicon-text-background:before{
1264 + content:"\e243"
1265 +}
1266 +
1267 +.glyphicon-object-align-top:before{
1268 + content:"\e244"
1269 +}
1270 +
1271 +.glyphicon-object-align-bottom:before{
1272 + content:"\e245"
1273 +}
1274 +
1275 +.glyphicon-object-align-horizontal:before{
1276 + content:"\e246"
1277 +}
1278 +
1279 +.glyphicon-object-align-left:before{
1280 + content:"\e247"
1281 +}
1282 +
1283 +.glyphicon-object-align-vertical:before{
1284 + content:"\e248"
1285 +}
1286 +
1287 +.glyphicon-object-align-right:before{
1288 + content:"\e249"
1289 +}
1290 +
1291 +.glyphicon-triangle-right:before{
1292 + content:"\e250"
1293 +}
1294 +
1295 +.glyphicon-triangle-left:before{
1296 + content:"\e251"
1297 +}
1298 +
1299 +.glyphicon-triangle-bottom:before{
1300 + content:"\e252"
1301 +}
1302 +
1303 +.glyphicon-triangle-top:before{
1304 + content:"\e253"
1305 +}
1306 +
1307 +.glyphicon-console:before{
1308 + content:"\e254"
1309 +}
1310 +
1311 +.glyphicon-superscript:before{
1312 + content:"\e255"
1313 +}
1314 +
1315 +.glyphicon-subscript:before{
1316 + content:"\e256"
1317 +}
1318 +
1319 +.glyphicon-menu-left:before{
1320 + content:"\e257"
1321 +}
1322 +
1323 +.glyphicon-menu-right:before{
1324 + content:"\e258"
1325 +}
1326 +
1327 +.glyphicon-menu-down:before{
1328 + content:"\e259"
1329 +}
1330 +
1331 +.glyphicon-menu-up:before{
1332 + content:"\e260"
1333 +}
1334 +
1335 +*{
1336 + -webkit-box-sizing:border-box;
1337 + -moz-box-sizing:border-box;
1338 + box-sizing:border-box
1339 +}
1340 +
1341 +:after,:before{
1342 + -webkit-box-sizing:border-box;
1343 + -moz-box-sizing:border-box;
1344 + box-sizing:border-box
1345 +}
1346 +
1347 +html{
1348 + font-size:10px;
1349 + -webkit-tap-highlight-color:rgba(0,0,0,0)
1350 +}
1351 +
1352 +body{
1353 + font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
1354 + font-size:14px;
1355 + line-height:1.42857143;
1356 + color:#333;
1357 + background-color:#fff
1358 +}
1359 +
1360 +button,input,select,textarea{
1361 + font-family:inherit;
1362 + font-size:inherit;
1363 + line-height:inherit
1364 +}
1365 +
1366 +a{
1367 + color:#337ab7;
1368 + text-decoration:none
1369 +}
1370 +
1371 +a:focus,a:hover{
1372 + color:#23527c;
1373 + text-decoration:underline
1374 +}
1375 +
1376 +a:focus{
1377 + outline:thin dotted;
1378 + outline:5px auto -webkit-focus-ring-color;
1379 + outline-offset:-2px
1380 +}
1381 +
1382 +figure{
1383 + margin:0
1384 +}
1385 +
1386 +img{
1387 + vertical-align:middle
1388 +}
1389 +
1390 +.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{
1391 + display:block;
1392 + max-width:100%;
1393 + height:auto
1394 +}
1395 +
1396 +.img-rounded{
1397 + border-radius:6px
1398 +}
1399 +
1400 +.img-thumbnail{
1401 + display:inline-block;
1402 + max-width:100%;
1403 + height:auto;
1404 + padding:4px;
1405 + line-height:1.42857143;
1406 + background-color:#fff;
1407 + border:1px solid #ddd;
1408 + border-radius:4px;
1409 + -webkit-transition:all .2s ease-in-out;
1410 + -o-transition:all .2s ease-in-out;
1411 + transition:all .2s ease-in-out
1412 +}
1413 +
1414 +.img-circle{
1415 + border-radius:50%
1416 +}
1417 +
1418 +hr{
1419 + margin-top:20px;
1420 + margin-bottom:20px;
1421 + border:0;
1422 + border-top:1px solid #eee
1423 +}
1424 +
1425 +.sr-only{
1426 + position:absolute;
1427 + width:1px;
1428 + height:1px;
1429 + padding:0;
1430 + margin:-1px;
1431 + overflow:hidden;
1432 + clip:rect(0,0,0,0);
1433 + border:0
1434 +}
1435 +
1436 +.sr-only-focusable:active,.sr-only-focusable:focus{
1437 + position:static;
1438 + width:auto;
1439 + height:auto;
1440 + margin:0;
1441 + overflow:visible;
1442 + clip:auto
1443 +}
1444 +
1445 +[role=button]{
1446 + cursor:pointer
1447 +}
1448 +
1449 +.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{
1450 + font-family:inherit;
1451 + font-weight:500;
1452 + line-height:1.1;
1453 + color:inherit
1454 +}
1455 +
1456 +.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{
1457 + font-weight:400;
1458 + line-height:1;
1459 + color:#777
1460 +}
1461 +
1462 +.h1,.h2,.h3,h1,h2,h3{
1463 + margin-top:20px;
1464 + margin-bottom:10px
1465 +}
1466 +
1467 +.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{
1468 + font-size:65%
1469 +}
1470 +
1471 +.h4,.h5,.h6,h4,h5,h6{
1472 + margin-top:10px;
1473 + margin-bottom:10px
1474 +}
1475 +
1476 +.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{
1477 + font-size:75%
1478 +}
1479 +
1480 +.h1,h1{
1481 + font-size:36px
1482 +}
1483 +
1484 +.h2,h2{
1485 + font-size:30px
1486 +}
1487 +
1488 +.h3,h3{
1489 + font-size:24px
1490 +}
1491 +
1492 +.h4,h4{
1493 + font-size:18px
1494 +}
1495 +
1496 +.h5,h5{
1497 + font-size:14px
1498 +}
1499 +
1500 +.h6,h6{
1501 + font-size:12px
1502 +}
1503 +
1504 +p{
1505 + margin:0 0 10px
1506 +}
1507 +
1508 +.lead{
1509 + margin-bottom:20px;
1510 + font-size:16px;
1511 + font-weight:300;
1512 + line-height:1.4
1513 +}
1514 +
1515 +@media (min-width:768px){
1516 + .lead{
1517 + font-size:21px
1518 + }
1519 +
1520 +}
1521 +
1522 +.small,small{
1523 + font-size:85%
1524 +}
1525 +
1526 +.mark,mark{
1527 + padding:.2em;
1528 + background-color:#fcf8e3
1529 +}
1530 +
1531 +.text-left{
1532 + text-align:left
1533 +}
1534 +
1535 +.text-right{
1536 + text-align:right
1537 +}
1538 +
1539 +.text-center{
1540 + text-align:center
1541 +}
1542 +
1543 +.text-justify{
1544 + text-align:justify
1545 +}
1546 +
1547 +.text-nowrap{
1548 + white-space:nowrap
1549 +}
1550 +
1551 +.text-lowercase{
1552 + text-transform:lowercase
1553 +}
1554 +
1555 +.text-uppercase{
1556 + text-transform:uppercase
1557 +}
1558 +
1559 +.text-capitalize{
1560 + text-transform:capitalize
1561 +}
1562 +
1563 +.text-muted{
1564 + color:#777
1565 +}
1566 +
1567 +.text-primary{
1568 + color:#337ab7
1569 +}
1570 +
1571 +a.text-primary:focus,a.text-primary:hover{
1572 + color:#286090
1573 +}
1574 +
1575 +.text-success{
1576 + color:#3c763d
1577 +}
1578 +
1579 +a.text-success:focus,a.text-success:hover{
1580 + color:#2b542c
1581 +}
1582 +
1583 +.text-info{
1584 + color:#31708f
1585 +}
1586 +
1587 +a.text-info:focus,a.text-info:hover{
1588 + color:#245269
1589 +}
1590 +
1591 +.text-warning{
1592 + color:#8a6d3b
1593 +}
1594 +
1595 +a.text-warning:focus,a.text-warning:hover{
1596 + color:#66512c
1597 +}
1598 +
1599 +.text-danger{
1600 + color:#a94442
1601 +}
1602 +
1603 +a.text-danger:focus,a.text-danger:hover{
1604 + color:#843534
1605 +}
1606 +
1607 +.bg-primary{
1608 + color:#fff;
1609 + background-color:#337ab7
1610 +}
1611 +
1612 +a.bg-primary:focus,a.bg-primary:hover{
1613 + background-color:#286090
1614 +}
1615 +
1616 +.bg-success{
1617 + background-color:#dff0d8
1618 +}
1619 +
1620 +a.bg-success:focus,a.bg-success:hover{
1621 + background-color:#c1e2b3
1622 +}
1623 +
1624 +.bg-info{
1625 + background-color:#d9edf7
1626 +}
1627 +
1628 +a.bg-info:focus,a.bg-info:hover{
1629 + background-color:#afd9ee
1630 +}
1631 +
1632 +.bg-warning{
1633 + background-color:#fcf8e3
1634 +}
1635 +
1636 +a.bg-warning:focus,a.bg-warning:hover{
1637 + background-color:#f7ecb5
1638 +}
1639 +
1640 +.bg-danger{
1641 + background-color:#f2dede
1642 +}
1643 +
1644 +a.bg-danger:focus,a.bg-danger:hover{
1645 + background-color:#e4b9b9
1646 +}
1647 +
1648 +.page-header{
1649 + padding-bottom:9px;
1650 + margin:40px 0 20px;
1651 + border-bottom:1px solid #eee
1652 +}
1653 +
1654 +ol,ul{
1655 + margin-top:0;
1656 + margin-bottom:10px
1657 +}
1658 +
1659 +ol ol,ol ul,ul ol,ul ul{
1660 + margin-bottom:0
1661 +}
1662 +
1663 +.list-unstyled{
1664 + padding-left:0;
1665 + list-style:none
1666 +}
1667 +
1668 +.list-inline{
1669 + padding-left:0;
1670 + margin-left:-5px;
1671 + list-style:none
1672 +}
1673 +
1674 +.list-inline>li{
1675 + display:inline-block;
1676 + padding-right:5px;
1677 + padding-left:5px
1678 +}
1679 +
1680 +dl{
1681 + margin-top:0;
1682 + margin-bottom:20px
1683 +}
1684 +
1685 +dd,dt{
1686 + line-height:1.42857143
1687 +}
1688 +
1689 +dt{
1690 + font-weight:700
1691 +}
1692 +
1693 +dd{
1694 + margin-left:0
1695 +}
1696 +
1697 +@media (min-width:768px){
1698 + .dl-horizontal dt{
1699 + float:left;
1700 + width:160px;
1701 + overflow:hidden;
1702 + clear:left;
1703 + text-align:right;
1704 + text-overflow:ellipsis;
1705 + white-space:nowrap
1706 + }
1707 +
1708 + .dl-horizontal dd{
1709 + margin-left:180px
1710 + }
1711 +
1712 +}
1713 +
1714 +abbr[data-original-title],abbr[title]{
1715 + cursor:help;
1716 + border-bottom:1px dotted #777
1717 +}
1718 +
1719 +.initialism{
1720 + font-size:90%;
1721 + text-transform:uppercase
1722 +}
1723 +
1724 +blockquote{
1725 + padding:10px 20px;
1726 + margin:0 0 20px;
1727 + font-size:17.5px;
1728 + border-left:5px solid #eee
1729 +}
1730 +
1731 +blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{
1732 + margin-bottom:0
1733 +}
1734 +
1735 +blockquote .small,blockquote footer,blockquote small{
1736 + display:block;
1737 + font-size:80%;
1738 + line-height:1.42857143;
1739 + color:#777
1740 +}
1741 +
1742 +blockquote .small:before,blockquote footer:before,blockquote small:before{
1743 + content:'\2014 \00A0'
1744 +}
1745 +
1746 +.blockquote-reverse,blockquote.pull-right{
1747 + padding-right:15px;
1748 + padding-left:0;
1749 + text-align:right;
1750 + border-right:5px solid #eee;
1751 + border-left:0
1752 +}
1753 +
1754 +.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{
1755 + content:''
1756 +}
1757 +
1758 +.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{
1759 + content:'\00A0 \2014'
1760 +}
1761 +
1762 +address{
1763 + margin-bottom:20px;
1764 + font-style:normal;
1765 + line-height:1.42857143
1766 +}
1767 +
1768 +code,kbd,pre,samp{
1769 + font-family:Menlo,Monaco,Consolas,"Courier New",monospace
1770 +}
1771 +
1772 +code{
1773 + padding:2px 4px;
1774 + font-size:90%;
1775 + color:#c7254e;
1776 + background-color:#f9f2f4;
1777 + border-radius:4px
1778 +}
1779 +
1780 +kbd{
1781 + padding:2px 4px;
1782 + font-size:90%;
1783 + color:#fff;
1784 + background-color:#333;
1785 + border-radius:3px;
1786 + -webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);
1787 + box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)
1788 +}
1789 +
1790 +kbd kbd{
1791 + padding:0;
1792 + font-size:100%;
1793 + font-weight:700;
1794 + -webkit-box-shadow:none;
1795 + box-shadow:none
1796 +}
1797 +
1798 +pre{
1799 + display:block;
1800 + padding:9.5px;
1801 + margin:0 0 10px;
1802 + font-size:13px;
1803 + line-height:1.42857143;
1804 + color:#333;
1805 + word-break:break-all;
1806 + word-wrap:break-word;
1807 + background-color:#f5f5f5;
1808 + border:1px solid #ccc;
1809 + border-radius:4px
1810 +}
1811 +
1812 +pre code{
1813 + padding:0;
1814 + font-size:inherit;
1815 + color:inherit;
1816 + white-space:pre-wrap;
1817 + background-color:transparent;
1818 + border-radius:0
1819 +}
1820 +
1821 +.pre-scrollable{
1822 + max-height:340px;
1823 + overflow-y:scroll
1824 +}
1825 +
1826 +.container{
1827 + padding-right:15px;
1828 + padding-left:15px;
1829 + margin-right:auto;
1830 + margin-left:auto
1831 +}
1832 +
1833 +@media (min-width:768px){
1834 + .container{
1835 + width:750px
1836 + }
1837 +
1838 +}
1839 +
1840 +@media (min-width:992px){
1841 + .container{
1842 + width:970px
1843 + }
1844 +
1845 +}
1846 +
1847 +@media (min-width:1200px){
1848 + .container{
1849 + width:1170px
1850 + }
1851 +
1852 +}
1853 +
1854 +.container-fluid{
1855 + padding-right:15px;
1856 + padding-left:15px;
1857 + margin-right:auto;
1858 + margin-left:auto
1859 +}
1860 +
1861 +.row{
1862 + margin-right:-15px;
1863 + margin-left:-15px
1864 +}
1865 +
1866 +.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{
1867 + position:relative;
1868 + min-height:1px;
1869 + padding-right:15px;
1870 + padding-left:15px
1871 +}
1872 +
1873 +.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{
1874 + float:left
1875 +}
1876 +
1877 +.col-xs-12{
1878 + width:100%
1879 +}
1880 +
1881 +.col-xs-11{
1882 + width:91.66666667%
1883 +}
1884 +
1885 +.col-xs-10{
1886 + width:83.33333333%
1887 +}
1888 +
1889 +.col-xs-9{
1890 + width:75%
1891 +}
1892 +
1893 +.col-xs-8{
1894 + width:66.66666667%
1895 +}
1896 +
1897 +.col-xs-7{
1898 + width:58.33333333%
1899 +}
1900 +
1901 +.col-xs-6{
1902 + width:50%
1903 +}
1904 +
1905 +.col-xs-5{
1906 + width:41.66666667%
1907 +}
1908 +
1909 +.col-xs-4{
1910 + width:33.33333333%
1911 +}
1912 +
1913 +.col-xs-3{
1914 + width:25%
1915 +}
1916 +
1917 +.col-xs-2{
1918 + width:16.66666667%
1919 +}
1920 +
1921 +.col-xs-1{
1922 + width:8.33333333%
1923 +}
1924 +
1925 +.col-xs-pull-12{
1926 + right:100%
1927 +}
1928 +
1929 +.col-xs-pull-11{
1930 + right:91.66666667%
1931 +}
1932 +
1933 +.col-xs-pull-10{
1934 + right:83.33333333%
1935 +}
1936 +
1937 +.col-xs-pull-9{
1938 + right:75%
1939 +}
1940 +
1941 +.col-xs-pull-8{
1942 + right:66.66666667%
1943 +}
1944 +
1945 +.col-xs-pull-7{
1946 + right:58.33333333%
1947 +}
1948 +
1949 +.col-xs-pull-6{
1950 + right:50%
1951 +}
1952 +
1953 +.col-xs-pull-5{
1954 + right:41.66666667%
1955 +}
1956 +
1957 +.col-xs-pull-4{
1958 + right:33.33333333%
1959 +}
1960 +
1961 +.col-xs-pull-3{
1962 + right:25%
1963 +}
1964 +
1965 +.col-xs-pull-2{
1966 + right:16.66666667%
1967 +}
1968 +
1969 +.col-xs-pull-1{
1970 + right:8.33333333%
1971 +}
1972 +
1973 +.col-xs-pull-0{
1974 + right:auto
1975 +}
1976 +
1977 +.col-xs-push-12{
1978 + left:100%
1979 +}
1980 +
1981 +.col-xs-push-11{
1982 + left:91.66666667%
1983 +}
1984 +
1985 +.col-xs-push-10{
1986 + left:83.33333333%
1987 +}
1988 +
1989 +.col-xs-push-9{
1990 + left:75%
1991 +}
1992 +
1993 +.col-xs-push-8{
1994 + left:66.66666667%
1995 +}
1996 +
1997 +.col-xs-push-7{
1998 + left:58.33333333%
1999 +}
2000 +
2001 +.col-xs-push-6{
2002 + left:50%
2003 +}
2004 +
2005 +.col-xs-push-5{
2006 + left:41.66666667%
2007 +}
2008 +
2009 +.col-xs-push-4{
2010 + left:33.33333333%
2011 +}
2012 +
2013 +.col-xs-push-3{
2014 + left:25%
2015 +}
2016 +
2017 +.col-xs-push-2{
2018 + left:16.66666667%
2019 +}
2020 +
2021 +.col-xs-push-1{
2022 + left:8.33333333%
2023 +}
2024 +
2025 +.col-xs-push-0{
2026 + left:auto
2027 +}
2028 +
2029 +.col-xs-offset-12{
2030 + margin-left:100%
2031 +}
2032 +
2033 +.col-xs-offset-11{
2034 + margin-left:91.66666667%
2035 +}
2036 +
2037 +.col-xs-offset-10{
2038 + margin-left:83.33333333%
2039 +}
2040 +
2041 +.col-xs-offset-9{
2042 + margin-left:75%
2043 +}
2044 +
2045 +.col-xs-offset-8{
2046 + margin-left:66.66666667%
2047 +}
2048 +
2049 +.col-xs-offset-7{
2050 + margin-left:58.33333333%
2051 +}
2052 +
2053 +.col-xs-offset-6{
2054 + margin-left:50%
2055 +}
2056 +
2057 +.col-xs-offset-5{
2058 + margin-left:41.66666667%
2059 +}
2060 +
2061 +.col-xs-offset-4{
2062 + margin-left:33.33333333%
2063 +}
2064 +
2065 +.col-xs-offset-3{
2066 + margin-left:25%
2067 +}
2068 +
2069 +.col-xs-offset-2{
2070 + margin-left:16.66666667%
2071 +}
2072 +
2073 +.col-xs-offset-1{
2074 + margin-left:8.33333333%
2075 +}
2076 +
2077 +.col-xs-offset-0{
2078 + margin-left:0
2079 +}
2080 +
2081 +@media (min-width:768px){
2082 + .col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{
2083 + float:left
2084 + }
2085 +
2086 + .col-sm-12{
2087 + width:100%
2088 + }
2089 +
2090 + .col-sm-11{
2091 + width:91.66666667%
2092 + }
2093 +
2094 + .col-sm-10{
2095 + width:83.33333333%
2096 + }
2097 +
2098 + .col-sm-9{
2099 + width:75%
2100 + }
2101 +
2102 + .col-sm-8{
2103 + width:66.66666667%
2104 + }
2105 +
2106 + .col-sm-7{
2107 + width:58.33333333%
2108 + }
2109 +
2110 + .col-sm-6{
2111 + width:50%
2112 + }
2113 +
2114 + .col-sm-5{
2115 + width:41.66666667%
2116 + }
2117 +
2118 + .col-sm-4{
2119 + width:33.33333333%
2120 + }
2121 +
2122 + .col-sm-3{
2123 + width:25%
2124 + }
2125 +
2126 + .col-sm-2{
2127 + width:16.66666667%
2128 + }
2129 +
2130 + .col-sm-1{
2131 + width:8.33333333%
2132 + }
2133 +
2134 + .col-sm-pull-12{
2135 + right:100%
2136 + }
2137 +
2138 + .col-sm-pull-11{
2139 + right:91.66666667%
2140 + }
2141 +
2142 + .col-sm-pull-10{
2143 + right:83.33333333%
2144 + }
2145 +
2146 + .col-sm-pull-9{
2147 + right:75%
2148 + }
2149 +
2150 + .col-sm-pull-8{
2151 + right:66.66666667%
2152 + }
2153 +
2154 + .col-sm-pull-7{
2155 + right:58.33333333%
2156 + }
2157 +
2158 + .col-sm-pull-6{
2159 + right:50%
2160 + }
2161 +
2162 + .col-sm-pull-5{
2163 + right:41.66666667%
2164 + }
2165 +
2166 + .col-sm-pull-4{
2167 + right:33.33333333%
2168 + }
2169 +
2170 + .col-sm-pull-3{
2171 + right:25%
2172 + }
2173 +
2174 + .col-sm-pull-2{
2175 + right:16.66666667%
2176 + }
2177 +
2178 + .col-sm-pull-1{
2179 + right:8.33333333%
2180 + }
2181 +
2182 + .col-sm-pull-0{
2183 + right:auto
2184 + }
2185 +
2186 + .col-sm-push-12{
2187 + left:100%
2188 + }
2189 +
2190 + .col-sm-push-11{
2191 + left:91.66666667%
2192 + }
2193 +
2194 + .col-sm-push-10{
2195 + left:83.33333333%
2196 + }
2197 +
2198 + .col-sm-push-9{
2199 + left:75%
2200 + }
2201 +
2202 + .col-sm-push-8{
2203 + left:66.66666667%
2204 + }
2205 +
2206 + .col-sm-push-7{
2207 + left:58.33333333%
2208 + }
2209 +
2210 + .col-sm-push-6{
2211 + left:50%
2212 + }
2213 +
2214 + .col-sm-push-5{
2215 + left:41.66666667%
2216 + }
2217 +
2218 + .col-sm-push-4{
2219 + left:33.33333333%
2220 + }
2221 +
2222 + .col-sm-push-3{
2223 + left:25%
2224 + }
2225 +
2226 + .col-sm-push-2{
2227 + left:16.66666667%
2228 + }
2229 +
2230 + .col-sm-push-1{
2231 + left:8.33333333%
2232 + }
2233 +
2234 + .col-sm-push-0{
2235 + left:auto
2236 + }
2237 +
2238 + .col-sm-offset-12{
2239 + margin-left:100%
2240 + }
2241 +
2242 + .col-sm-offset-11{
2243 + margin-left:91.66666667%
2244 + }
2245 +
2246 + .col-sm-offset-10{
2247 + margin-left:83.33333333%
2248 + }
2249 +
2250 + .col-sm-offset-9{
2251 + margin-left:75%
2252 + }
2253 +
2254 + .col-sm-offset-8{
2255 + margin-left:66.66666667%
2256 + }
2257 +
2258 + .col-sm-offset-7{
2259 + margin-left:58.33333333%
2260 + }
2261 +
2262 + .col-sm-offset-6{
2263 + margin-left:50%
2264 + }
2265 +
2266 + .col-sm-offset-5{
2267 + margin-left:41.66666667%
2268 + }
2269 +
2270 + .col-sm-offset-4{
2271 + margin-left:33.33333333%
2272 + }
2273 +
2274 + .col-sm-offset-3{
2275 + margin-left:25%
2276 + }
2277 +
2278 + .col-sm-offset-2{
2279 + margin-left:16.66666667%
2280 + }
2281 +
2282 + .col-sm-offset-1{
2283 + margin-left:8.33333333%
2284 + }
2285 +
2286 + .col-sm-offset-0{
2287 + margin-left:0
2288 + }
2289 +
2290 +}
2291 +
2292 +@media (min-width:992px){
2293 + .col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{
2294 + float:left
2295 + }
2296 +
2297 + .col-md-12{
2298 + width:100%
2299 + }
2300 +
2301 + .col-md-11{
2302 + width:91.66666667%
2303 + }
2304 +
2305 + .col-md-10{
2306 + width:83.33333333%
2307 + }
2308 +
2309 + .col-md-9{
2310 + width:75%
2311 + }
2312 +
2313 + .col-md-8{
2314 + width:66.66666667%
2315 + }
2316 +
2317 + .col-md-7{
2318 + width:58.33333333%
2319 + }
2320 +
2321 + .col-md-6{
2322 + width:50%
2323 + }
2324 +
2325 + .col-md-5{
2326 + width:41.66666667%
2327 + }
2328 +
2329 + .col-md-4{
2330 + width:33.33333333%
2331 + }
2332 +
2333 + .col-md-3{
2334 + width:25%
2335 + }
2336 +
2337 + .col-md-2{
2338 + width:16.66666667%
2339 + }
2340 +
2341 + .col-md-1{
2342 + width:8.33333333%
2343 + }
2344 +
2345 + .col-md-pull-12{
2346 + right:100%
2347 + }
2348 +
2349 + .col-md-pull-11{
2350 + right:91.66666667%
2351 + }
2352 +
2353 + .col-md-pull-10{
2354 + right:83.33333333%
2355 + }
2356 +
2357 + .col-md-pull-9{
2358 + right:75%
2359 + }
2360 +
2361 + .col-md-pull-8{
2362 + right:66.66666667%
2363 + }
2364 +
2365 + .col-md-pull-7{
2366 + right:58.33333333%
2367 + }
2368 +
2369 + .col-md-pull-6{
2370 + right:50%
2371 + }
2372 +
2373 + .col-md-pull-5{
2374 + right:41.66666667%
2375 + }
2376 +
2377 + .col-md-pull-4{
2378 + right:33.33333333%
2379 + }
2380 +
2381 + .col-md-pull-3{
2382 + right:25%
2383 + }
2384 +
2385 + .col-md-pull-2{
2386 + right:16.66666667%
2387 + }
2388 +
2389 + .col-md-pull-1{
2390 + right:8.33333333%
2391 + }
2392 +
2393 + .col-md-pull-0{
2394 + right:auto
2395 + }
2396 +
2397 + .col-md-push-12{
2398 + left:100%
2399 + }
2400 +
2401 + .col-md-push-11{
2402 + left:91.66666667%
2403 + }
2404 +
2405 + .col-md-push-10{
2406 + left:83.33333333%
2407 + }
2408 +
2409 + .col-md-push-9{
2410 + left:75%
2411 + }
2412 +
2413 + .col-md-push-8{
2414 + left:66.66666667%
2415 + }
2416 +
2417 + .col-md-push-7{
2418 + left:58.33333333%
2419 + }
2420 +
2421 + .col-md-push-6{
2422 + left:50%
2423 + }
2424 +
2425 + .col-md-push-5{
2426 + left:41.66666667%
2427 + }
2428 +
2429 + .col-md-push-4{
2430 + left:33.33333333%
2431 + }
2432 +
2433 + .col-md-push-3{
2434 + left:25%
2435 + }
2436 +
2437 + .col-md-push-2{
2438 + left:16.66666667%
2439 + }
2440 +
2441 + .col-md-push-1{
2442 + left:8.33333333%
2443 + }
2444 +
2445 + .col-md-push-0{
2446 + left:auto
2447 + }
2448 +
2449 + .col-md-offset-12{
2450 + margin-left:100%
2451 + }
2452 +
2453 + .col-md-offset-11{
2454 + margin-left:91.66666667%
2455 + }
2456 +
2457 + .col-md-offset-10{
2458 + margin-left:83.33333333%
2459 + }
2460 +
2461 + .col-md-offset-9{
2462 + margin-left:75%
2463 + }
2464 +
2465 + .col-md-offset-8{
2466 + margin-left:66.66666667%
2467 + }
2468 +
2469 + .col-md-offset-7{
2470 + margin-left:58.33333333%
2471 + }
2472 +
2473 + .col-md-offset-6{
2474 + margin-left:50%
2475 + }
2476 +
2477 + .col-md-offset-5{
2478 + margin-left:41.66666667%
2479 + }
2480 +
2481 + .col-md-offset-4{
2482 + margin-left:33.33333333%
2483 + }
2484 +
2485 + .col-md-offset-3{
2486 + margin-left:25%
2487 + }
2488 +
2489 + .col-md-offset-2{
2490 + margin-left:16.66666667%
2491 + }
2492 +
2493 + .col-md-offset-1{
2494 + margin-left:8.33333333%
2495 + }
2496 +
2497 + .col-md-offset-0{
2498 + margin-left:0
2499 + }
2500 +
2501 +}
2502 +
2503 +@media (min-width:1200px){
2504 + .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{
2505 + float:left
2506 + }
2507 +
2508 + .col-lg-12{
2509 + width:100%
2510 + }
2511 +
2512 + .col-lg-11{
2513 + width:91.66666667%
2514 + }
2515 +
2516 + .col-lg-10{
2517 + width:83.33333333%
2518 + }
2519 +
2520 + .col-lg-9{
2521 + width:75%
2522 + }
2523 +
2524 + .col-lg-8{
2525 + width:66.66666667%
2526 + }
2527 +
2528 + .col-lg-7{
2529 + width:58.33333333%
2530 + }
2531 +
2532 + .col-lg-6{
2533 + width:50%
2534 + }
2535 +
2536 + .col-lg-5{
2537 + width:41.66666667%
2538 + }
2539 +
2540 + .col-lg-4{
2541 + width:33.33333333%
2542 + }
2543 +
2544 + .col-lg-3{
2545 + width:25%
2546 + }
2547 +
2548 + .col-lg-2{
2549 + width:16.66666667%
2550 + }
2551 +
2552 + .col-lg-1{
2553 + width:8.33333333%
2554 + }
2555 +
2556 + .col-lg-pull-12{
2557 + right:100%
2558 + }
2559 +
2560 + .col-lg-pull-11{
2561 + right:91.66666667%
2562 + }
2563 +
2564 + .col-lg-pull-10{
2565 + right:83.33333333%
2566 + }
2567 +
2568 + .col-lg-pull-9{
2569 + right:75%
2570 + }
2571 +
2572 + .col-lg-pull-8{
2573 + right:66.66666667%
2574 + }
2575 +
2576 + .col-lg-pull-7{
2577 + right:58.33333333%
2578 + }
2579 +
2580 + .col-lg-pull-6{
2581 + right:50%
2582 + }
2583 +
2584 + .col-lg-pull-5{
2585 + right:41.66666667%
2586 + }
2587 +
2588 + .col-lg-pull-4{
2589 + right:33.33333333%
2590 + }
2591 +
2592 + .col-lg-pull-3{
2593 + right:25%
2594 + }
2595 +
2596 + .col-lg-pull-2{
2597 + right:16.66666667%
2598 + }
2599 +
2600 + .col-lg-pull-1{
2601 + right:8.33333333%
2602 + }
2603 +
2604 + .col-lg-pull-0{
2605 + right:auto
2606 + }
2607 +
2608 + .col-lg-push-12{
2609 + left:100%
2610 + }
2611 +
2612 + .col-lg-push-11{
2613 + left:91.66666667%
2614 + }
2615 +
2616 + .col-lg-push-10{
2617 + left:83.33333333%
2618 + }
2619 +
2620 + .col-lg-push-9{
2621 + left:75%
2622 + }
2623 +
2624 + .col-lg-push-8{
2625 + left:66.66666667%
2626 + }
2627 +
2628 + .col-lg-push-7{
2629 + left:58.33333333%
2630 + }
2631 +
2632 + .col-lg-push-6{
2633 + left:50%
2634 + }
2635 +
2636 + .col-lg-push-5{
2637 + left:41.66666667%
2638 + }
2639 +
2640 + .col-lg-push-4{
2641 + left:33.33333333%
2642 + }
2643 +
2644 + .col-lg-push-3{
2645 + left:25%
2646 + }
2647 +
2648 + .col-lg-push-2{
2649 + left:16.66666667%
2650 + }
2651 +
2652 + .col-lg-push-1{
2653 + left:8.33333333%
2654 + }
2655 +
2656 + .col-lg-push-0{
2657 + left:auto
2658 + }
2659 +
2660 + .col-lg-offset-12{
2661 + margin-left:100%
2662 + }
2663 +
2664 + .col-lg-offset-11{
2665 + margin-left:91.66666667%
2666 + }
2667 +
2668 + .col-lg-offset-10{
2669 + margin-left:83.33333333%
2670 + }
2671 +
2672 + .col-lg-offset-9{
2673 + margin-left:75%
2674 + }
2675 +
2676 + .col-lg-offset-8{
2677 + margin-left:66.66666667%
2678 + }
2679 +
2680 + .col-lg-offset-7{
2681 + margin-left:58.33333333%
2682 + }
2683 +
2684 + .col-lg-offset-6{
2685 + margin-left:50%
2686 + }
2687 +
2688 + .col-lg-offset-5{
2689 + margin-left:41.66666667%
2690 + }
2691 +
2692 + .col-lg-offset-4{
2693 + margin-left:33.33333333%
2694 + }
2695 +
2696 + .col-lg-offset-3{
2697 + margin-left:25%
2698 + }
2699 +
2700 + .col-lg-offset-2{
2701 + margin-left:16.66666667%
2702 + }
2703 +
2704 + .col-lg-offset-1{
2705 + margin-left:8.33333333%
2706 + }
2707 +
2708 + .col-lg-offset-0{
2709 + margin-left:0
2710 + }
2711 +
2712 +}
2713 +
2714 +table{
2715 + background-color:transparent
2716 +}
2717 +
2718 +caption{
2719 + padding-top:8px;
2720 + padding-bottom:8px;
2721 + color:#777;
2722 + text-align:left
2723 +}
2724 +
2725 +th{
2726 + text-align:left
2727 +}
2728 +
2729 +.table{
2730 + width:100%;
2731 + max-width:100%;
2732 + margin-bottom:20px
2733 +}
2734 +
2735 +.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{
2736 + padding:8px;
2737 + line-height:1.42857143;
2738 + vertical-align:top;
2739 + border-top:1px solid #ddd
2740 +}
2741 +
2742 +.table>thead>tr>th{
2743 + vertical-align:bottom;
2744 + border-bottom:2px solid #ddd
2745 +}
2746 +
2747 +.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{
2748 + border-top:0
2749 +}
2750 +
2751 +.table>tbody+tbody{
2752 + border-top:2px solid #ddd
2753 +}
2754 +
2755 +.table .table{
2756 + background-color:#fff
2757 +}
2758 +
2759 +.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{
2760 + padding:5px
2761 +}
2762 +
2763 +.table-bordered{
2764 + border:1px solid #ddd
2765 +}
2766 +
2767 +.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{
2768 + border:1px solid #ddd
2769 +}
2770 +
2771 +.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{
2772 + border-bottom-width:2px
2773 +}
2774 +
2775 +.table-striped>tbody>tr:nth-of-type(odd){
2776 + background-color:#f9f9f9
2777 +}
2778 +
2779 +.table-hover>tbody>tr:hover{
2780 + background-color:#f5f5f5
2781 +}
2782 +
2783 +table col[class*=col-]{
2784 + position:static;
2785 + display:table-column;
2786 + float:none
2787 +}
2788 +
2789 +table td[class*=col-],table th[class*=col-]{
2790 + position:static;
2791 + display:table-cell;
2792 + float:none
2793 +}
2794 +
2795 +.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{
2796 + background-color:#f5f5f5
2797 +}
2798 +
2799 +.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{
2800 + background-color:#e8e8e8
2801 +}
2802 +
2803 +.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{
2804 + background-color:#dff0d8
2805 +}
2806 +
2807 +.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{
2808 + background-color:#d0e9c6
2809 +}
2810 +
2811 +.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{
2812 + background-color:#d9edf7
2813 +}
2814 +
2815 +.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{
2816 + background-color:#c4e3f3
2817 +}
2818 +
2819 +.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{
2820 + background-color:#fcf8e3
2821 +}
2822 +
2823 +.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{
2824 + background-color:#faf2cc
2825 +}
2826 +
2827 +.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{
2828 + background-color:#f2dede
2829 +}
2830 +
2831 +.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{
2832 + background-color:#ebcccc
2833 +}
2834 +
2835 +.table-responsive{
2836 + min-height:.01%;
2837 + overflow-x:auto
2838 +}
2839 +
2840 +@media screen and (max-width:767px){
2841 + .table-responsive{
2842 + width:100%;
2843 + margin-bottom:15px;
2844 + overflow-y:hidden;
2845 + -ms-overflow-style:-ms-autohiding-scrollbar;
2846 + border:1px solid #ddd
2847 + }
2848 +
2849 + .table-responsive>.table{
2850 + margin-bottom:0
2851 + }
2852 +
2853 + .table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{
2854 + white-space:nowrap
2855 + }
2856 +
2857 + .table-responsive>.table-bordered{
2858 + border:0
2859 + }
2860 +
2861 + .table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{
2862 + border-left:0
2863 + }
2864 +
2865 + .table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{
2866 + border-right:0
2867 + }
2868 +
2869 + .table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{
2870 + border-bottom:0
2871 + }
2872 +
2873 +}
2874 +
2875 +fieldset{
2876 + min-width:0;
2877 + padding:0;
2878 + margin:0;
2879 + border:0
2880 +}
2881 +
2882 +legend{
2883 + display:block;
2884 + width:100%;
2885 + padding:0;
2886 + margin-bottom:20px;
2887 + font-size:21px;
2888 + line-height:inherit;
2889 + color:#333;
2890 + border:0;
2891 + border-bottom:1px solid #e5e5e5
2892 +}
2893 +
2894 +label{
2895 + display:inline-block;
2896 + max-width:100%;
2897 + margin-bottom:5px;
2898 + font-weight:700
2899 +}
2900 +
2901 +input[type=search]{
2902 + -webkit-box-sizing:border-box;
2903 + -moz-box-sizing:border-box;
2904 + box-sizing:border-box
2905 +}
2906 +
2907 +input[type=checkbox],input[type=radio]{
2908 + margin:4px 0 0;
2909 + margin-top:1px\9;
2910 + line-height:normal
2911 +}
2912 +
2913 +input[type=file]{
2914 + display:block
2915 +}
2916 +
2917 +input[type=range]{
2918 + display:block;
2919 + width:100%
2920 +}
2921 +
2922 +select[multiple],select[size]{
2923 + height:auto
2924 +}
2925 +
2926 +input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{
2927 + outline:thin dotted;
2928 + outline:5px auto -webkit-focus-ring-color;
2929 + outline-offset:-2px
2930 +}
2931 +
2932 +output{
2933 + display:block;
2934 + padding-top:7px;
2935 + font-size:14px;
2936 + line-height:1.42857143;
2937 + color:#555
2938 +}
2939 +
2940 +.form-control{
2941 + display:block;
2942 + width:100%;
2943 + height:34px;
2944 + padding:6px 12px;
2945 + font-size:14px;
2946 + line-height:1.42857143;
2947 + color:#555;
2948 + background-color:#fff;
2949 + background-image:none;
2950 + border:1px solid #ccc;
2951 + border-radius:4px;
2952 + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
2953 + box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
2954 + -webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;
2955 + -o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;
2956 + transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s
2957 +}
2958 +
2959 +.form-control:focus{
2960 + border-color:#66afe9;
2961 + outline:0;
2962 + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);
2963 + box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)
2964 +}
2965 +
2966 +.form-control::-moz-placeholder{
2967 + color:#999;
2968 + opacity:1
2969 +}
2970 +
2971 +.form-control:-ms-input-placeholder{
2972 + color:#999
2973 +}
2974 +
2975 +.form-control::-webkit-input-placeholder{
2976 + color:#999
2977 +}
2978 +
2979 +.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{
2980 + background-color:#eee;
2981 + opacity:1
2982 +}
2983 +
2984 +.form-control[disabled],fieldset[disabled] .form-control{
2985 + cursor:not-allowed
2986 +}
2987 +
2988 +textarea.form-control{
2989 + height:auto
2990 +}
2991 +
2992 +input[type=search]{
2993 + -webkit-appearance:none
2994 +}
2995 +
2996 +@media screen and (-webkit-min-device-pixel-ratio:0){
2997 + input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{
2998 + line-height:34px
2999 + }
3000 +
3001 + .input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{
3002 + line-height:30px
3003 + }
3004 +
3005 + .input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{
3006 + line-height:46px
3007 + }
3008 +
3009 +}
3010 +
3011 +.form-group{
3012 + margin-bottom:15px
3013 +}
3014 +
3015 +.checkbox,.radio{
3016 + position:relative;
3017 + display:block;
3018 + margin-top:10px;
3019 + margin-bottom:10px
3020 +}
3021 +
3022 +.checkbox label,.radio label{
3023 + min-height:20px;
3024 + padding-left:20px;
3025 + margin-bottom:0;
3026 + font-weight:400;
3027 + cursor:pointer
3028 +}
3029 +
3030 +.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{
3031 + position:absolute;
3032 + margin-top:4px\9;
3033 + margin-left:-20px
3034 +}
3035 +
3036 +.checkbox+.checkbox,.radio+.radio{
3037 + margin-top:-5px
3038 +}
3039 +
3040 +.checkbox-inline,.radio-inline{
3041 + position:relative;
3042 + display:inline-block;
3043 + padding-left:20px;
3044 + margin-bottom:0;
3045 + font-weight:400;
3046 + vertical-align:middle;
3047 + cursor:pointer
3048 +}
3049 +
3050 +.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{
3051 + margin-top:0;
3052 + margin-left:10px
3053 +}
3054 +
3055 +fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{
3056 + cursor:not-allowed
3057 +}
3058 +
3059 +.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{
3060 + cursor:not-allowed
3061 +}
3062 +
3063 +.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{
3064 + cursor:not-allowed
3065 +}
3066 +
3067 +.form-control-static{
3068 + min-height:34px;
3069 + padding-top:7px;
3070 + padding-bottom:7px;
3071 + margin-bottom:0
3072 +}
3073 +
3074 +.form-control-static.input-lg,.form-control-static.input-sm{
3075 + padding-right:0;
3076 + padding-left:0
3077 +}
3078 +
3079 +.input-sm{
3080 + height:30px;
3081 + padding:5px 10px;
3082 + font-size:12px;
3083 + line-height:1.5;
3084 + border-radius:3px
3085 +}
3086 +
3087 +select.input-sm{
3088 + height:30px;
3089 + line-height:30px
3090 +}
3091 +
3092 +select[multiple].input-sm,textarea.input-sm{
3093 + height:auto
3094 +}
3095 +
3096 +.form-group-sm .form-control{
3097 + height:30px;
3098 + padding:5px 10px;
3099 + font-size:12px;
3100 + line-height:1.5;
3101 + border-radius:3px
3102 +}
3103 +
3104 +.form-group-sm select.form-control{
3105 + height:30px;
3106 + line-height:30px
3107 +}
3108 +
3109 +.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{
3110 + height:auto
3111 +}
3112 +
3113 +.form-group-sm .form-control-static{
3114 + height:30px;
3115 + min-height:32px;
3116 + padding:6px 10px;
3117 + font-size:12px;
3118 + line-height:1.5
3119 +}
3120 +
3121 +.input-lg{
3122 + height:46px;
3123 + padding:10px 16px;
3124 + font-size:18px;
3125 + line-height:1.3333333;
3126 + border-radius:6px
3127 +}
3128 +
3129 +select.input-lg{
3130 + height:46px;
3131 + line-height:46px
3132 +}
3133 +
3134 +select[multiple].input-lg,textarea.input-lg{
3135 + height:auto
3136 +}
3137 +
3138 +.form-group-lg .form-control{
3139 + height:46px;
3140 + padding:10px 16px;
3141 + font-size:18px;
3142 + line-height:1.3333333;
3143 + border-radius:6px
3144 +}
3145 +
3146 +.form-group-lg select.form-control{
3147 + height:46px;
3148 + line-height:46px
3149 +}
3150 +
3151 +.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{
3152 + height:auto
3153 +}
3154 +
3155 +.form-group-lg .form-control-static{
3156 + height:46px;
3157 + min-height:38px;
3158 + padding:11px 16px;
3159 + font-size:18px;
3160 + line-height:1.3333333
3161 +}
3162 +
3163 +.has-feedback{
3164 + position:relative
3165 +}
3166 +
3167 +.has-feedback .form-control{
3168 + padding-right:42.5px
3169 +}
3170 +
3171 +.form-control-feedback{
3172 + position:absolute;
3173 + top:0;
3174 + right:0;
3175 + z-index:2;
3176 + display:block;
3177 + width:34px;
3178 + height:34px;
3179 + line-height:34px;
3180 + text-align:center;
3181 + pointer-events:none
3182 +}
3183 +
3184 +.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{
3185 + width:46px;
3186 + height:46px;
3187 + line-height:46px
3188 +}
3189 +
3190 +.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{
3191 + width:30px;
3192 + height:30px;
3193 + line-height:30px
3194 +}
3195 +
3196 +.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{
3197 + color:#3c763d
3198 +}
3199 +
3200 +.has-success .form-control{
3201 + border-color:#3c763d;
3202 + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
3203 + box-shadow:inset 0 1px 1px rgba(0,0,0,.075)
3204 +}
3205 +
3206 +.has-success .form-control:focus{
3207 + border-color:#2b542c;
3208 + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;
3209 + box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168
3210 +}
3211 +
3212 +.has-success .input-group-addon{
3213 + color:#3c763d;
3214 + background-color:#dff0d8;
3215 + border-color:#3c763d
3216 +}
3217 +
3218 +.has-success .form-control-feedback{
3219 + color:#3c763d
3220 +}
3221 +
3222 +.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{
3223 + color:#8a6d3b
3224 +}
3225 +
3226 +.has-warning .form-control{
3227 + border-color:#8a6d3b;
3228 + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
3229 + box-shadow:inset 0 1px 1px rgba(0,0,0,.075)
3230 +}
3231 +
3232 +.has-warning .form-control:focus{
3233 + border-color:#66512c;
3234 + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;
3235 + box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b
3236 +}
3237 +
3238 +.has-warning .input-group-addon{
3239 + color:#8a6d3b;
3240 + background-color:#fcf8e3;
3241 + border-color:#8a6d3b
3242 +}
3243 +
3244 +.has-warning .form-control-feedback{
3245 + color:#8a6d3b
3246 +}
3247 +
3248 +.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{
3249 + color:#a94442
3250 +}
3251 +
3252 +.has-error .form-control{
3253 + border-color:#a94442;
3254 + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);
3255 + box-shadow:inset 0 1px 1px rgba(0,0,0,.075)
3256 +}
3257 +
3258 +.has-error .form-control:focus{
3259 + border-color:#843534;
3260 + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;
3261 + box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483
3262 +}
3263 +
3264 +.has-error .input-group-addon{
3265 + color:#a94442;
3266 + background-color:#f2dede;
3267 + border-color:#a94442
3268 +}
3269 +
3270 +.has-error .form-control-feedback{
3271 + color:#a94442
3272 +}
3273 +
3274 +.has-feedback label~.form-control-feedback{
3275 + top:25px
3276 +}
3277 +
3278 +.has-feedback label.sr-only~.form-control-feedback{
3279 + top:0
3280 +}
3281 +
3282 +.help-block{
3283 + display:block;
3284 + margin-top:5px;
3285 + margin-bottom:10px;
3286 + color:#737373
3287 +}
3288 +
3289 +@media (min-width:768px){
3290 + .form-inline .form-group{
3291 + display:inline-block;
3292 + margin-bottom:0;
3293 + vertical-align:middle
3294 + }
3295 +
3296 + .form-inline .form-control{
3297 + display:inline-block;
3298 + width:auto;
3299 + vertical-align:middle
3300 + }
3301 +
3302 + .form-inline .form-control-static{
3303 + display:inline-block
3304 + }
3305 +
3306 + .form-inline .input-group{
3307 + display:inline-table;
3308 + vertical-align:middle
3309 + }
3310 +
3311 + .form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{
3312 + width:auto
3313 + }
3314 +
3315 + .form-inline .input-group>.form-control{
3316 + width:100%
3317 + }
3318 +
3319 + .form-inline .control-label{
3320 + margin-bottom:0;
3321 + vertical-align:middle
3322 + }
3323 +
3324 + .form-inline .checkbox,.form-inline .radio{
3325 + display:inline-block;
3326 + margin-top:0;
3327 + margin-bottom:0;
3328 + vertical-align:middle
3329 + }
3330 +
3331 + .form-inline .checkbox label,.form-inline .radio label{
3332 + padding-left:0
3333 + }
3334 +
3335 + .form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{
3336 + position:relative;
3337 + margin-left:0
3338 + }
3339 +
3340 + .form-inline .has-feedback .form-control-feedback{
3341 + top:0
3342 + }
3343 +
3344 +}
3345 +
3346 +.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{
3347 + padding-top:7px;
3348 + margin-top:0;
3349 + margin-bottom:0
3350 +}
3351 +
3352 +.form-horizontal .checkbox,.form-horizontal .radio{
3353 + min-height:27px
3354 +}
3355 +
3356 +.form-horizontal .form-group{
3357 + margin-right:-15px;
3358 + margin-left:-15px
3359 +}
3360 +
3361 +@media (min-width:768px){
3362 + .form-horizontal .control-label{
3363 + padding-top:7px;
3364 + margin-bottom:0;
3365 + text-align:right
3366 + }
3367 +
3368 +}
3369 +
3370 +.form-horizontal .has-feedback .form-control-feedback{
3371 + right:15px
3372 +}
3373 +
3374 +@media (min-width:768px){
3375 + .form-horizontal .form-group-lg .control-label{
3376 + padding-top:14.33px;
3377 + font-size:18px
3378 + }
3379 +
3380 +}
3381 +
3382 +@media (min-width:768px){
3383 + .form-horizontal .form-group-sm .control-label{
3384 + padding-top:6px;
3385 + font-size:12px
3386 + }
3387 +
3388 +}
3389 +
3390 +.btn{
3391 + display:inline-block;
3392 + padding:6px 12px;
3393 + margin-bottom:0;
3394 + font-size:14px;
3395 + font-weight:400;
3396 + line-height:1.42857143;
3397 + text-align:center;
3398 + white-space:nowrap;
3399 + vertical-align:middle;
3400 + -ms-touch-action:manipulation;
3401 + touch-action:manipulation;
3402 + cursor:pointer;
3403 + -webkit-user-select:none;
3404 + -moz-user-select:none;
3405 + -ms-user-select:none;
3406 + user-select:none;
3407 + background-image:none;
3408 + border:1px solid transparent;
3409 + border-radius:4px
3410 +}
3411 +
3412 +.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{
3413 + outline:thin dotted;
3414 + outline:5px auto -webkit-focus-ring-color;
3415 + outline-offset:-2px
3416 +}
3417 +
3418 +.btn.focus,.btn:focus,.btn:hover{
3419 + color:#333;
3420 + text-decoration:none
3421 +}
3422 +
3423 +.btn.active,.btn:active{
3424 + background-image:none;
3425 + outline:0;
3426 + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);
3427 + box-shadow:inset 0 3px 5px rgba(0,0,0,.125)
3428 +}
3429 +
3430 +.btn.disabled,.btn[disabled],fieldset[disabled] .btn{
3431 + cursor:not-allowed;
3432 + filter:alpha(opacity=65);
3433 + -webkit-box-shadow:none;
3434 + box-shadow:none;
3435 + opacity:.65
3436 +}
3437 +
3438 +a.btn.disabled,fieldset[disabled] a.btn{
3439 + pointer-events:none
3440 +}
3441 +
3442 +.btn-default{
3443 + color:#333;
3444 + background-color:#fff;
3445 + border-color:#ccc
3446 +}
3447 +
3448 +.btn-default.focus,.btn-default:focus{
3449 + color:#333;
3450 + background-color:#e6e6e6;
3451 + border-color:#8c8c8c
3452 +}
3453 +
3454 +.btn-default:hover{
3455 + color:#333;
3456 + background-color:#e6e6e6;
3457 + border-color:#adadad
3458 +}
3459 +
3460 +.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{
3461 + color:#333;
3462 + background-color:#e6e6e6;
3463 + border-color:#adadad
3464 +}
3465 +
3466 +.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{
3467 + color:#333;
3468 + background-color:#d4d4d4;
3469 + border-color:#8c8c8c
3470 +}
3471 +
3472 +.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{
3473 + background-image:none
3474 +}
3475 +
3476 +.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{
3477 + background-color:#fff;
3478 + border-color:#ccc
3479 +}
3480 +
3481 +.btn-default .badge{
3482 + color:#fff;
3483 + background-color:#333
3484 +}
3485 +
3486 +.btn-primary{
3487 + color:#fff;
3488 + background-color:#337ab7;
3489 + border-color:#2e6da4
3490 +}
3491 +
3492 +.btn-primary.focus,.btn-primary:focus{
3493 + color:#fff;
3494 + background-color:#286090;
3495 + border-color:#122b40
3496 +}
3497 +
3498 +.btn-primary:hover{
3499 + color:#fff;
3500 + background-color:#286090;
3501 + border-color:#204d74
3502 +}
3503 +
3504 +.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{
3505 + color:#fff;
3506 + background-color:#286090;
3507 + border-color:#204d74
3508 +}
3509 +
3510 +.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{
3511 + color:#fff;
3512 + background-color:#204d74;
3513 + border-color:#122b40
3514 +}
3515 +
3516 +.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{
3517 + background-image:none
3518 +}
3519 +
3520 +.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{
3521 + background-color:#337ab7;
3522 + border-color:#2e6da4
3523 +}
3524 +
3525 +.btn-primary .badge{
3526 + color:#337ab7;
3527 + background-color:#fff
3528 +}
3529 +
3530 +.btn-success{
3531 + color:#fff;
3532 + background-color:#5cb85c;
3533 + border-color:#4cae4c
3534 +}
3535 +
3536 +.btn-success.focus,.btn-success:focus{
3537 + color:#fff;
3538 + background-color:#449d44;
3539 + border-color:#255625
3540 +}
3541 +
3542 +.btn-success:hover{
3543 + color:#fff;
3544 + background-color:#449d44;
3545 + border-color:#398439
3546 +}
3547 +
3548 +.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{
3549 + color:#fff;
3550 + background-color:#449d44;
3551 + border-color:#398439
3552 +}
3553 +
3554 +.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{
3555 + color:#fff;
3556 + background-color:#398439;
3557 + border-color:#255625
3558 +}
3559 +
3560 +.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{
3561 + background-image:none
3562 +}
3563 +
3564 +.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{
3565 + background-color:#5cb85c;
3566 + border-color:#4cae4c
3567 +}
3568 +
3569 +.btn-success .badge{
3570 + color:#5cb85c;
3571 + background-color:#fff
3572 +}
3573 +
3574 +.btn-info{
3575 + color:#fff;
3576 + background-color:#5bc0de;
3577 + border-color:#46b8da
3578 +}
3579 +
3580 +.btn-info.focus,.btn-info:focus{
3581 + color:#fff;
3582 + background-color:#31b0d5;
3583 + border-color:#1b6d85
3584 +}
3585 +
3586 +.btn-info:hover{
3587 + color:#fff;
3588 + background-color:#31b0d5;
3589 + border-color:#269abc
3590 +}
3591 +
3592 +.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{
3593 + color:#fff;
3594 + background-color:#31b0d5;
3595 + border-color:#269abc
3596 +}
3597 +
3598 +.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{
3599 + color:#fff;
3600 + background-color:#269abc;
3601 + border-color:#1b6d85
3602 +}
3603 +
3604 +.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{
3605 + background-image:none
3606 +}
3607 +
3608 +.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{
3609 + background-color:#5bc0de;
3610 + border-color:#46b8da
3611 +}
3612 +
3613 +.btn-info .badge{
3614 + color:#5bc0de;
3615 + background-color:#fff
3616 +}
3617 +
3618 +.btn-warning{
3619 + color:#fff;
3620 + background-color:#f0ad4e;
3621 + border-color:#eea236
3622 +}
3623 +
3624 +.btn-warning.focus,.btn-warning:focus{
3625 + color:#fff;
3626 + background-color:#ec971f;
3627 + border-color:#985f0d
3628 +}
3629 +
3630 +.btn-warning:hover{
3631 + color:#fff;
3632 + background-color:#ec971f;
3633 + border-color:#d58512
3634 +}
3635 +
3636 +.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{
3637 + color:#fff;
3638 + background-color:#ec971f;
3639 + border-color:#d58512
3640 +}
3641 +
3642 +.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{
3643 + color:#fff;
3644 + background-color:#d58512;
3645 + border-color:#985f0d
3646 +}
3647 +
3648 +.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{
3649 + background-image:none
3650 +}
3651 +
3652 +.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{
3653 + background-color:#f0ad4e;
3654 + border-color:#eea236
3655 +}
3656 +
3657 +.btn-warning .badge{
3658 + color:#f0ad4e;
3659 + background-color:#fff
3660 +}
3661 +
3662 +.btn-danger{
3663 + color:#fff;
3664 + background-color:#d9534f;
3665 + border-color:#d43f3a
3666 +}
3667 +
3668 +.btn-danger.focus,.btn-danger:focus{
3669 + color:#fff;
3670 + background-color:#c9302c;
3671 + border-color:#761c19
3672 +}
3673 +
3674 +.btn-danger:hover{
3675 + color:#fff;
3676 + background-color:#c9302c;
3677 + border-color:#ac2925
3678 +}
3679 +
3680 +.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{
3681 + color:#fff;
3682 + background-color:#c9302c;
3683 + border-color:#ac2925
3684 +}
3685 +
3686 +.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{
3687 + color:#fff;
3688 + background-color:#ac2925;
3689 + border-color:#761c19
3690 +}
3691 +
3692 +.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{
3693 + background-image:none
3694 +}
3695 +
3696 +.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{
3697 + background-color:#d9534f;
3698 + border-color:#d43f3a
3699 +}
3700 +
3701 +.btn-danger .badge{
3702 + color:#d9534f;
3703 + background-color:#fff
3704 +}
3705 +
3706 +.btn-link{
3707 + font-weight:400;
3708 + color:#337ab7;
3709 + border-radius:0
3710 +}
3711 +
3712 +.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{
3713 + background-color:transparent;
3714 + -webkit-box-shadow:none;
3715 + box-shadow:none
3716 +}
3717 +
3718 +.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{
3719 + border-color:transparent
3720 +}
3721 +
3722 +.btn-link:focus,.btn-link:hover{
3723 + color:#23527c;
3724 + text-decoration:underline;
3725 + background-color:transparent
3726 +}
3727 +
3728 +.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{
3729 + color:#777;
3730 + text-decoration:none
3731 +}
3732 +
3733 +.btn-group-lg>.btn,.btn-lg{
3734 + padding:10px 16px;
3735 + font-size:18px;
3736 + line-height:1.3333333;
3737 + border-radius:6px
3738 +}
3739 +
3740 +.btn-group-sm>.btn,.btn-sm{
3741 + padding:5px 10px;
3742 + font-size:12px;
3743 + line-height:1.5;
3744 + border-radius:3px
3745 +}
3746 +
3747 +.btn-group-xs>.btn,.btn-xs{
3748 + padding:1px 5px;
3749 + font-size:12px;
3750 + line-height:1.5;
3751 + border-radius:3px
3752 +}
3753 +
3754 +.btn-block{
3755 + display:block;
3756 + width:100%
3757 +}
3758 +
3759 +.btn-block+.btn-block{
3760 + margin-top:5px
3761 +}
3762 +
3763 +input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{
3764 + width:100%
3765 +}
3766 +
3767 +.fade{
3768 + opacity:0;
3769 + -webkit-transition:opacity .15s linear;
3770 + -o-transition:opacity .15s linear;
3771 + transition:opacity .15s linear
3772 +}
3773 +
3774 +.fade.in{
3775 + opacity:1
3776 +}
3777 +
3778 +.collapse{
3779 + display:none
3780 +}
3781 +
3782 +.collapse.in{
3783 + display:block
3784 +}
3785 +
3786 +tr.collapse.in{
3787 + display:table-row
3788 +}
3789 +
3790 +tbody.collapse.in{
3791 + display:table-row-group
3792 +}
3793 +
3794 +.collapsing{
3795 + position:relative;
3796 + height:0;
3797 + overflow:hidden;
3798 + -webkit-transition-timing-function:ease;
3799 + -o-transition-timing-function:ease;
3800 + transition-timing-function:ease;
3801 + -webkit-transition-duration:.35s;
3802 + -o-transition-duration:.35s;
3803 + transition-duration:.35s;
3804 + -webkit-transition-property:height,visibility;
3805 + -o-transition-property:height,visibility;
3806 + transition-property:height,visibility
3807 +}
3808 +
3809 +.caret{
3810 + display:inline-block;
3811 + width:0;
3812 + height:0;
3813 + margin-left:2px;
3814 + vertical-align:middle;
3815 + border-top:4px dashed;
3816 + border-top:4px solid\9;
3817 + border-right:4px solid transparent;
3818 + border-left:4px solid transparent
3819 +}
3820 +
3821 +.dropdown,.dropup{
3822 + position:relative
3823 +}
3824 +
3825 +.dropdown-toggle:focus{
3826 + outline:0
3827 +}
3828 +
3829 +.dropdown-menu{
3830 + position:absolute;
3831 + top:100%;
3832 + left:0;
3833 + z-index:1000;
3834 + display:none;
3835 + float:left;
3836 + min-width:160px;
3837 + padding:5px 0;
3838 + margin:2px 0 0;
3839 + font-size:14px;
3840 + text-align:left;
3841 + list-style:none;
3842 + background-color:#fff;
3843 + -webkit-background-clip:padding-box;
3844 + background-clip:padding-box;
3845 + border:1px solid #ccc;
3846 + border:1px solid rgba(0,0,0,.15);
3847 + border-radius:4px;
3848 + -webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);
3849 + box-shadow:0 6px 12px rgba(0,0,0,.175)
3850 +}
3851 +
3852 +.dropdown-menu.pull-right{
3853 + right:0;
3854 + left:auto
3855 +}
3856 +
3857 +.dropdown-menu .divider{
3858 + height:1px;
3859 + margin:9px 0;
3860 + overflow:hidden;
3861 + background-color:#e5e5e5
3862 +}
3863 +
3864 +.dropdown-menu>li>a{
3865 + display:block;
3866 + padding:3px 20px;
3867 + clear:both;
3868 + font-weight:400;
3869 + line-height:1.42857143;
3870 + color:#333;
3871 + white-space:nowrap
3872 +}
3873 +
3874 +.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{
3875 + color:#262626;
3876 + text-decoration:none;
3877 + background-color:#f5f5f5
3878 +}
3879 +
3880 +.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{
3881 + color:#fff;
3882 + text-decoration:none;
3883 + background-color:#337ab7;
3884 + outline:0
3885 +}
3886 +
3887 +.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{
3888 + color:#777
3889 +}
3890 +
3891 +.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{
3892 + text-decoration:none;
3893 + cursor:not-allowed;
3894 + background-color:transparent;
3895 + background-image:none;
3896 + filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)
3897 +}
3898 +
3899 +.open>.dropdown-menu{
3900 + display:block
3901 +}
3902 +
3903 +.open>a{
3904 + outline:0
3905 +}
3906 +
3907 +.dropdown-menu-right{
3908 + right:0;
3909 + left:auto
3910 +}
3911 +
3912 +.dropdown-menu-left{
3913 + right:auto;
3914 + left:0
3915 +}
3916 +
3917 +.dropdown-header{
3918 + display:block;
3919 + padding:3px 20px;
3920 + font-size:12px;
3921 + line-height:1.42857143;
3922 + color:#777;
3923 + white-space:nowrap
3924 +}
3925 +
3926 +.dropdown-backdrop{
3927 + position:fixed;
3928 + top:0;
3929 + right:0;
3930 + bottom:0;
3931 + left:0;
3932 + z-index:990
3933 +}
3934 +
3935 +.pull-right>.dropdown-menu{
3936 + right:0;
3937 + left:auto
3938 +}
3939 +
3940 +.dropup .caret,.navbar-fixed-bottom .dropdown .caret{
3941 + content:"";
3942 + border-top:0;
3943 + border-bottom:4px dashed;
3944 + border-bottom:4px solid\9
3945 +}
3946 +
3947 +.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{
3948 + top:auto;
3949 + bottom:100%;
3950 + margin-bottom:2px
3951 +}
3952 +
3953 +@media (min-width:768px){
3954 + .navbar-right .dropdown-menu{
3955 + right:0;
3956 + left:auto
3957 + }
3958 +
3959 + .navbar-right .dropdown-menu-left{
3960 + right:auto;
3961 + left:0
3962 + }
3963 +
3964 +}
3965 +
3966 +.btn-group,.btn-group-vertical{
3967 + position:relative;
3968 + display:inline-block;
3969 + vertical-align:middle
3970 +}
3971 +
3972 +.btn-group-vertical>.btn,.btn-group>.btn{
3973 + position:relative;
3974 + float:left
3975 +}
3976 +
3977 +.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{
3978 + z-index:2
3979 +}
3980 +
3981 +.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{
3982 + margin-left:-1px
3983 +}
3984 +
3985 +.btn-toolbar{
3986 + margin-left:-5px
3987 +}
3988 +
3989 +.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{
3990 + float:left
3991 +}
3992 +
3993 +.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{
3994 + margin-left:5px
3995 +}
3996 +
3997 +.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){
3998 + border-radius:0
3999 +}
4000 +
4001 +.btn-group>.btn:first-child{
4002 + margin-left:0
4003 +}
4004 +
4005 +.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){
4006 + border-top-right-radius:0;
4007 + border-bottom-right-radius:0
4008 +}
4009 +
4010 +.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){
4011 + border-top-left-radius:0;
4012 + border-bottom-left-radius:0
4013 +}
4014 +
4015 +.btn-group>.btn-group{
4016 + float:left
4017 +}
4018 +
4019 +.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{
4020 + border-radius:0
4021 +}
4022 +
4023 +.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{
4024 + border-top-right-radius:0;
4025 + border-bottom-right-radius:0
4026 +}
4027 +
4028 +.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{
4029 + border-top-left-radius:0;
4030 + border-bottom-left-radius:0
4031 +}
4032 +
4033 +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{
4034 + outline:0
4035 +}
4036 +
4037 +.btn-group>.btn+.dropdown-toggle{
4038 + padding-right:8px;
4039 + padding-left:8px
4040 +}
4041 +
4042 +.btn-group>.btn-lg+.dropdown-toggle{
4043 + padding-right:12px;
4044 + padding-left:12px
4045 +}
4046 +
4047 +.btn-group.open .dropdown-toggle{
4048 + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);
4049 + box-shadow:inset 0 3px 5px rgba(0,0,0,.125)
4050 +}
4051 +
4052 +.btn-group.open .dropdown-toggle.btn-link{
4053 + -webkit-box-shadow:none;
4054 + box-shadow:none
4055 +}
4056 +
4057 +.btn .caret{
4058 + margin-left:0
4059 +}
4060 +
4061 +.btn-lg .caret{
4062 + border-width:5px 5px 0;
4063 + border-bottom-width:0
4064 +}
4065 +
4066 +.dropup .btn-lg .caret{
4067 + border-width:0 5px 5px
4068 +}
4069 +
4070 +.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{
4071 + display:block;
4072 + float:none;
4073 + width:100%;
4074 + max-width:100%
4075 +}
4076 +
4077 +.btn-group-vertical>.btn-group>.btn{
4078 + float:none
4079 +}
4080 +
4081 +.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{
4082 + margin-top:-1px;
4083 + margin-left:0
4084 +}
4085 +
4086 +.btn-group-vertical>.btn:not(:first-child):not(:last-child){
4087 + border-radius:0
4088 +}
4089 +
4090 +.btn-group-vertical>.btn:first-child:not(:last-child){
4091 + border-top-right-radius:4px;
4092 + border-bottom-right-radius:0;
4093 + border-bottom-left-radius:0
4094 +}
4095 +
4096 +.btn-group-vertical>.btn:last-child:not(:first-child){
4097 + border-top-left-radius:0;
4098 + border-top-right-radius:0;
4099 + border-bottom-left-radius:4px
4100 +}
4101 +
4102 +.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{
4103 + border-radius:0
4104 +}
4105 +
4106 +.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{
4107 + border-bottom-right-radius:0;
4108 + border-bottom-left-radius:0
4109 +}
4110 +
4111 +.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{
4112 + border-top-left-radius:0;
4113 + border-top-right-radius:0
4114 +}
4115 +
4116 +.btn-group-justified{
4117 + display:table;
4118 + width:100%;
4119 + table-layout:fixed;
4120 + border-collapse:separate
4121 +}
4122 +
4123 +.btn-group-justified>.btn,.btn-group-justified>.btn-group{
4124 + display:table-cell;
4125 + float:none;
4126 + width:1%
4127 +}
4128 +
4129 +.btn-group-justified>.btn-group .btn{
4130 + width:100%
4131 +}
4132 +
4133 +.btn-group-justified>.btn-group .dropdown-menu{
4134 + left:auto
4135 +}
4136 +
4137 +[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{
4138 + position:absolute;
4139 + clip:rect(0,0,0,0);
4140 + pointer-events:none
4141 +}
4142 +
4143 +.input-group{
4144 + position:relative;
4145 + display:table;
4146 + border-collapse:separate
4147 +}
4148 +
4149 +.input-group[class*=col-]{
4150 + float:none;
4151 + padding-right:0;
4152 + padding-left:0
4153 +}
4154 +
4155 +.input-group .form-control{
4156 + position:relative;
4157 + z-index:2;
4158 + float:left;
4159 + width:100%;
4160 + margin-bottom:0
4161 +}
4162 +
4163 +.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{
4164 + height:46px;
4165 + padding:10px 16px;
4166 + font-size:18px;
4167 + line-height:1.3333333;
4168 + border-radius:6px
4169 +}
4170 +
4171 +select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{
4172 + height:46px;
4173 + line-height:46px
4174 +}
4175 +
4176 +select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{
4177 + height:auto
4178 +}
4179 +
4180 +.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{
4181 + height:30px;
4182 + padding:5px 10px;
4183 + font-size:12px;
4184 + line-height:1.5;
4185 + border-radius:3px
4186 +}
4187 +
4188 +select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{
4189 + height:30px;
4190 + line-height:30px
4191 +}
4192 +
4193 +select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{
4194 + height:auto
4195 +}
4196 +
4197 +.input-group .form-control,.input-group-addon,.input-group-btn{
4198 + display:table-cell
4199 +}
4200 +
4201 +.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){
4202 + border-radius:0
4203 +}
4204 +
4205 +.input-group-addon,.input-group-btn{
4206 + width:1%;
4207 + white-space:nowrap;
4208 + vertical-align:middle
4209 +}
4210 +
4211 +.input-group-addon{
4212 + padding:6px 12px;
4213 + font-size:14px;
4214 + font-weight:400;
4215 + line-height:1;
4216 + color:#555;
4217 + text-align:center;
4218 + background-color:#eee;
4219 + border:1px solid #ccc;
4220 + border-radius:4px
4221 +}
4222 +
4223 +.input-group-addon.input-sm{
4224 + padding:5px 10px;
4225 + font-size:12px;
4226 + border-radius:3px
4227 +}
4228 +
4229 +.input-group-addon.input-lg{
4230 + padding:10px 16px;
4231 + font-size:18px;
4232 + border-radius:6px
4233 +}
4234 +
4235 +.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{
4236 + margin-top:0
4237 +}
4238 +
4239 +.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){
4240 + border-top-right-radius:0;
4241 + border-bottom-right-radius:0
4242 +}
4243 +
4244 +.input-group-addon:first-child{
4245 + border-right:0
4246 +}
4247 +
4248 +.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{
4249 + border-top-left-radius:0;
4250 + border-bottom-left-radius:0
4251 +}
4252 +
4253 +.input-group-addon:last-child{
4254 + border-left:0
4255 +}
4256 +
4257 +.input-group-btn{
4258 + position:relative;
4259 + font-size:0;
4260 + white-space:nowrap
4261 +}
4262 +
4263 +.input-group-btn>.btn{
4264 + position:relative
4265 +}
4266 +
4267 +.input-group-btn>.btn+.btn{
4268 + margin-left:-1px
4269 +}
4270 +
4271 +.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{
4272 + z-index:2
4273 +}
4274 +
4275 +.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{
4276 + margin-right:-1px
4277 +}
4278 +
4279 +.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{
4280 + z-index:2;
4281 + margin-left:-1px
4282 +}
4283 +
4284 +.nav{
4285 + padding-left:0;
4286 + margin-bottom:0;
4287 + list-style:none
4288 +}
4289 +
4290 +.nav>li{
4291 + position:relative;
4292 + display:block
4293 +}
4294 +
4295 +.nav>li>a{
4296 + position:relative;
4297 + display:block;
4298 + padding:10px 15px
4299 +}
4300 +
4301 +.nav>li>a:focus,.nav>li>a:hover{
4302 + text-decoration:none;
4303 + background-color:#eee
4304 +}
4305 +
4306 +.nav>li.disabled>a{
4307 + color:#777
4308 +}
4309 +
4310 +.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{
4311 + color:#777;
4312 + text-decoration:none;
4313 + cursor:not-allowed;
4314 + background-color:transparent
4315 +}
4316 +
4317 +.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{
4318 + background-color:#eee;
4319 + border-color:#337ab7
4320 +}
4321 +
4322 +.nav .nav-divider{
4323 + height:1px;
4324 + margin:9px 0;
4325 + overflow:hidden;
4326 + background-color:#e5e5e5
4327 +}
4328 +
4329 +.nav>li>a>img{
4330 + max-width:none
4331 +}
4332 +
4333 +.nav-tabs{
4334 + border-bottom:1px solid #ddd
4335 +}
4336 +
4337 +.nav-tabs>li{
4338 + float:left;
4339 + margin-bottom:-1px
4340 +}
4341 +
4342 +.nav-tabs>li>a{
4343 + margin-right:2px;
4344 + line-height:1.42857143;
4345 + border:1px solid transparent;
4346 + border-radius:4px 4px 0 0
4347 +}
4348 +
4349 +.nav-tabs>li>a:hover{
4350 + border-color:#eee #eee #ddd
4351 +}
4352 +
4353 +.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{
4354 + color:#555;
4355 + cursor:default;
4356 + background-color:#fff;
4357 + border:1px solid #ddd;
4358 + border-bottom-color:transparent
4359 +}
4360 +
4361 +.nav-tabs.nav-justified{
4362 + width:100%;
4363 + border-bottom:0
4364 +}
4365 +
4366 +.nav-tabs.nav-justified>li{
4367 + float:none
4368 +}
4369 +
4370 +.nav-tabs.nav-justified>li>a{
4371 + margin-bottom:5px;
4372 + text-align:center
4373 +}
4374 +
4375 +.nav-tabs.nav-justified>.dropdown .dropdown-menu{
4376 + top:auto;
4377 + left:auto
4378 +}
4379 +
4380 +@media (min-width:768px){
4381 + .nav-tabs.nav-justified>li{
4382 + display:table-cell;
4383 + width:1%
4384 + }
4385 +
4386 + .nav-tabs.nav-justified>li>a{
4387 + margin-bottom:0
4388 + }
4389 +
4390 +}
4391 +
4392 +.nav-tabs.nav-justified>li>a{
4393 + margin-right:0;
4394 + border-radius:4px
4395 +}
4396 +
4397 +.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{
4398 + border:1px solid #ddd
4399 +}
4400 +
4401 +@media (min-width:768px){
4402 + .nav-tabs.nav-justified>li>a{
4403 + border-bottom:1px solid #ddd;
4404 + border-radius:4px 4px 0 0
4405 + }
4406 +
4407 + .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{
4408 + border-bottom-color:#fff
4409 + }
4410 +
4411 +}
4412 +
4413 +.nav-pills>li{
4414 + float:left
4415 +}
4416 +
4417 +.nav-pills>li>a{
4418 + border-radius:4px
4419 +}
4420 +
4421 +.nav-pills>li+li{
4422 + margin-left:2px
4423 +}
4424 +
4425 +.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{
4426 + color:#fff;
4427 + background-color:#337ab7
4428 +}
4429 +
4430 +.nav-stacked>li{
4431 + float:none
4432 +}
4433 +
4434 +.nav-stacked>li+li{
4435 + margin-top:2px;
4436 + margin-left:0
4437 +}
4438 +
4439 +.nav-justified{
4440 + width:100%
4441 +}
4442 +
4443 +.nav-justified>li{
4444 + float:none
4445 +}
4446 +
4447 +.nav-justified>li>a{
4448 + margin-bottom:5px;
4449 + text-align:center
4450 +}
4451 +
4452 +.nav-justified>.dropdown .dropdown-menu{
4453 + top:auto;
4454 + left:auto
4455 +}
4456 +
4457 +@media (min-width:768px){
4458 + .nav-justified>li{
4459 + display:table-cell;
4460 + width:1%
4461 + }
4462 +
4463 + .nav-justified>li>a{
4464 + margin-bottom:0
4465 + }
4466 +
4467 +}
4468 +
4469 +.nav-tabs-justified{
4470 + border-bottom:0
4471 +}
4472 +
4473 +.nav-tabs-justified>li>a{
4474 + margin-right:0;
4475 + border-radius:4px
4476 +}
4477 +
4478 +.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{
4479 + border:1px solid #ddd
4480 +}
4481 +
4482 +@media (min-width:768px){
4483 + .nav-tabs-justified>li>a{
4484 + border-bottom:1px solid #ddd;
4485 + border-radius:4px 4px 0 0
4486 + }
4487 +
4488 + .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{
4489 + border-bottom-color:#fff
4490 + }
4491 +
4492 +}
4493 +
4494 +.tab-content>.tab-pane{
4495 + display:none
4496 +}
4497 +
4498 +.tab-content>.active{
4499 + display:block
4500 +}
4501 +
4502 +.nav-tabs .dropdown-menu{
4503 + margin-top:-1px;
4504 + border-top-left-radius:0;
4505 + border-top-right-radius:0
4506 +}
4507 +
4508 +.navbar{
4509 + position:relative;
4510 + min-height:50px;
4511 + margin-bottom:20px;
4512 + border:1px solid transparent
4513 +}
4514 +
4515 +@media (min-width:768px){
4516 + .navbar{
4517 + border-radius:4px
4518 + }
4519 +
4520 +}
4521 +
4522 +@media (min-width:768px){
4523 + .navbar-header{
4524 + float:left
4525 + }
4526 +
4527 +}
4528 +
4529 +.navbar-collapse{
4530 + padding-right:15px;
4531 + padding-left:15px;
4532 + overflow-x:visible;
4533 + -webkit-overflow-scrolling:touch;
4534 + border-top:1px solid transparent;
4535 + -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);
4536 + box-shadow:inset 0 1px 0 rgba(255,255,255,.1)
4537 +}
4538 +
4539 +.navbar-collapse.in{
4540 + overflow-y:auto
4541 +}
4542 +
4543 +@media (min-width:768px){
4544 + .navbar-collapse{
4545 + width:auto;
4546 + border-top:0;
4547 + -webkit-box-shadow:none;
4548 + box-shadow:none
4549 + }
4550 +
4551 + .navbar-collapse.collapse{
4552 + display:block!important;
4553 + height:auto!important;
4554 + padding-bottom:0;
4555 + overflow:visible!important
4556 + }
4557 +
4558 + .navbar-collapse.in{
4559 + overflow-y:visible
4560 + }
4561 +
4562 + .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{
4563 + padding-right:0;
4564 + padding-left:0
4565 + }
4566 +
4567 +}
4568 +
4569 +.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{
4570 + max-height:340px
4571 +}
4572 +
4573 +@media (max-device-width:480px) and (orientation:landscape){
4574 + .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{
4575 + max-height:200px
4576 + }
4577 +
4578 +}
4579 +
4580 +.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{
4581 + margin-right:-15px;
4582 + margin-left:-15px
4583 +}
4584 +
4585 +@media (min-width:768px){
4586 + .container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{
4587 + margin-right:0;
4588 + margin-left:0
4589 + }
4590 +
4591 +}
4592 +
4593 +.navbar-static-top{
4594 + z-index:1000;
4595 + border-width:0 0 1px
4596 +}
4597 +
4598 +@media (min-width:768px){
4599 + .navbar-static-top{
4600 + border-radius:0
4601 + }
4602 +
4603 +}
4604 +
4605 +.navbar-fixed-bottom,.navbar-fixed-top{
4606 + position:fixed;
4607 + right:0;
4608 + left:0;
4609 + z-index:1030
4610 +}
4611 +
4612 +@media (min-width:768px){
4613 + .navbar-fixed-bottom,.navbar-fixed-top{
4614 + border-radius:0
4615 + }
4616 +
4617 +}
4618 +
4619 +.navbar-fixed-top{
4620 + top:0;
4621 + border-width:0 0 1px
4622 +}
4623 +
4624 +.navbar-fixed-bottom{
4625 + bottom:0;
4626 + margin-bottom:0;
4627 + border-width:1px 0 0
4628 +}
4629 +
4630 +.navbar-brand{
4631 + float:left;
4632 + height:50px;
4633 + padding:15px 15px;
4634 + font-size:18px;
4635 + line-height:20px
4636 +}
4637 +
4638 +.navbar-brand:focus,.navbar-brand:hover{
4639 + text-decoration:none
4640 +}
4641 +
4642 +.navbar-brand>img{
4643 + display:block
4644 +}
4645 +
4646 +@media (min-width:768px){
4647 + .navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{
4648 + margin-left:-15px
4649 + }
4650 +
4651 +}
4652 +
4653 +.navbar-toggle{
4654 + position:relative;
4655 + float:right;
4656 + padding:9px 10px;
4657 + margin-top:8px;
4658 + margin-right:15px;
4659 + margin-bottom:8px;
4660 + background-color:transparent;
4661 + background-image:none;
4662 + border:1px solid transparent;
4663 + border-radius:4px
4664 +}
4665 +
4666 +.navbar-toggle:focus{
4667 + outline:0
4668 +}
4669 +
4670 +.navbar-toggle .icon-bar{
4671 + display:block;
4672 + width:22px;
4673 + height:2px;
4674 + border-radius:1px
4675 +}
4676 +
4677 +.navbar-toggle .icon-bar+.icon-bar{
4678 + margin-top:4px
4679 +}
4680 +
4681 +@media (min-width:768px){
4682 + .navbar-toggle{
4683 + display:none
4684 + }
4685 +
4686 +}
4687 +
4688 +.navbar-nav{
4689 + margin:7.5px -15px
4690 +}
4691 +
4692 +.navbar-nav>li>a{
4693 + padding-top:10px;
4694 + padding-bottom:10px;
4695 + line-height:20px
4696 +}
4697 +
4698 +@media (max-width:767px){
4699 + .navbar-nav .open .dropdown-menu{
4700 + position:static;
4701 + float:none;
4702 + width:auto;
4703 + margin-top:0;
4704 + background-color:transparent;
4705 + border:0;
4706 + -webkit-box-shadow:none;
4707 + box-shadow:none
4708 + }
4709 +
4710 + .navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{
4711 + padding:5px 15px 5px 25px
4712 + }
4713 +
4714 + .navbar-nav .open .dropdown-menu>li>a{
4715 + line-height:20px
4716 + }
4717 +
4718 + .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{
4719 + background-image:none
4720 + }
4721 +
4722 +}
4723 +
4724 +@media (min-width:768px){
4725 + .navbar-nav{
4726 + float:left;
4727 + margin:0
4728 + }
4729 +
4730 + .navbar-nav>li{
4731 + float:left
4732 + }
4733 +
4734 + .navbar-nav>li>a{
4735 + padding-top:15px;
4736 + padding-bottom:15px
4737 + }
4738 +
4739 +}
4740 +
4741 +.navbar-form{
4742 + padding:10px 15px;
4743 + margin-top:8px;
4744 + margin-right:-15px;
4745 + margin-bottom:8px;
4746 + margin-left:-15px;
4747 + border-top:1px solid transparent;
4748 + border-bottom:1px solid transparent;
4749 + -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);
4750 + box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)
4751 +}
4752 +
4753 +@media (min-width:768px){
4754 + .navbar-form .form-group{
4755 + display:inline-block;
4756 + margin-bottom:0;
4757 + vertical-align:middle
4758 + }
4759 +
4760 + .navbar-form .form-control{
4761 + display:inline-block;
4762 + width:auto;
4763 + vertical-align:middle
4764 + }
4765 +
4766 + .navbar-form .form-control-static{
4767 + display:inline-block
4768 + }
4769 +
4770 + .navbar-form .input-group{
4771 + display:inline-table;
4772 + vertical-align:middle
4773 + }
4774 +
4775 + .navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{
4776 + width:auto
4777 + }
4778 +
4779 + .navbar-form .input-group>.form-control{
4780 + width:100%
4781 + }
4782 +
4783 + .navbar-form .control-label{
4784 + margin-bottom:0;
4785 + vertical-align:middle
4786 + }
4787 +
4788 + .navbar-form .checkbox,.navbar-form .radio{
4789 + display:inline-block;
4790 + margin-top:0;
4791 + margin-bottom:0;
4792 + vertical-align:middle
4793 + }
4794 +
4795 + .navbar-form .checkbox label,.navbar-form .radio label{
4796 + padding-left:0
4797 + }
4798 +
4799 + .navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{
4800 + position:relative;
4801 + margin-left:0
4802 + }
4803 +
4804 + .navbar-form .has-feedback .form-control-feedback{
4805 + top:0
4806 + }
4807 +
4808 +}
4809 +
4810 +@media (max-width:767px){
4811 + .navbar-form .form-group{
4812 + margin-bottom:5px
4813 + }
4814 +
4815 + .navbar-form .form-group:last-child{
4816 + margin-bottom:0
4817 + }
4818 +
4819 +}
4820 +
4821 +@media (min-width:768px){
4822 + .navbar-form{
4823 + width:auto;
4824 + padding-top:0;
4825 + padding-bottom:0;
4826 + margin-right:0;
4827 + margin-left:0;
4828 + border:0;
4829 + -webkit-box-shadow:none;
4830 + box-shadow:none
4831 + }
4832 +
4833 +}
4834 +
4835 +.navbar-nav>li>.dropdown-menu{
4836 + margin-top:0;
4837 + border-top-left-radius:0;
4838 + border-top-right-radius:0
4839 +}
4840 +
4841 +.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{
4842 + margin-bottom:0;
4843 + border-top-left-radius:4px;
4844 + border-top-right-radius:4px;
4845 + border-bottom-right-radius:0;
4846 + border-bottom-left-radius:0
4847 +}
4848 +
4849 +.navbar-btn{
4850 + margin-top:8px;
4851 + margin-bottom:8px
4852 +}
4853 +
4854 +.navbar-btn.btn-sm{
4855 + margin-top:10px;
4856 + margin-bottom:10px
4857 +}
4858 +
4859 +.navbar-btn.btn-xs{
4860 + margin-top:14px;
4861 + margin-bottom:14px
4862 +}
4863 +
4864 +.navbar-text{
4865 + margin-top:15px;
4866 + margin-bottom:15px
4867 +}
4868 +
4869 +@media (min-width:768px){
4870 + .navbar-text{
4871 + float:left;
4872 + margin-right:15px;
4873 + margin-left:15px
4874 + }
4875 +
4876 +}
4877 +
4878 +@media (min-width:768px){
4879 + .navbar-left{
4880 + float:left!important
4881 + }
4882 +
4883 + .navbar-right{
4884 + float:right!important;
4885 + margin-right:-15px
4886 + }
4887 +
4888 + .navbar-right~.navbar-right{
4889 + margin-right:0
4890 + }
4891 +
4892 +}
4893 +
4894 +.navbar-default{
4895 + background-color:#f8f8f8;
4896 + border-color:#e7e7e7
4897 +}
4898 +
4899 +.navbar-default .navbar-brand{
4900 + color:#777
4901 +}
4902 +
4903 +.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{
4904 + color:#5e5e5e;
4905 + background-color:transparent
4906 +}
4907 +
4908 +.navbar-default .navbar-text{
4909 + color:#777
4910 +}
4911 +
4912 +.navbar-default .navbar-nav>li>a{
4913 + color:#777
4914 +}
4915 +
4916 +.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{
4917 + color:#333;
4918 + background-color:transparent
4919 +}
4920 +
4921 +.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{
4922 + color:#555;
4923 + background-color:#e7e7e7
4924 +}
4925 +
4926 +.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{
4927 + color:#ccc;
4928 + background-color:transparent
4929 +}
4930 +
4931 +.navbar-default .navbar-toggle{
4932 + border-color:#ddd
4933 +}
4934 +
4935 +.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{
4936 + background-color:#ddd
4937 +}
4938 +
4939 +.navbar-default .navbar-toggle .icon-bar{
4940 + background-color:#888
4941 +}
4942 +
4943 +.navbar-default .navbar-collapse,.navbar-default .navbar-form{
4944 + border-color:#e7e7e7
4945 +}
4946 +
4947 +.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{
4948 + color:#555;
4949 + background-color:#e7e7e7
4950 +}
4951 +
4952 +@media (max-width:767px){
4953 + .navbar-default .navbar-nav .open .dropdown-menu>li>a{
4954 + color:#777
4955 + }
4956 +
4957 + .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{
4958 + color:#333;
4959 + background-color:transparent
4960 + }
4961 +
4962 + .navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{
4963 + color:#555;
4964 + background-color:#e7e7e7
4965 + }
4966 +
4967 + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{
4968 + color:#ccc;
4969 + background-color:transparent
4970 + }
4971 +
4972 +}
4973 +
4974 +.navbar-default .navbar-link{
4975 + color:#777
4976 +}
4977 +
4978 +.navbar-default .navbar-link:hover{
4979 + color:#333
4980 +}
4981 +
4982 +.navbar-default .btn-link{
4983 + color:#777
4984 +}
4985 +
4986 +.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{
4987 + color:#333
4988 +}
4989 +
4990 +.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{
4991 + color:#ccc
4992 +}
4993 +
4994 +.navbar-inverse{
4995 + background-color:#222;
4996 + border-color:#080808
4997 +}
4998 +
4999 +.navbar-inverse .navbar-brand{

This file is too large to show in full.

public/mstsc/css/signin.css new
+46
@@ -0,0 +1,46 @@
1 +body {
2 + overflow:hidden;
3 +}
4 +
5 +.form-signin {
6 + max-width: 330px;
7 + padding: 15px;
8 + margin: 0 auto;
9 +}
10 +.form-signin .form-signin-heading,
11 +.form-signin .checkbox {
12 + margin-bottom: 10px;
13 +}
14 +.form-signin .checkbox {
15 + font-weight: normal;
16 +}
17 +.form-signin .form-control {
18 + position: relative;
19 + height: auto;
20 + -webkit-box-sizing: border-box;
21 + -moz-box-sizing: border-box;
22 + box-sizing: border-box;
23 + padding: 10px;
24 + font-size: 16px;
25 +}
26 +.form-signin .form-control:focus {
27 + z-index: 2;
28 +}
29 +.form-signin input[type="text"] {
30 + margin-bottom: -1px;
31 + border-bottom-right-radius: 0;
32 + border-bottom-left-radius: 0;
33 +}
34 +.form-signin input[type="password"] {
35 + margin-bottom: 10px;
36 + border-top-left-radius: 0;
37 + border-top-right-radius: 0;
38 +}
39 +
40 +.logo {
41 + width : 200px;
42 + margin-left : auto;
43 + margin-right : auto;
44 + display : block;
45 + margin-bottom: 10px;
46 +}
public/mstsc/index.html new
+65
@@ -0,0 +1,65 @@
1 +<!DOCTYPE html>
2 +<html lang="en">
3 +<head>
4 + <meta charset="utf-8">
5 + <meta http-equiv="X-UA-Compatible" content="IE=edge">
6 + <meta name="viewport" content="width=device-width, initial-scale=1">
7 + <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
8 + <meta name="description" content="">
9 + <meta name="author" content="">
10 + <link rel="icon" href="/favicon.ico">
11 + <title>RDP</title>
12 + <!-- Bootstrap core CSS -->
13 + <link href="./css/bootstrap.min.css" rel="stylesheet">
14 + <!-- Custom styles for this template -->
15 + <link href="./css/signin.css" rel="stylesheet">
16 + <script type="text/javascript" src="./js/mstsc.js"></script>
17 + <script type="text/javascript" src="./js/mstsc.js"></script>
18 + <script type="text/javascript" src="./js/keyboard.js"></script>
19 + <script type="text/javascript" src="./js/rle.js"></script>
20 + <script type="text/javascript" src="./js/client.js"></script>
21 + <script type="text/javascript" src="./js/canvas.js"></script>
22 + <script language="javascript">
23 + var client = null;
24 + var urlargs = parseUriArgs();
25 + if (urlargs.name) { document.title = urlargs.name + ' - ' + document.title; }
26 + console.log(urlargs.ws);
27 +
28 + function load(canvas) {
29 + client = Mstsc.client.create(Mstsc.$(canvas));
30 + }
31 +
32 + function connect(domain, username, password) {
33 + Mstsc.$("main").style.display = 'none';
34 + var canvas = Mstsc.$("myCanvas");
35 + canvas.style.display = 'inline';
36 + canvas.width = window.innerWidth;
37 + canvas.height = window.innerHeight;
38 + client.connect(urlargs.ws, domain, username, password, function (err) {
39 + Mstsc.$("myCanvas").style.display = 'none';
40 + Mstsc.$("main").style.display = 'inline';
41 + });
42 + }
43 +
44 + function parseUriArgs() { var href = window.document.location.href; if (href.endsWith('#')) { href = href.substring(0, href.length - 1); } var name, r = {}, parsedUri = href.split(/[\?&|\=]/); parsedUri.splice(0, 1); for (x in parsedUri) { switch (x % 2) { case 0: { name = decodeURIComponent(parsedUri[x]); break; } case 1: { r[name] = decodeURIComponent(parsedUri[x]); var x = parseInt(r[name]); if (x == r[name]) { r[name] = x; } break; } default: { break; } } } return r; }
45 + </script>
46 +</head>
47 +<body onload='load("myCanvas")'>
48 + <div id="main" class="container">
49 + <form class="form-signin" onSubmit="connect(this.elements['inputDomain'].value, this.elements['inputUsername'].value, this.elements['inputPassword'].value);return false;">
50 + <!--<img class='logo' src="./img/mstsc.js.svg"></img>-->
51 + <!--<label for="inputIpAddress" class="sr-only">IP Address</label>-->
52 + <!--<input type="text" id="inputIpAddress" class="form-control" placeholder="IP Address" required autofocus>-->
53 + <label for="inputDomain" class="sr-only">Domain</label>
54 + <input type="text" id="inputDomain" class="form-control" placeholder="Domain">
55 + <label for="inputUsername" class="sr-only">Username</label>
56 + <input type="text" id="inputUsername" class="form-control" placeholder="Username">
57 + <label for="inputPassword" class="sr-only">Password</label>
58 + <input type="password" id="inputPassword" class="form-control" placeholder="Password">
59 +
60 + <button class="btn btn-lg btn-primary btn-block" type="submit" style="background-color: #34A6FF; border-color: #34A6FF">Connect</button>
61 + </form>
62 + </div> <!-- /container -->
63 + <canvas id="myCanvas" style="display:none">
64 +</body>
65 +</html>
public/mstsc/js/canvas.js new
+116
@@ -0,0 +1,116 @@
1 +/*
2 + * Copyright (c) 2015 Sylvain Peyrefitte
3 + *
4 + * This file is part of mstsc.js.
5 + *
6 + * mstsc.js is free software: you can redistribute it and/or modify
7 + * it under the terms of the GNU General Public License as published by
8 + * the Free Software Foundation, either version 3 of the License, or
9 + * (at your option) any later version.
10 + *
11 + * This program is distributed in the hope that it will be useful,
12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 + * GNU General Public License for more details.
15 + *
16 + * You should have received a copy of the GNU General Public License
17 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 + */
19 +
20 +(function() {
21 +
22 + /**
23 + * decompress bitmap from RLE algorithm
24 + * @param bitmap {object} bitmap object of bitmap event of node-rdpjs
25 + */
26 + function decompress (bitmap) {
27 + var fName = null;
28 + switch (bitmap.bitsPerPixel) {
29 + case 15:
30 + fName = 'bitmap_decompress_15';
31 + break;
32 + case 16:
33 + fName = 'bitmap_decompress_16';
34 + break;
35 + case 24:
36 + fName = 'bitmap_decompress_24';
37 + break;
38 + case 32:
39 + fName = 'bitmap_decompress_32';
40 + break;
41 + default:
42 + throw 'invalid bitmap data format';
43 + }
44 +
45 + var input = new Uint8Array(bitmap.data);
46 + var inputPtr = Module._malloc(input.length);
47 + var inputHeap = new Uint8Array(Module.HEAPU8.buffer, inputPtr, input.length);
48 + inputHeap.set(input);
49 +
50 + var output_width = bitmap.destRight - bitmap.destLeft + 1;
51 + var output_height = bitmap.destBottom - bitmap.destTop + 1;
52 + var ouputSize = output_width * output_height * 4;
53 + var outputPtr = Module._malloc(ouputSize);
54 +
55 + var outputHeap = new Uint8Array(Module.HEAPU8.buffer, outputPtr, ouputSize);
56 +
57 + var res = Module.ccall(fName,
58 + 'number',
59 + ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'],
60 + [outputHeap.byteOffset, output_width, output_height, bitmap.width, bitmap.height, inputHeap.byteOffset, input.length]
61 + );
62 +
63 + var output = new Uint8ClampedArray(outputHeap.buffer, outputHeap.byteOffset, ouputSize);
64 +
65 + Module._free(inputPtr);
66 + Module._free(outputPtr);
67 +
68 + return { width : output_width, height : output_height, data : output };
69 + }
70 +
71 + /**
72 + * Un compress bitmap are reverse in y axis
73 + */
74 + function reverse (bitmap) {
75 + return { width : bitmap.width, height : bitmap.height, data : new Uint8ClampedArray(bitmap.data) };
76 + }
77 +
78 + /**
79 + * Canvas renderer
80 + * @param canvas {canvas} use for rendering
81 + */
82 + function Canvas(canvas) {
83 + this.canvas = canvas;
84 + this.ctx = canvas.getContext("2d");
85 + }
86 +
87 + Canvas.prototype = {
88 + /**
89 + * update canvas with new bitmap
90 + * @param bitmap {object}
91 + */
92 + update : function (bitmap) {
93 + var output = null;
94 + if (bitmap.isCompress) {
95 + output = decompress(bitmap);
96 + }
97 + else {
98 + output = reverse(bitmap);
99 + }
100 +
101 + // use image data to use asm.js
102 + var imageData = this.ctx.createImageData(output.width, output.height);
103 + imageData.data.set(output.data);
104 + this.ctx.putImageData(imageData, bitmap.destLeft, bitmap.destTop);
105 + }
106 + }
107 +
108 + /**
109 + * Module export
110 + */
111 + Mstsc.Canvas = {
112 + create : function (canvas) {
113 + return new Canvas(canvas);
114 + }
115 + }
116 +})();
public/mstsc/js/client.js new
+186
@@ -0,0 +1,186 @@
1 +/*
2 + * Copyright (c) 2015 Sylvain Peyrefitte
3 + *
4 + * This file is part of mstsc.js.
5 + *
6 + * mstsc.js is free software: you can redistribute it and/or modify
7 + * it under the terms of the GNU General Public License as published by
8 + * the Free Software Foundation, either version 3 of the License, or
9 + * (at your option) any later version.
10 + *
11 + * This program is distributed in the hope that it will be useful,
12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 + * GNU General Public License for more details.
15 + *
16 + * You should have received a copy of the GNU General Public License
17 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 + */
19 +
20 +(function() {
21 + /**
22 + * Mouse button mapping
23 + * @param button {integer} client button number
24 + */
25 + function mouseButtonMap(button) {
26 + switch(button) {
27 + case 0: return 1;
28 + case 2: return 2;
29 + default: return 0;
30 + }
31 + };
32 +
33 + /**
34 + * Mstsc client
35 + * Input client connection (mouse and keyboard)
36 + * bitmap processing
37 + * @param canvas {canvas} rendering element
38 + */
39 + function Client(canvas) {
40 + this.canvas = canvas;
41 + // create renderer
42 + this.render = new Mstsc.Canvas.create(this.canvas);
43 + this.socket = null;
44 + this.activeSession = false;
45 + this.install();
46 + }
47 +
48 + Client.prototype = {
49 + install : function () {
50 + var self = this;
51 +
52 + // Bind mouse move event
53 + this.canvas.addEventListener('mousemove', function (e) {
54 + if (!self.socket || !self.activeSession) return;
55 + var offset = Mstsc.elementOffset(self.canvas);
56 + self.socket.send(JSON.stringify(['mouse', e.clientX - offset.left, e.clientY - offset.top, 0, false]));
57 + e.preventDefault();
58 + return false;
59 + });
60 + this.canvas.addEventListener('mousedown', function (e) {
61 + if (!self.socket || !self.activeSession) return;
62 +
63 + var offset = Mstsc.elementOffset(self.canvas);
64 + self.socket.send(JSON.stringify(['mouse', e.clientX - offset.left, e.clientY - offset.top, mouseButtonMap(e.button), true]));
65 + e.preventDefault();
66 + return false;
67 + });
68 + this.canvas.addEventListener('mouseup', function (e) {
69 + if (!self.socket || !self.activeSession) return;
70 +
71 + var offset = Mstsc.elementOffset(self.canvas);
72 + self.socket.send(JSON.stringify(['mouse', e.clientX - offset.left, e.clientY - offset.top, mouseButtonMap(e.button), false]));
73 + e.preventDefault();
74 + return false;
75 + });
76 + this.canvas.addEventListener('contextmenu', function (e) {
77 + if (!self.socket || !self.activeSession) return;
78 + var offset = Mstsc.elementOffset(self.canvas);
79 + self.socket.send(JSON.stringify(['mouse', e.clientX - offset.left, e.clientY - offset.top, mouseButtonMap(e.button), false]));
80 + e.preventDefault();
81 + return false;
82 + });
83 + this.canvas.addEventListener('DOMMouseScroll', function (e) {
84 + if (!self.socket || !self.activeSession) return;
85 + var isHorizontal = false;
86 + var delta = e.detail;
87 + var step = Math.round(Math.abs(delta) * 15 / 8);
88 + var offset = Mstsc.elementOffset(self.canvas);
89 + self.socket.send(JSON.stringify(['wheel', e.clientX - offset.left, e.clientY - offset.top, step, delta > 0, isHorizontal]));
90 + e.preventDefault();
91 + return false;
92 + });
93 + this.canvas.addEventListener('mousewheel', function (e) {
94 + if (!self.socket || !self.activeSession) return;
95 + var isHorizontal = Math.abs(e.deltaX) > Math.abs(e.deltaY);
96 + var delta = isHorizontal?e.deltaX:e.deltaY;
97 + var step = Math.round(Math.abs(delta) * 15 / 8);
98 + var offset = Mstsc.elementOffset(self.canvas);
99 + self.socket.send(JSON.stringify(['wheel', e.clientX - offset.left, e.clientY - offset.top, step, delta > 0, isHorizontal]));
100 + e.preventDefault();
101 + return false;
102 + });
103 +
104 + // Bind keyboard event
105 + window.addEventListener('keydown', function (e) {
106 + if (!self.socket || !self.activeSession) return;
107 + self.socket.send(JSON.stringify(['scancode', Mstsc.scancode(e), true]));
108 + e.preventDefault();
109 + return false;
110 + });
111 + window.addEventListener('keyup', function (e) {
112 + if (!self.socket || !self.activeSession) return;
113 + self.socket.send(JSON.stringify(['scancode', Mstsc.scancode(e), false]));
114 + e.preventDefault();
115 + return false;
116 + });
117 +
118 + return this;
119 + },
120 + /**
121 + * connect
122 + * @param ip {string} ip target for rdp
123 + * @param domain {string} microsoft domain
124 + * @param username {string} session username
125 + * @param password {string} session password
126 + * @param next {function} asynchrone end callback
127 + */
128 + connect : function (ip, domain, username, password, next) {
129 + // start connection
130 + var self = this;
131 + this.socket = new WebSocket("wss://" + window.location.host + "/mstsc/relay.ashx");
132 + this.socket.onopen = function () {
133 + console.log("WS-OPEN");
134 + self.socket.send(JSON.stringify(['infos', {
135 + ip: ip,
136 + port: 3389,
137 + screen: {
138 + width: self.canvas.width,
139 + height: self.canvas.height
140 + },
141 + domain: domain,
142 + username: username,
143 + password: password,
144 + locale: Mstsc.locale()
145 + }]));
146 + };
147 + this.socket.onmessage = function (evt) {
148 + var msg = JSON.parse(evt.data);
149 + switch (msg[0]) {
150 + case 'rdp-connect': {
151 + //console.log('[mstsc.js] connected');
152 + self.activeSession = true;
153 + break;
154 + }
155 + case 'rdp-bitmap': {
156 + var bitmap = msg[1];
157 + bitmap.data = new Uint8Array(bitmap.data.data).buffer;
158 + //console.log('[mstsc.js] bitmap update bpp : ' + bitmap.bitsPerPixel);
159 + self.render.update(bitmap);
160 + break;
161 + }
162 + case 'rdp-close': {
163 + //console.log('[mstsc.js] close');
164 + self.activeSession = false;
165 + next(null);
166 + break;
167 + }
168 + case 'rdp-error': {
169 + var err = msg[1];
170 + console.log('[mstsc.js] error : ' + err.code + '(' + err.message + ')');
171 + self.activeSession = false;
172 + next(err);
173 + break;
174 + }
175 + }
176 + };
177 + this.socket.onclose = function () {
178 + console.log("WS-CLOSE");
179 + self.activeSession = false;
180 + next(null);
181 + };
182 + }
183 + }
184 +
185 + Mstsc.client = { create : function (canvas) { return new Client(canvas); } }
186 +})();
public/mstsc/js/keyboard.js new
+510
@@ -0,0 +1,510 @@
1 +/*
2 + * Copyright (c) 2015 Sylvain Peyrefitte
3 + *
4 + * This file is part of mstsc.js.
5 + *
6 + * mstsc.js is free software: you can redistribute it and/or modify
7 + * it under the terms of the GNU General Public License as published by
8 + * the Free Software Foundation, either version 3 of the License, or
9 + * (at your option) any later version.
10 + *
11 + * This program is distributed in the hope that it will be useful,
12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 + * GNU General Public License for more details.
15 + *
16 + * You should have received a copy of the GNU General Public License
17 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 + */
19 +
20 +(function() {
21 + // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
22 + var KeyMap = {
23 + "" : 0x0000,
24 + "Escape" : 0x0001,
25 + "Digit1" : 0x0002,
26 + "Digit2" : 0x0003,
27 + "Digit3" : 0x0004,
28 + "Digit4" : 0x0005,
29 + "Digit5" : 0x0006,
30 + "Digit6" : 0x0007,
31 + "Digit7" : 0x0008,
32 + "Digit8" : 0x0009,
33 + "Digit9" : 0x000A,
34 + "Digit0" : 0x000B,
35 + "Minus" : 0x000C,
36 + "Equal" : 0x000D,
37 + "Backspace" : 0x000E,
38 + "Tab" : 0x000F,
39 + "KeyQ" : 0x0010,
40 + "KeyW" : 0x0011,
41 + "KeyE" : 0x0012,
42 + "KeyR" : 0x0013,
43 + "KeyT" : 0x0014,
44 + "KeyY" : 0x0015,
45 + "KeyU" : 0x0016,
46 + "KeyI" : 0x0017,
47 + "KeyO" : 0x0018,
48 + "KeyP" : 0x0019,
49 + "BracketLeft" : 0x001A,
50 + "BracketRight" : 0x001B,
51 + "Enter" : 0x001C,
52 + "ControlLeft" : 0x001D,
53 + "KeyA" : 0x001E,
54 + "KeyS" : 0x001F,
55 + "KeyD" : 0x0020,
56 + "KeyF" : 0x0021,
57 + "KeyG" : 0x0022,
58 + "KeyH" : 0x0023,
59 + "KeyJ" : 0x0024,
60 + "KeyK" : 0x0025,
61 + "KeyL" : 0x0026,
62 + "Semicolon" : 0x0027,
63 + "Quote" : 0x0028,
64 + "Backquote" : 0x0029,
65 + "ShiftLeft" : 0x002A,
66 + "Backslash" : 0x002B,
67 + "KeyZ" : 0x002C,
68 + "KeyX" : 0x002D,
69 + "KeyC" : 0x002E,
70 + "KeyV" : 0x002F,
71 + "KeyB" : 0x0030,
72 + "KeyN" : 0x0031,
73 + "KeyM" : 0x0032,
74 + "Comma" : 0x0033,
75 + "Period" : 0x0034,
76 + "Slash" : 0x0035,
77 + "ShiftRight" : 0x0036,
78 + "NumpadMultiply" : 0x0037,
79 + "AltLeft" : 0x0038,
80 + "Space" : 0x0039,
81 + "CapsLock" : 0x003A,
82 + "F1" : 0x003B,
83 + "F2" : 0x003C,
84 + "F3" : 0x003D,
85 + "F4" : 0x003E,
86 + "F5" : 0x003F,
87 + "F6" : 0x0040,
88 + "F7" : 0x0041,
89 + "F8" : 0x0042,
90 + "F9" : 0x0043,
91 + "F10" : 0x0044,
92 + "Pause" : 0x0045,
93 + "ScrollLock" : 0x0046,
94 + "Numpad7" : 0x0047,
95 + "Numpad8" : 0x0048,
96 + "Numpad9" : 0x0049,
97 + "NumpadSubtract" : 0x004A,
98 + "Numpad4" : 0x004B,
99 + "Numpad5" : 0x004C,
100 + "Numpad6" : 0x004D,
101 + "NumpadAdd" : 0x004E,
102 + "Numpad1" : 0x004F,
103 + "Numpad2" : 0x0050,
104 + "Numpad3" : 0x0051,
105 + "Numpad0" : 0x0052,
106 + "NumpadDecimal" : 0x0053,
107 + "PrintScreen" : 0x0054,
108 + "IntlBackslash" : 0x0056,
109 + "F11" : 0x0057,
110 + "F12" : 0x0058,
111 + "NumpadEqual" : 0x0059,
112 + "F13" : 0x0064,
113 + "F14" : 0x0065,
114 + "F15" : 0x0066,
115 + "F16" : 0x0067,
116 + "F17" : 0x0068,
117 + "F18" : 0x0069,
118 + "F19" : 0x006A,
119 + "F20" : 0x006B,
120 + "F21" : 0x006C,
121 + "F22" : 0x006D,
122 + "F23" : 0x006E,
123 + "KanaMode" : 0x0070,
124 + "Lang2" : 0x0071,
125 + "Lang1" : 0x0072,
126 + "IntlRo" : 0x0073,
127 + "F24" : 0x0076,
128 + "Convert" : 0x0079,
129 + "NonConvert" : 0x007B,
130 + "IntlYen" : 0x007D,
131 + "NumpadComma" : 0x007E,
132 + "MediaTrackPrevious" : 0xE010,
133 + "MediaTrackNext" : 0xE019,
134 + "NumpadEnter" : 0xE01C,
135 + "ControlRight" : 0xE01D,
136 + "VolumeMute" : 0xE020,
137 + "LaunchApp2" : 0xE021,
138 + "MediaPlayPause" : 0xE022,
139 + "MediaStop" : 0xE024,
140 + "VolumeDown" : 0xE02E,
141 + "VolumeUp" : 0xE030,
142 + "BrowserHome" : 0xE032,
143 + "NumpadDivide" : 0xE035,
144 + "PrintScreen" : 0xE037,
145 + "AltRight" : 0xE038,
146 + "NumLock" : 0xE045,
147 + "Pause" : 0xE046,
148 + "Home" : 0xE047,
149 + "ArrowUp" : 0xE048,
150 + "PageUp" : 0xE049,
151 + "ArrowLeft" : 0xE04B,
152 + "ArrowRight" : 0xE04D,
153 + "End" : 0xE04F,
154 + "ArrowDown" : 0xE050,
155 + "PageDown" : 0xE051,
156 + "Insert" : 0xE052,
157 + "Delete" : 0xE053,
158 + "OSLeft" : 0xE05B,
159 + "OSRight" : 0xE05C,
160 + "ContextMenu" : 0xE05D,
161 + "Power" : 0xE05E,
162 + "BrowserSearch" : 0xE065,
163 + "BrowserFavorites" : 0xE066,
164 + "BrowserRefresh" : 0xE067,
165 + "BrowserStop" : 0xE068,
166 + "BrowserForward" : 0xE069,
167 + "BrowserBack" : 0xE06A,
168 + "LaunchApp1" : 0xE06B,
169 + "LaunchMail" : 0xE06C,
170 + "MediaSelect" : 0xE06D
171 + };
172 +
173 + var UnicodeToCodeFirefox_FR = {
174 + 27 : "Escape",
175 + 112 : "F1",
176 + 113 : "F2",
177 + 114 : "F3",
178 + 115 : "F4",
179 + 116 : "F5",
180 + 117 : "F6",
181 + 118 : "F7",
182 + 119 : "F8",
183 + 120 : "F9",
184 + 121 : "F10",
185 + 122 : "F11",
186 + 123 : "F12",
187 + 0 : "Backquote",
188 + 49 : "Digit1",
189 + 50 : "Digit2",
190 + 51 : "Digit3",
191 + 52 : "Digit4",
192 + 53 : "Digit5",
193 + 54 : "Digit6",
194 + 55 : "Digit7",
195 + 56 : "Digit8",
196 + 57 : "Digit9",
197 + 48 : "Digit0",
198 + 169 : "Minus",
199 + 61 : "Equal",
200 + 8 : "Backspace",
201 + 9 : "Tab",
202 + 65 : "KeyQ",
203 + 90 : "KeyW",
204 + 69 : "KeyE",
205 + 82 : "KeyR",
206 + 84 : "KeyT",
207 + 89 : "KeyY",
208 + 85 : "KeyU",
209 + 73 : "KeyI",
210 + 79 : "KeyO",
211 + 80 : "KeyP",
212 + 160 : "BracketLeft",
213 + 164 : "BracketRight",
214 + 13 : "Enter",
215 + 20 : "CapsLock",
216 + 20 : "CapsLock",
217 + 81 : "KeyA",
218 + 83 : "KeyS",
219 + 68 : "KeyD",
220 + 70 : "KeyF",
221 + 71 : "KeyG",
222 + 72 : "KeyH",
223 + 74 : "KeyJ",
224 + 75 : "KeyK",
225 + 76 : "KeyL",
226 + 77 : "Semicolon",
227 + 165 : "Quote",
228 + 170 : "Backslash",
229 + 16 : "ShiftLeft",
230 + 60 : "IntlBackslash",
231 + 87 : "KeyZ",
232 + 88 : "KeyX",
233 + 67 : "KeyC",
234 + 86 : "KeyV",
235 + 66 : "KeyB",
236 + 78 : "KeyN",
237 + 188 : "KeyM",
238 + 59 : "Comma",
239 + 58 : "Period",
240 + 161 : "Slash",
241 + 16 : "ShiftRight",
242 + 17 : "ControlLeft",
243 + 91 : "OSLeft",
244 + 18 : "AltLeft",
245 + 32 : "Space",
246 + 17 : "ControlLeft",
247 + 18 : "AltRight",
248 + 91 : "OSRight",
249 + 93 : "ContextMenu",
250 + 17 : "ControlRight",
251 + 37 : "ArrowLeft",
252 + 38 : "ArrowUp",
253 + 40 : "ArrowDown",
254 + 39 : "ArrowRight",
255 + 144 : "NumLock",
256 + 144 : "NumLock",
257 + 111 : "NumpadDivide",
258 + 106 : "NumpadMultiply",
259 + 109 : "NumpadSubtract",
260 + 103 : "Numpad7",
261 + 104 : "Numpad8",
262 + 105 : "Numpad9",
263 + 107 : "NumpadAdd",
264 + 100 : "Numpad4",
265 + 101 : "Numpad5",
266 + 102 : "Numpad6",
267 + 97 : "Numpad1",
268 + 98 : "Numpad2",
269 + 99 : "Numpad3",
270 + 96 : "Numpad0",
271 + 110 : "NumpadDecimal",
272 + 13 : "NumpadEnter",
273 + 17 : "ControlLeft",
274 + 67 : "KeyC",
275 + 17 : "ControlLeft"
276 + };
277 +
278 + var UnicodeToCodeChrome_FR = {
279 + 27 : "Escape",
280 + 112 : "F1",
281 + 113 : "F2",
282 + 114 : "F3",
283 + 115 : "F4",
284 + 116 : "F5",
285 + 117 : "F6",
286 + 118 : "F7",
287 + 119 : "F8",
288 + 120 : "F9",
289 + 121 : "F10",
290 + 122 : "F11",
291 + 123 : "F12",
292 + 0 : "Backquote",
293 + 49 : "Digit1",
294 + 50 : "Digit2",
295 + 51 : "Digit3",
296 + 52 : "Digit4",
297 + 53 : "Digit5",
298 + 54 : "Digit6",
299 + 55 : "Digit7",
300 + 56 : "Digit8",
301 + 57 : "Digit9",
302 + 48 : "Digit0",
303 + 219 : "Minus",
304 + 187 : "Equal",
305 + 8 : "Backspace",
306 + 9 : "Tab",
307 + 65 : "KeyQ",
308 + 90 : "KeyW",
309 + 69 : "KeyE",
310 + 82 : "KeyR",
311 + 84 : "KeyT",
312 + 89 : "KeyY",
313 + 85 : "KeyU",
314 + 73 : "KeyI",
315 + 79 : "KeyO",
316 + 80 : "KeyP",
317 + 221 : "BracketLeft",
318 + 186 : "BracketRight",
319 + 13 : "Enter",
320 + 20 : "CapsLock",
321 + 20 : "CapsLock",
322 + 81 : "KeyA",
323 + 83 : "KeyS",
324 + 68 : "KeyD",
325 + 70 : "KeyF",
326 + 71 : "KeyG",
327 + 72 : "KeyH",
328 + 74 : "KeyJ",
329 + 75 : "KeyK",
330 + 76 : "KeyL",
331 + 77 : "Semicolon",
332 + 192 : "Quote",
333 + 220 : "Backslash",
334 + 16 : "ShiftLeft",
335 + 60 : "IntlBackslash",
336 + 87 : "KeyZ",
337 + 88 : "KeyX",
338 + 67 : "KeyC",
339 + 86 : "KeyV",
340 + 66 : "KeyB",
341 + 78 : "KeyN",
342 + 188 : "KeyM",
343 + 190 : "Comma",
344 + 191 : "Period",
345 + 223 : "Slash",
346 + 16 : "ShiftRight",
347 + 17 : "ControlLeft",
348 + 91 : "OSLeft",
349 + 18 : "AltLeft",
350 + 32 : "Space",
351 + 17 : "ControlLeft",
352 + 18 : "AltRight",
353 + 91 : "OSRight",
354 + 93 : "ContextMenu",
355 + 17 : "ControlRight",
356 + 37 : "ArrowLeft",
357 + 38 : "ArrowUp",
358 + 40 : "ArrowDown",
359 + 39 : "ArrowRight",
360 + 144 : "NumLock",
361 + 144 : "NumLock",
362 + 111 : "NumpadDivide",
363 + 106 : "NumpadMultiply",
364 + 109 : "NumpadSubtract",
365 + 103 : "Numpad7",
366 + 104 : "Numpad8",
367 + 105 : "Numpad9",
368 + 107 : "NumpadAdd",
369 + 100 : "Numpad4",
370 + 101 : "Numpad5",
371 + 102 : "Numpad6",
372 + 97 : "Numpad1",
373 + 98 : "Numpad2",
374 + 99 : "Numpad3",
375 + 96 : "Numpad0",
376 + 110 : "NumpadDecimal",
377 + 13 : "NumpadEnter",
378 + 17 : "ControlLeft",
379 + 67 : "KeyC",
380 + 17 : "ControlLeft"
381 + };
382 +
383 + var UnicodeToCode_EN = {
384 + 27 : "Escape",
385 + 112 : "F1",
386 + 113 : "F2",
387 + 114 : "F3",
388 + 115 : "F4",
389 + 116 : "F5",
390 + 117 : "F6",
391 + 118 : "F7",
392 + 119 : "F8",
393 + 120 : "F9",
394 + 121 : "F10",
395 + 122 : "F11",
396 + 123 : "F12",
397 + 192 : "Backquote",
398 + 49 : "Digit1",
399 + 50 : "Digit2",
400 + 51 : "Digit3",
401 + 52 : "Digit4",
402 + 53 : "Digit5",
403 + 54 : "Digit6",
404 + 55 : "Digit7",
405 + 56 : "Digit8",
406 + 57 : "Digit9",
407 + 48 : "Digit0",
408 + 173 : "Minus",
409 + 61 : "Equal",
410 + 8 : "Backspace",
411 + 9 : "Tab",
412 + 81 : "KeyQ",
413 + 87 : "KeyW",
414 + 69 : "KeyE",
415 + 82 : "KeyR",
416 + 84 : "KeyT",
417 + 89 : "KeyY",
418 + 85 : "KeyU",
419 + 73 : "KeyI",
420 + 79 : "KeyO",
421 + 80 : "KeyP",
422 + 219 : "BracketLeft",
423 + 221 : "BracketRight",
424 + 13 : "Enter",
425 + 20 : "CapsLock",
426 + 65 : "KeyA",
427 + 83 : "KeyS",
428 + 68 : "KeyD",
429 + 70 : "KeyF",
430 + 71 : "KeyG",
431 + 72 : "KeyH",
432 + 74 : "KeyJ",
433 + 75 : "KeyK",
434 + 76 : "KeyL",
435 + 59 : "Semicolon",
436 + 222 : "Quote",
437 + 220 : "Backslash",
438 + 16 : "ShiftLeft",
439 + 220 : "IntlBackslash",
440 + 90 : "KeyZ",
441 + 88 : "KeyX",
442 + 67 : "KeyC",
443 + 86 : "KeyV",
444 + 66 : "KeyB",
445 + 78 : "KeyN",
446 + 77 : "KeyM",
447 + 188 : "Comma",
448 + 190 : "Period",
449 + 191 : "Slash",
450 + 16 : "ShiftRight",
451 + 17 : "ControlLeft",
452 + 18 : "AltLeft",
453 + 91 : "OSLeft",
454 + 32 : "Space",
455 + 18 : "AltRight",
456 + 91 : "OSRight",
457 + 93 : "ContextMenu",
458 + 17 : "ControlRight",
459 + 37 : "ArrowLeft",
460 + 38 : "ArrowUp",
461 + 40 : "ArrowDown",
462 + 39 : "ArrowRight",
463 + 144 : "NumLock",
464 + 144 : "NumLock",
465 + 111 : "NumpadDivide",
466 + 106 : "NumpadMultiply",
467 + 109 : "NumpadSubtract",
468 + 103 : "Numpad7",
469 + 104 : "Numpad8",
470 + 105 : "Numpad9",
471 + 107 : "NumpadAdd",
472 + 100 : "Numpad4",
473 + 101 : "Numpad5",
474 + 102 : "Numpad6",
475 + 97 : "Numpad1",
476 + 98 : "Numpad2",
477 + 99 : "Numpad3",
478 + 13 : "NumpadEnter",
479 + 96 : "Numpad0",
480 + 110 : "NumpadDecimal",
481 + 17 : "ControlLeft"
482 + };
483 +
484 +
485 + var UnicodeToCode = {
486 + 'firefox' : {
487 + 'fr' : UnicodeToCodeFirefox_FR,
488 + 'en' : UnicodeToCode_EN
489 + },
490 +
491 + 'chrome' : {
492 + 'fr' : UnicodeToCodeChrome_FR,
493 + 'en' : UnicodeToCode_EN
494 + }
495 + }
496 +
497 + /**
498 + * Scancode of keyevent
499 + * @param e {keyboardevent}
500 + * @return {integer} scancode
501 + */
502 + function scancode (e) {
503 + var locale = Mstsc.locale();
504 + locale = (['fr', 'en'].indexOf(locale) > 0 && locale) || 'en';
505 + return KeyMap[e.code || UnicodeToCode[Mstsc.browser() || 'firefox'][locale][e.keyCode]];
506 + }
507 +
508 + Mstsc.scancode = scancode;
509 +
510 +})();
\ No newline at end of file
public/mstsc/js/mstsc.js new
+81
@@ -0,0 +1,81 @@
1 +/*
2 + * Copyright (c) 2015 Sylvain Peyrefitte
3 + *
4 + * This file is part of mstsc.js.
5 + *
6 + * mstsc.j is free software: you can redistribute it and/or modify
7 + * it under the terms of the GNU General Public License as published by
8 + * the Free Software Foundation, either version 3 of the License, or
9 + * (at your option) any later version.
10 + *
11 + * This program is distributed in the hope that it will be useful,
12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 + * GNU General Public License for more details.
15 + *
16 + * You should have received a copy of the GNU General Public License
17 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 + */
19 +
20 +(function() {
21 +
22 + /**
23 + * Use for domain declaration
24 + */
25 + Mstsc = function () {
26 + }
27 +
28 + Mstsc.prototype = {
29 + // shortcut
30 + $ : function (id) {
31 + return document.getElementById(id);
32 + },
33 +
34 + /**
35 + * Compute screen offset for a target element
36 + * @param el {DOM element}
37 + * @return {top : {integer}, left {integer}}
38 + */
39 + elementOffset : function (el) {
40 + var x = 0;
41 + var y = 0;
42 + while (el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop )) {
43 + x += el.offsetLeft - el.scrollLeft;
44 + y += el.offsetTop - el.scrollTop;
45 + el = el.offsetParent;
46 + }
47 + return { top: y, left: x };
48 + },
49 +
50 + /**
51 + * Try to detect browser
52 + * @returns {String} [firefox|chrome|ie]
53 + */
54 + browser : function () {
55 + if (typeof InstallTrigger !== 'undefined') {
56 + return 'firefox';
57 + }
58 +
59 + if (!!window.chrome) {
60 + return 'chrome';
61 + }
62 +
63 + if (!!document.docuemntMode) {
64 + return 'ie';
65 + }
66 +
67 + return null;
68 + },
69 +
70 + /**
71 + * Try to detect language
72 + * @returns
73 + */
74 + locale : function () {
75 + return window.navigator.userLanguage || window.navigator.language;
76 + }
77 + }
78 +
79 +})();
80 +
81 +this.Mstsc = new Mstsc();
\ No newline at end of file
public/mstsc/js/rle.js new
+17864
@@ -0,0 +1,17864 @@
1 +// Note: Some Emscripten settings will significantly limit the speed of the generated code.
2 +// Note: Some Emscripten settings may limit the speed of the generated code.
3 +// The Module object: Our interface to the outside world. We import
4 +// and export values on it, and do the work to get that through
5 +// closure compiler if necessary. There are various ways Module can be used:
6 +// 1. Not defined. We create it here
7 +// 2. A function parameter, function(Module) { ..generated code.. }
8 +// 3. pre-run appended it, var Module = {}; ..generated code..
9 +// 4. External script tag defines var Module.
10 +// We need to do an eval in order to handle the closure compiler
11 +// case, where this code here is minified but Module was defined
12 +// elsewhere (e.g. case 4 above). We also need to check if Module
13 +// already exists (e.g. case 3 above).
14 +// Note that if you want to run closure, and also to use Module
15 +// after the generated code, you will need to define var Module = {};
16 +// before the code. Then that object will be used in the code, and you
17 +// can continue to use Module afterwards as well.
18 +var Module = { };
19 +//if (!Module) { Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()'); }
20 +
21 +// Sometimes an existing Module object exists with properties
22 +// meant to overwrite the default module functionality. Here
23 +// we collect those properties and reapply _after_ we configure
24 +// the current environment's defaults to avoid having to be so
25 +// defensive during initialization.
26 +var moduleOverrides = {};
27 +for (var key in Module) {
28 + if (Module.hasOwnProperty(key)) {
29 + moduleOverrides[key] = Module[key];
30 + }
31 +}
32 +
33 +// The environment setup code below is customized to use Module.
34 +// *** Environment setup code ***
35 +var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
36 +var ENVIRONMENT_IS_WEB = typeof window === 'object';
37 +var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
38 +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
39 +
40 +if (ENVIRONMENT_IS_NODE) {
41 + // Expose functionality in the same simple way that the shells work
42 + // Note that we pollute the global namespace here, otherwise we break in node
43 + if (!Module['print']) Module['print'] = function print(x) {
44 + process['stdout'].write(x + '\n');
45 + };
46 + if (!Module['printErr']) Module['printErr'] = function printErr(x) {
47 + process['stderr'].write(x + '\n');
48 + };
49 +
50 + var nodeFS = require('fs');
51 + var nodePath = require('path');
52 +
53 + Module['read'] = function read(filename, binary) {
54 + filename = nodePath['normalize'](filename);
55 + var ret = nodeFS['readFileSync'](filename);
56 + // The path is absolute if the normalized version is the same as the resolved.
57 + if (!ret && filename != nodePath['resolve'](filename)) {
58 + filename = path.join(__dirname, '..', 'src', filename);
59 + ret = nodeFS['readFileSync'](filename);
60 + }
61 + if (ret && !binary) ret = ret.toString();
62 + return ret;
63 + };
64 +
65 + Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };
66 +
67 + Module['load'] = function load(f) {
68 + globalEval(read(f));
69 + };
70 +
71 + Module['arguments'] = process['argv'].slice(2);
72 +
73 + module['exports'] = Module;
74 +}
75 +else if (ENVIRONMENT_IS_SHELL) {
76 + if (!Module['print']) Module['print'] = print;
77 + if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
78 +
79 + if (typeof read != 'undefined') {
80 + Module['read'] = read;
81 + } else {
82 + Module['read'] = function read() { throw 'no read() available (jsc?)' };
83 + }
84 +
85 + Module['readBinary'] = function readBinary(f) {
86 + return read(f, 'binary');
87 + };
88 +
89 + if (typeof scriptArgs != 'undefined') {
90 + Module['arguments'] = scriptArgs;
91 + } else if (typeof arguments != 'undefined') {
92 + Module['arguments'] = arguments;
93 + }
94 +
95 + this['Module'] = Module;
96 +
97 + eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)
98 +}
99 +else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
100 + Module['read'] = function read(url) {
101 + var xhr = new XMLHttpRequest();
102 + xhr.open('GET', url, false);
103 + xhr.send(null);
104 + return xhr.responseText;
105 + };
106 +
107 + if (typeof arguments != 'undefined') {
108 + Module['arguments'] = arguments;
109 + }
110 +
111 + if (typeof console !== 'undefined') {
112 + if (!Module['print']) Module['print'] = function print(x) {
113 + console.log(x);
114 + };
115 + if (!Module['printErr']) Module['printErr'] = function printErr(x) {
116 + console.log(x);
117 + };
118 + } else {
119 + // Probably a worker, and without console.log. We can do very little here...
120 + var TRY_USE_DUMP = false;
121 + if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) {
122 + dump(x);
123 + }) : (function(x) {
124 + // self.postMessage(x); // enable this if you want stdout to be sent as messages
125 + }));
126 + }
127 +
128 + if (ENVIRONMENT_IS_WEB) {
129 + this['Module'] = Module;
130 + } else {
131 + Module['load'] = importScripts;
132 + }
133 +}
134 +else {
135 + // Unreachable because SHELL is dependant on the others
136 + throw 'Unknown runtime environment. Where are we?';
137 +}
138 +
139 +function globalEval(x) {
140 + eval.call(null, x);
141 +}
142 +if (!Module['load'] == 'undefined' && Module['read']) {
143 + Module['load'] = function load(f) {
144 + globalEval(Module['read'](f));
145 + };
146 +}
147 +if (!Module['print']) {
148 + Module['print'] = function(){};
149 +}
150 +if (!Module['printErr']) {
151 + Module['printErr'] = Module['print'];
152 +}
153 +if (!Module['arguments']) {
154 + Module['arguments'] = [];
155 +}
156 +// *** Environment setup code ***
157 +
158 +// Closure helpers
159 +Module.print = Module['print'];
160 +Module.printErr = Module['printErr'];
161 +
162 +// Callbacks
163 +Module['preRun'] = [];
164 +Module['postRun'] = [];
165 +
166 +// Merge back in the overrides
167 +for (var key in moduleOverrides) {
168 + if (moduleOverrides.hasOwnProperty(key)) {
169 + Module[key] = moduleOverrides[key];
170 + }
171 +}
172 +
173 +
174 +
175 +// === Auto-generated preamble library stuff ===
176 +
177 +//========================================
178 +// Runtime code shared with compiler
179 +//========================================
180 +
181 +var Runtime = {
182 + stackSave: function () {
183 + return STACKTOP;
184 + },
185 + stackRestore: function (stackTop) {
186 + STACKTOP = stackTop;
187 + },
188 + forceAlign: function (target, quantum) {
189 + quantum = quantum || 4;
190 + if (quantum == 1) return target;
191 + if (isNumber(target) && isNumber(quantum)) {
192 + return Math.ceil(target/quantum)*quantum;
193 + } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {
194 + return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';
195 + }
196 + return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;
197 + },
198 + isNumberType: function (type) {
199 + return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;
200 + },
201 + isPointerType: function isPointerType(type) {
202 + return type[type.length-1] == '*';
203 +},
204 + isStructType: function isStructType(type) {
205 + if (isPointerType(type)) return false;
206 + if (isArrayType(type)) return true;
207 + if (/<?{ ?[^}]* ?}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types
208 + // See comment in isStructPointerType()
209 + return type[0] == '%';
210 +},
211 + INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},
212 + FLOAT_TYPES: {"float":0,"double":0},
213 + or64: function (x, y) {
214 + var l = (x | 0) | (y | 0);
215 + var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;
216 + return l + h;
217 + },
218 + and64: function (x, y) {
219 + var l = (x | 0) & (y | 0);
220 + var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;
221 + return l + h;
222 + },
223 + xor64: function (x, y) {
224 + var l = (x | 0) ^ (y | 0);
225 + var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;
226 + return l + h;
227 + },
228 + getNativeTypeSize: function (type) {
229 + switch (type) {
230 + case 'i1': case 'i8': return 1;
231 + case 'i16': return 2;
232 + case 'i32': return 4;
233 + case 'i64': return 8;
234 + case 'float': return 4;
235 + case 'double': return 8;
236 + default: {
237 + if (type[type.length-1] === '*') {
238 + return Runtime.QUANTUM_SIZE; // A pointer
239 + } else if (type[0] === 'i') {
240 + var bits = parseInt(type.substr(1));
241 + assert(bits % 8 === 0);
242 + return bits/8;
243 + } else {
244 + return 0;
245 + }
246 + }
247 + }
248 + },
249 + getNativeFieldSize: function (type) {
250 + return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
251 + },
252 + dedup: function dedup(items, ident) {
253 + var seen = {};
254 + if (ident) {
255 + return items.filter(function(item) {
256 + if (seen[item[ident]]) return false;
257 + seen[item[ident]] = true;
258 + return true;
259 + });
260 + } else {
261 + return items.filter(function(item) {
262 + if (seen[item]) return false;
263 + seen[item] = true;
264 + return true;
265 + });
266 + }
267 +},
268 + set: function set() {
269 + var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;
270 + var ret = {};
271 + for (var i = 0; i < args.length; i++) {
272 + ret[args[i]] = 0;
273 + }
274 + return ret;
275 +},
276 + STACK_ALIGN: 8,
277 + getAlignSize: function (type, size, vararg) {
278 + // we align i64s and doubles on 64-bit boundaries, unlike x86
279 + if (vararg) return 8;
280 + if (!vararg && (type == 'i64' || type == 'double')) return 8;
281 + if (!type) return Math.min(size, 8); // align structures internally to 64 bits
282 + return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);
283 + },
284 + calculateStructAlignment: function calculateStructAlignment(type) {
285 + type.flatSize = 0;
286 + type.alignSize = 0;
287 + var diffs = [];
288 + var prev = -1;
289 + var index = 0;
290 + type.flatIndexes = type.fields.map(function(field) {
291 + index++;
292 + var size, alignSize;
293 + if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {
294 + size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.
295 + alignSize = Runtime.getAlignSize(field, size);
296 + } else if (Runtime.isStructType(field)) {
297 + if (field[1] === '0') {
298 + // this is [0 x something]. When inside another structure like here, it must be at the end,
299 + // and it adds no size
300 + // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');
301 + size = 0;
302 + if (Types.types[field]) {
303 + alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
304 + } else {
305 + alignSize = type.alignSize || QUANTUM_SIZE;
306 + }
307 + } else {
308 + size = Types.types[field].flatSize;
309 + alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
310 + }
311 + } else if (field[0] == 'b') {
312 + // bN, large number field, like a [N x i8]
313 + size = field.substr(1)|0;
314 + alignSize = 1;
315 + } else if (field[0] === '<') {
316 + // vector type
317 + size = alignSize = Types.types[field].flatSize; // fully aligned
318 + } else if (field[0] === 'i') {
319 + // illegal integer field, that could not be legalized because it is an internal structure field
320 + // it is ok to have such fields, if we just use them as markers of field size and nothing more complex
321 + size = alignSize = parseInt(field.substr(1))/8;
322 + assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);
323 + } else {
324 + assert(false, 'invalid type for calculateStructAlignment');
325 + }
326 + if (type.packed) alignSize = 1;
327 + type.alignSize = Math.max(type.alignSize, alignSize);
328 + var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory
329 + type.flatSize = curr + size;
330 + if (prev >= 0) {
331 + diffs.push(curr-prev);
332 + }
333 + prev = curr;
334 + return curr;
335 + });
336 + if (type.name_ && type.name_[0] === '[') {
337 + // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid
338 + // allocating a potentially huge array for [999999 x i8] etc.
339 + type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;
340 + }
341 + type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);
342 + if (diffs.length == 0) {
343 + type.flatFactor = type.flatSize;
344 + } else if (Runtime.dedup(diffs).length == 1) {
345 + type.flatFactor = diffs[0];
346 + }
347 + type.needsFlattening = (type.flatFactor != 1);
348 + return type.flatIndexes;
349 + },
350 + generateStructInfo: function (struct, typeName, offset) {
351 + var type, alignment;
352 + if (typeName) {
353 + offset = offset || 0;
354 + type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];
355 + if (!type) return null;
356 + if (type.fields.length != struct.length) {
357 + printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');
358 + return null;
359 + }
360 + alignment = type.flatIndexes;
361 + } else {
362 + var type = { fields: struct.map(function(item) { return item[0] }) };
363 + alignment = Runtime.calculateStructAlignment(type);
364 + }
365 + var ret = {
366 + __size__: type.flatSize
367 + };
368 + if (typeName) {
369 + struct.forEach(function(item, i) {
370 + if (typeof item === 'string') {
371 + ret[item] = alignment[i] + offset;
372 + } else {
373 + // embedded struct
374 + var key;
375 + for (var k in item) key = k;
376 + ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);
377 + }
378 + });
379 + } else {
380 + struct.forEach(function(item, i) {
381 + ret[item[1]] = alignment[i];
382 + });
383 + }
384 + return ret;
385 + },
386 + dynCall: function (sig, ptr, args) {
387 + if (args && args.length) {
388 + assert(args.length == sig.length-1);
389 + return FUNCTION_TABLE[ptr].apply(null, args);
390 + } else {
391 + assert(sig.length == 1);
392 + return FUNCTION_TABLE[ptr]();
393 + }
394 + },
395 + addFunction: function (func) {
396 + var table = FUNCTION_TABLE;
397 + var ret = table.length;
398 + assert(ret % 2 === 0);
399 + table.push(func);
400 + for (var i = 0; i < 2-1; i++) table.push(0);
401 + return ret;
402 + },
403 + removeFunction: function (index) {
404 + var table = FUNCTION_TABLE;
405 + table[index] = null;
406 + },
407 + getAsmConst: function (code, numArgs) {
408 + // code is a constant string on the heap, so we can cache these
409 + if (!Runtime.asmConstCache) Runtime.asmConstCache = {};
410 + var func = Runtime.asmConstCache[code];
411 + if (func) return func;
412 + var args = [];
413 + for (var i = 0; i < numArgs; i++) {
414 + args.push(String.fromCharCode(36) + i); // $0, $1 etc
415 + }
416 + code = Pointer_stringify(code);
417 + if (code[0] === '"') {
418 + // tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct
419 + if (code.indexOf('"', 1) === code.length-1) {
420 + code = code.substr(1, code.length-2);
421 + } else {
422 + // something invalid happened, e.g. EM_ASM("..code($0)..", input)
423 + abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');
424 + }
425 + }
426 + return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node
427 + },
428 + warnOnce: function (text) {
429 + if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
430 + if (!Runtime.warnOnce.shown[text]) {
431 + Runtime.warnOnce.shown[text] = 1;
432 + Module.printErr(text);
433 + }
434 + },
435 + funcWrappers: {},
436 + getFuncWrapper: function (func, sig) {
437 + assert(sig);
438 + if (!Runtime.funcWrappers[func]) {
439 + Runtime.funcWrappers[func] = function dynCall_wrapper() {
440 + return Runtime.dynCall(sig, func, arguments);
441 + };
442 + }
443 + return Runtime.funcWrappers[func];
444 + },
445 + UTF8Processor: function () {
446 + var buffer = [];
447 + var needed = 0;
448 + this.processCChar = function (code) {
449 + code = code & 0xFF;
450 +
451 + if (buffer.length == 0) {
452 + if ((code & 0x80) == 0x00) { // 0xxxxxxx
453 + return String.fromCharCode(code);
454 + }
455 + buffer.push(code);
456 + if ((code & 0xE0) == 0xC0) { // 110xxxxx
457 + needed = 1;
458 + } else if ((code & 0xF0) == 0xE0) { // 1110xxxx
459 + needed = 2;
460 + } else { // 11110xxx
461 + needed = 3;
462 + }
463 + return '';
464 + }
465 +
466 + if (needed) {
467 + buffer.push(code);
468 + needed--;
469 + if (needed > 0) return '';
470 + }
471 +
472 + var c1 = buffer[0];
473 + var c2 = buffer[1];
474 + var c3 = buffer[2];
475 + var c4 = buffer[3];
476 + var ret;
477 + if (buffer.length == 2) {
478 + ret = String.fromCharCode(((c1 & 0x1F) << 6) | (c2 & 0x3F));
479 + } else if (buffer.length == 3) {
480 + ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F));
481 + } else {
482 + // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
483 + var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |
484 + ((c3 & 0x3F) << 6) | (c4 & 0x3F);
485 + ret = String.fromCharCode(
486 + Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,
487 + (codePoint - 0x10000) % 0x400 + 0xDC00);
488 + }
489 + buffer.length = 0;
490 + return ret;
491 + }
492 + this.processJSString = function processJSString(string) {
493 + string = unescape(encodeURIComponent(string));
494 + var ret = [];
495 + for (var i = 0; i < string.length; i++) {
496 + ret.push(string.charCodeAt(i));
497 + }
498 + return ret;
499 + }
500 + },
501 + stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8);(assert((STACKTOP|0) < (STACK_MAX|0))|0); return ret; },
502 + staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + (assert(!staticSealed),size))|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },
503 + dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + (assert(DYNAMICTOP > 0),size))|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },
504 + alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },
505 + makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((low>>>0)+((high>>>0)*4294967296)) : ((low>>>0)+((high|0)*4294967296))); return ret; },
506 + GLOBAL_BASE: 8,
507 + QUANTUM_SIZE: 4,
508 + __dummy__: 0
509 +}
510 +
511 +
512 +Module['Runtime'] = Runtime;
513 +
514 +
515 +
516 +
517 +
518 +
519 +
520 +
521 +
522 +//========================================
523 +// Runtime essentials
524 +//========================================
525 +
526 +var __THREW__ = 0; // Used in checking for thrown exceptions.
527 +var setjmpId = 1; // Used in setjmp/longjmp
528 +var setjmpLabels = {};
529 +
530 +var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()
531 +var EXITSTATUS = 0;
532 +
533 +var undef = 0;
534 +// tempInt is used for 32-bit signed values or smaller. tempBigInt is used
535 +// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt
536 +var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;
537 +var tempI64, tempI64b;
538 +var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;
539 +
540 +function assert(condition, text) {
541 + if (!condition) {
542 + abort('Assertion failed: ' + text);
543 + }
544 +}
545 +
546 +var globalScope = this;
547 +
548 +// C calling interface. A convenient way to call C functions (in C files, or
549 +// defined with extern "C").
550 +//
551 +// Note: LLVM optimizations can inline and remove functions, after which you will not be
552 +// able to call them. Closure can also do so. To avoid that, add your function to
553 +// the exports using something like
554 +//
555 +// -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]'
556 +//
557 +// @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C")
558 +// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and
559 +// 'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).
560 +// @param argTypes An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,
561 +// except that 'array' is not possible (there is no way for us to know the length of the array)
562 +// @param args An array of the arguments to the function, as native JS values (as in returnType)
563 +// Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).
564 +// @return The return value, as a native JS value (as in returnType)
565 +function ccall(ident, returnType, argTypes, args) {
566 + return ccallFunc(getCFunc(ident), returnType, argTypes, args);
567 +}
568 +Module["ccall"] = ccall;
569 +
570 +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
571 +function getCFunc(ident) {
572 + try {
573 + var func = Module['_' + ident]; // closure exported function
574 + if (!func) func = eval('_' + ident); // explicit lookup
575 + } catch(e) {
576 + }
577 + assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
578 + return func;
579 +}
580 +
581 +// Internal function that does a C call using a function, not an identifier
582 +function ccallFunc(func, returnType, argTypes, args) {
583 + var stack = 0;
584 + function toC(value, type) {
585 + if (type == 'string') {
586 + if (value === null || value === undefined || value === 0) return 0; // null string
587 + value = intArrayFromString(value);
588 + type = 'array';
589 + }
590 + if (type == 'array') {
591 + if (!stack) stack = Runtime.stackSave();
592 + var ret = Runtime.stackAlloc(value.length);
593 + writeArrayToMemory(value, ret);
594 + return ret;
595 + }
596 + return value;
597 + }
598 + function fromC(value, type) {
599 + if (type == 'string') {
600 + return Pointer_stringify(value);
601 + }
602 + assert(type != 'array');
603 + return value;
604 + }
605 + var i = 0;
606 + var cArgs = args ? args.map(function(arg) {
607 + return toC(arg, argTypes[i++]);
608 + }) : [];
609 + var ret = fromC(func.apply(null, cArgs), returnType);
610 + if (stack) Runtime.stackRestore(stack);
611 + return ret;
612 +}
613 +
614 +// Returns a native JS wrapper for a C function. This is similar to ccall, but
615 +// returns a function you can call repeatedly in a normal way. For example:
616 +//
617 +// var my_function = cwrap('my_c_function', 'number', ['number', 'number']);
618 +// alert(my_function(5, 22));
619 +// alert(my_function(99, 12));
620 +//
621 +function cwrap(ident, returnType, argTypes) {
622 + var func = getCFunc(ident);
623 + return function() {
624 + return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));
625 + }
626 +}
627 +Module["cwrap"] = cwrap;
628 +
629 +// Sets a value in memory in a dynamic way at run-time. Uses the
630 +// type data. This is the same as makeSetValue, except that
631 +// makeSetValue is done at compile-time and generates the needed
632 +// code then, whereas this function picks the right code at
633 +// run-time.
634 +// Note that setValue and getValue only do *aligned* writes and reads!
635 +// Note that ccall uses JS types as for defining types, while setValue and
636 +// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation
637 +function setValue(ptr, value, type, noSafe) {
638 + type = type || 'i8';
639 + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
640 + switch(type) {
641 + case 'i1': HEAP8[(ptr)]=value; break;
642 + case 'i8': HEAP8[(ptr)]=value; break;
643 + case 'i16': HEAP16[((ptr)>>1)]=value; break;
644 + case 'i32': HEAP32[((ptr)>>2)]=value; break;
645 + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,Math_abs(tempDouble) >= 1 ? (tempDouble > 0 ? Math_min(Math_floor((tempDouble)/4294967296), 4294967295)>>>0 : (~~(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296)))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break;
646 + case 'float': HEAPF32[((ptr)>>2)]=value; break;
647 + case 'double': HEAPF64[((ptr)>>3)]=value; break;
648 + default: abort('invalid type for setValue: ' + type);
649 + }
650 +}
651 +Module['setValue'] = setValue;
652 +
653 +// Parallel to setValue.
654 +function getValue(ptr, type, noSafe) {
655 + type = type || 'i8';
656 + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
657 + switch(type) {
658 + case 'i1': return HEAP8[(ptr)];
659 + case 'i8': return HEAP8[(ptr)];
660 + case 'i16': return HEAP16[((ptr)>>1)];
661 + case 'i32': return HEAP32[((ptr)>>2)];
662 + case 'i64': return HEAP32[((ptr)>>2)];
663 + case 'float': return HEAPF32[((ptr)>>2)];
664 + case 'double': return HEAPF64[((ptr)>>3)];
665 + default: abort('invalid type for setValue: ' + type);
666 + }
667 + return null;
668 +}
669 +Module['getValue'] = getValue;
670 +
671 +var ALLOC_NORMAL = 0; // Tries to use _malloc()
672 +var ALLOC_STACK = 1; // Lives for the duration of the current function call
673 +var ALLOC_STATIC = 2; // Cannot be freed
674 +var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
675 +var ALLOC_NONE = 4; // Do not allocate
676 +Module['ALLOC_NORMAL'] = ALLOC_NORMAL;
677 +Module['ALLOC_STACK'] = ALLOC_STACK;
678 +Module['ALLOC_STATIC'] = ALLOC_STATIC;
679 +Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;
680 +Module['ALLOC_NONE'] = ALLOC_NONE;
681 +
682 +// allocate(): This is for internal use. You can use it yourself as well, but the interface
683 +// is a little tricky (see docs right below). The reason is that it is optimized
684 +// for multiple syntaxes to save space in generated code. So you should
685 +// normally not use allocate(), and instead allocate memory using _malloc(),
686 +// initialize it with setValue(), and so forth.
687 +// @slab: An array of data, or a number. If a number, then the size of the block to allocate,
688 +// in *bytes* (note that this is sometimes confusing: the next parameter does not
689 +// affect this!)
690 +// @types: Either an array of types, one for each byte (or 0 if no type at that position),
691 +// or a single type which is used for the entire block. This only matters if there
692 +// is initial data - if @slab is a number, then this does not matter at all and is
693 +// ignored.
694 +// @allocator: How to allocate memory, see ALLOC_*
695 +function allocate(slab, types, allocator, ptr) {
696 + var zeroinit, size;
697 + if (typeof slab === 'number') {
698 + zeroinit = true;
699 + size = slab;
700 + } else {
701 + zeroinit = false;
702 + size = slab.length;
703 + }
704 +
705 + var singleType = typeof types === 'string' ? types : null;
706 +
707 + var ret;
708 + if (allocator == ALLOC_NONE) {
709 + ret = ptr;
710 + } else {
711 + ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
712 + }
713 +
714 + if (zeroinit) {
715 + var ptr = ret, stop;
716 + assert((ret & 3) == 0);
717 + stop = ret + (size & ~3);
718 + for (; ptr < stop; ptr += 4) {
719 + HEAP32[((ptr)>>2)]=0;
720 + }
721 + stop = ret + size;
722 + while (ptr < stop) {
723 + HEAP8[((ptr++)|0)]=0;
724 + }
725 + return ret;
726 + }
727 +
728 + if (singleType === 'i8') {
729 + if (slab.subarray || slab.slice) {
730 + HEAPU8.set(slab, ret);
731 + } else {
732 + HEAPU8.set(new Uint8Array(slab), ret);
733 + }
734 + return ret;
735 + }
736 +
737 + var i = 0, type, typeSize, previousType;
738 + while (i < size) {
739 + var curr = slab[i];
740 +
741 + if (typeof curr === 'function') {
742 + curr = Runtime.getFunctionIndex(curr);
743 + }
744 +
745 + type = singleType || types[i];
746 + if (type === 0) {
747 + i++;
748 + continue;
749 + }
750 + assert(type, 'Must know what type to store in allocate!');
751 +
752 + if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later
753 +
754 + setValue(ret+i, curr, type);
755 +
756 + // no need to look up size unless type changes, so cache it
757 + if (previousType !== type) {
758 + typeSize = Runtime.getNativeTypeSize(type);
759 + previousType = type;
760 + }
761 + i += typeSize;
762 + }
763 +
764 + return ret;
765 +}
766 +Module['allocate'] = allocate;
767 +
768 +function Pointer_stringify(ptr, /* optional */ length) {
769 + // TODO: use TextDecoder
770 + // Find the length, and check for UTF while doing so
771 + var hasUtf = false;
772 + var t;
773 + var i = 0;
774 + while (1) {
775 + assert(ptr + i < TOTAL_MEMORY);
776 + t = HEAPU8[(((ptr)+(i))|0)];
777 + if (t >= 128) hasUtf = true;
778 + else if (t == 0 && !length) break;
779 + i++;
780 + if (length && i == length) break;
781 + }
782 + if (!length) length = i;
783 +
784 + var ret = '';
785 +
786 + if (!hasUtf) {
787 + var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
788 + var curr;
789 + while (length > 0) {
790 + curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
791 + ret = ret ? ret + curr : curr;
792 + ptr += MAX_CHUNK;
793 + length -= MAX_CHUNK;
794 + }
795 + return ret;
796 + }
797 +
798 + var utf8 = new Runtime.UTF8Processor();
799 + for (i = 0; i < length; i++) {
800 + assert(ptr + i < TOTAL_MEMORY);
801 + t = HEAPU8[(((ptr)+(i))|0)];
802 + ret += utf8.processCChar(t);
803 + }
804 + return ret;
805 +}
806 +Module['Pointer_stringify'] = Pointer_stringify;
807 +
808 +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
809 +// a copy of that string as a Javascript String object.
810 +function UTF16ToString(ptr) {
811 + var i = 0;
812 +
813 + var str = '';
814 + while (1) {
815 + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
816 + if (codeUnit == 0)
817 + return str;
818 + ++i;
819 + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
820 + str += String.fromCharCode(codeUnit);
821 + }
822 +}
823 +Module['UTF16ToString'] = UTF16ToString;
824 +
825 +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
826 +// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.
827 +function stringToUTF16(str, outPtr) {
828 + for(var i = 0; i < str.length; ++i) {
829 + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
830 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
831 + HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;
832 + }
833 + // Null-terminate the pointer to the HEAP.
834 + HEAP16[(((outPtr)+(str.length*2))>>1)]=0;
835 +}
836 +Module['stringToUTF16'] = stringToUTF16;
837 +
838 +// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns
839 +// a copy of that string as a Javascript String object.
840 +function UTF32ToString(ptr) {
841 + var i = 0;
842 +
843 + var str = '';
844 + while (1) {
845 + var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
846 + if (utf32 == 0)
847 + return str;
848 + ++i;
849 + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
850 + if (utf32 >= 0x10000) {
851 + var ch = utf32 - 0x10000;
852 + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
853 + } else {
854 + str += String.fromCharCode(utf32);
855 + }
856 + }
857 +}
858 +Module['UTF32ToString'] = UTF32ToString;
859 +
860 +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
861 +// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,
862 +// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.
863 +function stringToUTF32(str, outPtr) {
864 + var iChar = 0;
865 + for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {
866 + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
867 + var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate
868 + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
869 + var trailSurrogate = str.charCodeAt(++iCodeUnit);
870 + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
871 + }
872 + HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;
873 + ++iChar;
874 + }
875 + // Null-terminate the pointer to the HEAP.
876 + HEAP32[(((outPtr)+(iChar*4))>>2)]=0;
877 +}
878 +Module['stringToUTF32'] = stringToUTF32;
879 +
880 +function demangle(func) {
881 + try {
882 + // Special-case the entry point, since its name differs from other name mangling.
883 + if (func == 'Object._main' || func == '_main') {
884 + return 'main()';
885 + }
886 + if (typeof func === 'number') func = Pointer_stringify(func);
887 + if (func[0] !== '_') return func;
888 + if (func[1] !== '_') return func; // C function
889 + if (func[2] !== 'Z') return func;
890 + switch (func[3]) {
891 + case 'n': return 'operator new()';
892 + case 'd': return 'operator delete()';
893 + }
894 + var i = 3;
895 + // params, etc.
896 + var basicTypes = {
897 + 'v': 'void',
898 + 'b': 'bool',
899 + 'c': 'char',
900 + 's': 'short',
901 + 'i': 'int',
902 + 'l': 'long',
903 + 'f': 'float',
904 + 'd': 'double',
905 + 'w': 'wchar_t',
906 + 'a': 'signed char',
907 + 'h': 'unsigned char',
908 + 't': 'unsigned short',
909 + 'j': 'unsigned int',
910 + 'm': 'unsigned long',
911 + 'x': 'long long',
912 + 'y': 'unsigned long long',
913 + 'z': '...'
914 + };
915 + function dump(x) {
916 + //return;
917 + if (x) Module.print(x);
918 + Module.print(func);
919 + var pre = '';
920 + for (var a = 0; a < i; a++) pre += ' ';
921 + Module.print (pre + '^');
922 + }
923 + var subs = [];
924 + function parseNested() {
925 + i++;
926 + if (func[i] === 'K') i++; // ignore const
927 + var parts = [];
928 + while (func[i] !== 'E') {
929 + if (func[i] === 'S') { // substitution
930 + i++;
931 + var next = func.indexOf('_', i);
932 + var num = func.substring(i, next) || 0;
933 + parts.push(subs[num] || '?');
934 + i = next+1;
935 + continue;
936 + }
937 + if (func[i] === 'C') { // constructor
938 + parts.push(parts[parts.length-1]);
939 + i += 2;
940 + continue;
941 + }
942 + var size = parseInt(func.substr(i));
943 + var pre = size.toString().length;
944 + if (!size || !pre) { i--; break; } // counter i++ below us
945 + var curr = func.substr(i + pre, size);
946 + parts.push(curr);
947 + subs.push(curr);
948 + i += pre + size;
949 + }
950 + i++; // skip E
951 + return parts;
952 + }
953 + var first = true;
954 + function parse(rawList, limit, allowVoid) { // main parser
955 + limit = limit || Infinity;
956 + var ret = '', list = [];
957 + function flushList() {
958 + return '(' + list.join(', ') + ')';
959 + }
960 + var name;
961 + if (func[i] === 'N') {
962 + // namespaced N-E
963 + name = parseNested().join('::');
964 + limit--;
965 + if (limit === 0) return rawList ? [name] : name;
966 + } else {
967 + // not namespaced
968 + if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'
969 + var size = parseInt(func.substr(i));
970 + if (size) {
971 + var pre = size.toString().length;
972 + name = func.substr(i + pre, size);
973 + i += pre + size;
974 + }
975 + }
976 + first = false;
977 + if (func[i] === 'I') {
978 + i++;
979 + var iList = parse(true);
980 + var iRet = parse(true, 1, true);
981 + ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';
982 + } else {
983 + ret = name;
984 + }
985 + paramLoop: while (i < func.length && limit-- > 0) {
986 + //dump('paramLoop');
987 + var c = func[i++];
988 + if (c in basicTypes) {
989 + list.push(basicTypes[c]);
990 + } else {
991 + switch (c) {
992 + case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer
993 + case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference
994 + case 'L': { // literal
995 + i++; // skip basic type
996 + var end = func.indexOf('E', i);
997 + var size = end - i;
998 + list.push(func.substr(i, size));
999 + i += size + 2; // size + 'EE'
1000 + break;
1001 + }
1002 + case 'A': { // array
1003 + var size = parseInt(func.substr(i));
1004 + i += size.toString().length;
1005 + if (func[i] !== '_') throw '?';
1006 + i++; // skip _
1007 + list.push(parse(true, 1, true)[0] + ' [' + size + ']');
1008 + break;
1009 + }
1010 + case 'E': break paramLoop;
1011 + default: ret += '?' + c; break paramLoop;
1012 + }
1013 + }
1014 + }
1015 + if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)
1016 + return rawList ? list : ret + flushList();
1017 + }
1018 + return parse();
1019 + } catch(e) {
1020 + return func;
1021 + }
1022 +}
1023 +
1024 +function demangleAll(text) {
1025 + return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });
1026 +}
1027 +
1028 +function stackTrace() {
1029 + var stack = new Error().stack;
1030 + return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.
1031 +}
1032 +
1033 +// Memory management
1034 +
1035 +var PAGE_SIZE = 4096;
1036 +function alignMemoryPage(x) {
1037 + return (x+4095)&-4096;
1038 +}
1039 +
1040 +var HEAP;
1041 +var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
1042 +
1043 +var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area
1044 +var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area
1045 +var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk
1046 +
1047 +function enlargeMemory() {
1048 + abort('Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + TOTAL_MEMORY + ', (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');
1049 +}
1050 +
1051 +var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
1052 +var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;
1053 +var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;
1054 +
1055 +
1056 +// Initialize the runtime's memory
1057 +// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
1058 +assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
1059 + 'Cannot fallback to non-typed array case: Code is too specialized');
1060 +
1061 +var buffer = new ArrayBuffer(TOTAL_MEMORY);
1062 +HEAP8 = new Int8Array(buffer);
1063 +HEAP16 = new Int16Array(buffer);
1064 +HEAP32 = new Int32Array(buffer);
1065 +HEAPU8 = new Uint8Array(buffer);
1066 +HEAPU16 = new Uint16Array(buffer);
1067 +HEAPU32 = new Uint32Array(buffer);
1068 +HEAPF32 = new Float32Array(buffer);
1069 +HEAPF64 = new Float64Array(buffer);
1070 +
1071 +// Endianness check (note: assumes compiler arch was little-endian)
1072 +HEAP32[0] = 255;
1073 +assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');
1074 +
1075 +Module['HEAP'] = HEAP;
1076 +Module['HEAP8'] = HEAP8;
1077 +Module['HEAP16'] = HEAP16;
1078 +Module['HEAP32'] = HEAP32;
1079 +Module['HEAPU8'] = HEAPU8;
1080 +Module['HEAPU16'] = HEAPU16;
1081 +Module['HEAPU32'] = HEAPU32;
1082 +Module['HEAPF32'] = HEAPF32;
1083 +Module['HEAPF64'] = HEAPF64;
1084 +
1085 +function callRuntimeCallbacks(callbacks) {
1086 + while(callbacks.length > 0) {
1087 + var callback = callbacks.shift();
1088 + if (typeof callback == 'function') {
1089 + callback();
1090 + continue;
1091 + }
1092 + var func = callback.func;
1093 + if (typeof func === 'number') {
1094 + if (callback.arg === undefined) {
1095 + Runtime.dynCall('v', func);
1096 + } else {
1097 + Runtime.dynCall('vi', func, [callback.arg]);
1098 + }
1099 + } else {
1100 + func(callback.arg === undefined ? null : callback.arg);
1101 + }
1102 + }
1103 +}
1104 +
1105 +var __ATPRERUN__ = []; // functions called before the runtime is initialized
1106 +var __ATINIT__ = []; // functions called during startup
1107 +var __ATMAIN__ = []; // functions called when main() is to be run
1108 +var __ATEXIT__ = []; // functions called during shutdown
1109 +var __ATPOSTRUN__ = []; // functions called after the runtime has exited
1110 +
1111 +var runtimeInitialized = false;
1112 +
1113 +function preRun() {
1114 + // compatibility - merge in anything from Module['preRun'] at this time
1115 + if (Module['preRun']) {
1116 + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
1117 + while (Module['preRun'].length) {
1118 + addOnPreRun(Module['preRun'].shift());
1119 + }
1120 + }
1121 + callRuntimeCallbacks(__ATPRERUN__);
1122 +}
1123 +
1124 +function ensureInitRuntime() {
1125 + if (runtimeInitialized) return;
1126 + runtimeInitialized = true;
1127 + callRuntimeCallbacks(__ATINIT__);
1128 +}
1129 +
1130 +function preMain() {
1131 + callRuntimeCallbacks(__ATMAIN__);
1132 +}
1133 +
1134 +function exitRuntime() {
1135 + callRuntimeCallbacks(__ATEXIT__);
1136 +}
1137 +
1138 +function postRun() {
1139 + // compatibility - merge in anything from Module['postRun'] at this time
1140 + if (Module['postRun']) {
1141 + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
1142 + while (Module['postRun'].length) {
1143 + addOnPostRun(Module['postRun'].shift());
1144 + }
1145 + }
1146 + callRuntimeCallbacks(__ATPOSTRUN__);
1147 +}
1148 +
1149 +function addOnPreRun(cb) {
1150 + __ATPRERUN__.unshift(cb);
1151 +}
1152 +Module['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;
1153 +
1154 +function addOnInit(cb) {
1155 + __ATINIT__.unshift(cb);
1156 +}
1157 +Module['addOnInit'] = Module.addOnInit = addOnInit;
1158 +
1159 +function addOnPreMain(cb) {
1160 + __ATMAIN__.unshift(cb);
1161 +}
1162 +Module['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;
1163 +
1164 +function addOnExit(cb) {
1165 + __ATEXIT__.unshift(cb);
1166 +}
1167 +Module['addOnExit'] = Module.addOnExit = addOnExit;
1168 +
1169 +function addOnPostRun(cb) {
1170 + __ATPOSTRUN__.unshift(cb);
1171 +}
1172 +Module['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;
1173 +
1174 +// Tools
1175 +
1176 +// This processes a JS string into a C-line array of numbers, 0-terminated.
1177 +// For LLVM-originating strings, see parser.js:parseLLVMString function
1178 +function intArrayFromString(stringy, dontAddNull, length /* optional */) {
1179 + var ret = (new Runtime.UTF8Processor()).processJSString(stringy);
1180 + if (length) {
1181 + ret.length = length;
1182 + }
1183 + if (!dontAddNull) {
1184 + ret.push(0);
1185 + }
1186 + return ret;
1187 +}
1188 +Module['intArrayFromString'] = intArrayFromString;
1189 +
1190 +function intArrayToString(array) {
1191 + var ret = [];
1192 + for (var i = 0; i < array.length; i++) {
1193 + var chr = array[i];
1194 + if (chr > 0xFF) {
1195 + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.');
1196 + chr &= 0xFF;
1197 + }
1198 + ret.push(String.fromCharCode(chr));
1199 + }
1200 + return ret.join('');
1201 +}
1202 +Module['intArrayToString'] = intArrayToString;
1203 +
1204 +// Write a Javascript array to somewhere in the heap
1205 +function writeStringToMemory(string, buffer, dontAddNull) {
1206 + var array = intArrayFromString(string, dontAddNull);
1207 + var i = 0;
1208 + while (i < array.length) {
1209 + var chr = array[i];
1210 + HEAP8[(((buffer)+(i))|0)]=chr;
1211 + i = i + 1;
1212 + }
1213 +}
1214 +Module['writeStringToMemory'] = writeStringToMemory;
1215 +
1216 +function writeArrayToMemory(array, buffer) {
1217 + for (var i = 0; i < array.length; i++) {
1218 + HEAP8[(((buffer)+(i))|0)]=array[i];
1219 + }
1220 +}
1221 +Module['writeArrayToMemory'] = writeArrayToMemory;
1222 +
1223 +function writeAsciiToMemory(str, buffer, dontAddNull) {
1224 + for (var i = 0; i < str.length; i++) {
1225 + assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff);
1226 + HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);
1227 + }
1228 + if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;
1229 +}
1230 +Module['writeAsciiToMemory'] = writeAsciiToMemory;
1231 +
1232 +function unSign(value, bits, ignore, sig) {
1233 + if (value >= 0) {
1234 + return value;
1235 + }
1236 + return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
1237 + : Math.pow(2, bits) + value;
1238 +}
1239 +function reSign(value, bits, ignore, sig) {
1240 + if (value <= 0) {
1241 + return value;
1242 + }
1243 + var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
1244 + : Math.pow(2, bits-1);
1245 + if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that
1246 + // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
1247 + // TODO: In i64 mode 1, resign the two parts separately and safely
1248 + value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
1249 + }
1250 + return value;
1251 +}
1252 +
1253 +// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
1254 +if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
1255 + var ah = a >>> 16;
1256 + var al = a & 0xffff;
1257 + var bh = b >>> 16;
1258 + var bl = b & 0xffff;
1259 + return (al*bl + ((ah*bl + al*bh) << 16))|0;
1260 +};
1261 +Math.imul = Math['imul'];
1262 +
1263 +
1264 +var Math_abs = Math.abs;
1265 +var Math_cos = Math.cos;
1266 +var Math_sin = Math.sin;
1267 +var Math_tan = Math.tan;
1268 +var Math_acos = Math.acos;
1269 +var Math_asin = Math.asin;
1270 +var Math_atan = Math.atan;
1271 +var Math_atan2 = Math.atan2;
1272 +var Math_exp = Math.exp;
1273 +var Math_log = Math.log;
1274 +var Math_sqrt = Math.sqrt;
1275 +var Math_ceil = Math.ceil;
1276 +var Math_floor = Math.floor;
1277 +var Math_pow = Math.pow;
1278 +var Math_imul = Math.imul;
1279 +var Math_fround = Math.fround;
1280 +var Math_min = Math.min;
1281 +
1282 +// A counter of dependencies for calling run(). If we need to
1283 +// do asynchronous work before running, increment this and
1284 +// decrement it. Incrementing must happen in a place like
1285 +// PRE_RUN_ADDITIONS (used by emcc to add file preloading).
1286 +// Note that you can add dependencies in preRun, even though
1287 +// it happens right before run - run will be postponed until
1288 +// the dependencies are met.
1289 +var runDependencies = 0;
1290 +var runDependencyWatcher = null;
1291 +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
1292 +var runDependencyTracking = {};
1293 +
1294 +function addRunDependency(id) {
1295 + runDependencies++;
1296 + if (Module['monitorRunDependencies']) {
1297 + Module['monitorRunDependencies'](runDependencies);
1298 + }
1299 + if (id) {
1300 + assert(!runDependencyTracking[id]);
1301 + runDependencyTracking[id] = 1;
1302 + if (runDependencyWatcher === null && typeof setInterval !== 'undefined') {
1303 + // Check for missing dependencies every few seconds
1304 + runDependencyWatcher = setInterval(function() {
1305 + var shown = false;
1306 + for (var dep in runDependencyTracking) {
1307 + if (!shown) {
1308 + shown = true;
1309 + Module.printErr('still waiting on run dependencies:');
1310 + }
1311 + Module.printErr('dependency: ' + dep);
1312 + }
1313 + if (shown) {
1314 + Module.printErr('(end of list)');
1315 + }
1316 + }, 10000);
1317 + }
1318 + } else {
1319 + Module.printErr('warning: run dependency added without ID');
1320 + }
1321 +}
1322 +Module['addRunDependency'] = addRunDependency;
1323 +function removeRunDependency(id) {
1324 + runDependencies--;
1325 + if (Module['monitorRunDependencies']) {
1326 + Module['monitorRunDependencies'](runDependencies);
1327 + }
1328 + if (id) {
1329 + assert(runDependencyTracking[id]);
1330 + delete runDependencyTracking[id];
1331 + } else {
1332 + Module.printErr('warning: run dependency removed without ID');
1333 + }
1334 + if (runDependencies == 0) {
1335 + if (runDependencyWatcher !== null) {
1336 + clearInterval(runDependencyWatcher);
1337 + runDependencyWatcher = null;
1338 + }
1339 + if (dependenciesFulfilled) {
1340 + var callback = dependenciesFulfilled;
1341 + dependenciesFulfilled = null;
1342 + callback(); // can add another dependenciesFulfilled
1343 + }
1344 + }
1345 +}
1346 +Module['removeRunDependency'] = removeRunDependency;
1347 +
1348 +Module["preloadedImages"] = {}; // maps url to image data
1349 +Module["preloadedAudios"] = {}; // maps url to audio data
1350 +
1351 +
1352 +var memoryInitializer = null;
1353 +
1354 +// === Body ===
1355 +
1356 +
1357 +
1358 +STATIC_BASE = 8;
1359 +
1360 +STATICTOP = STATIC_BASE + 504;
1361 +
1362 +
1363 +/* global initializers */ __ATINIT__.push({ func: function() { runPostSets() } });
1364 +
1365 +
1366 +
1367 +
1368 +
1369 +/* memory initializer */ allocate([255,255,255,0,0,0,0,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE);
1370 +function runPostSets() {
1371 +
1372 +
1373 +}
1374 +
1375 +var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8);
1376 +
1377 +assert(tempDoublePtr % 8 == 0);
1378 +
1379 +function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
1380 +
1381 + HEAP8[tempDoublePtr] = HEAP8[ptr];
1382 +
1383 + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
1384 +
1385 + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
1386 +
1387 + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
1388 +
1389 +}
1390 +
1391 +function copyTempDouble(ptr) {
1392 +
1393 + HEAP8[tempDoublePtr] = HEAP8[ptr];
1394 +
1395 + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
1396 +
1397 + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
1398 +
1399 + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
1400 +
1401 + HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];
1402 +
1403 + HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];
1404 +
1405 + HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];
1406 +
1407 + HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];
1408 +
1409 +}
1410 +
1411 +
1412 +
1413 + function _memset(ptr, value, num) {
1414 + ptr = ptr|0; value = value|0; num = num|0;
1415 + var stop = 0, value4 = 0, stop4 = 0, unaligned = 0;
1416 + stop = (ptr + num)|0;
1417 + if ((num|0) >= 20) {
1418 + // This is unaligned, but quite large, so work hard to get to aligned settings
1419 + value = value & 0xff;
1420 + unaligned = ptr & 3;
1421 + value4 = value | (value << 8) | (value << 16) | (value << 24);
1422 + stop4 = stop & ~3;
1423 + if (unaligned) {
1424 + unaligned = (ptr + 4 - unaligned)|0;
1425 + while ((ptr|0) < (unaligned|0)) { // no need to check for stop, since we have large num
1426 + HEAP8[(ptr)]=value;
1427 + ptr = (ptr+1)|0;
1428 + }
1429 + }
1430 + while ((ptr|0) < (stop4|0)) {
1431 + HEAP32[((ptr)>>2)]=value4;
1432 + ptr = (ptr+4)|0;
1433 + }
1434 + }
1435 + while ((ptr|0) < (stop|0)) {
1436 + HEAP8[(ptr)]=value;
1437 + ptr = (ptr+1)|0;
1438 + }
1439 + return (ptr-num)|0;
1440 + }var _llvm_memset_p0i8_i32=_memset;
1441 +
1442 +
1443 + function _memcpy(dest, src, num) {
1444 + dest = dest|0; src = src|0; num = num|0;
1445 + var ret = 0;
1446 + ret = dest|0;
1447 + if ((dest&3) == (src&3)) {
1448 + while (dest & 3) {
1449 + if ((num|0) == 0) return ret|0;
1450 + HEAP8[(dest)]=HEAP8[(src)];
1451 + dest = (dest+1)|0;
1452 + src = (src+1)|0;
1453 + num = (num-1)|0;
1454 + }
1455 + while ((num|0) >= 4) {
1456 + HEAP32[((dest)>>2)]=HEAP32[((src)>>2)];
1457 + dest = (dest+4)|0;
1458 + src = (src+4)|0;
1459 + num = (num-4)|0;
1460 + }
1461 + }
1462 + while ((num|0) > 0) {
1463 + HEAP8[(dest)]=HEAP8[(src)];
1464 + dest = (dest+1)|0;
1465 + src = (src+1)|0;
1466 + num = (num-1)|0;
1467 + }
1468 + return ret|0;
1469 + }var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;
1470 +
1471 + function _abort() {
1472 + Module['abort']();
1473 + }
1474 +
1475 +
1476 +
1477 + var ___errno_state=0;function ___setErrNo(value) {
1478 + // For convenient setting and returning of errno.
1479 + HEAP32[((___errno_state)>>2)]=value;
1480 + return value;
1481 + }function ___errno_location() {
1482 + return ___errno_state;
1483 + }
1484 +
1485 + function _sbrk(bytes) {
1486 + // Implement a Linux-like 'memory area' for our 'process'.
1487 + // Changes the size of the memory area by |bytes|; returns the
1488 + // address of the previous top ('break') of the memory area
1489 + // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP
1490 + var self = _sbrk;
1491 + if (!self.called) {
1492 + DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned
1493 + self.called = true;
1494 + assert(Runtime.dynamicAlloc);
1495 + self.alloc = Runtime.dynamicAlloc;
1496 + Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };
1497 + }
1498 + var ret = DYNAMICTOP;
1499 + if (bytes != 0) self.alloc(bytes);
1500 + return ret; // Previous break location.
1501 + }
1502 +
1503 +
1504 + var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name) {
1505 + // long sysconf(int name);
1506 + // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
1507 + switch(name) {
1508 + case 30: return PAGE_SIZE;
1509 + case 132:
1510 + case 133:
1511 + case 12:
1512 + case 137:
1513 + case 138:
1514 + case 15:
1515 + case 235:
1516 + case 16:
1517 + case 17:
1518 + case 18:
1519 + case 19:
1520 + case 20:
1521 + case 149:
1522 + case 13:
1523 + case 10:
1524 + case 236:
1525 + case 153:
1526 + case 9:
1527 + case 21:
1528 + case 22:
1529 + case 159:
1530 + case 154:
1531 + case 14:
1532 + case 77:
1533 + case 78:
1534 + case 139:
1535 + case 80:
1536 + case 81:
1537 + case 79:
1538 + case 82:
1539 + case 68:
1540 + case 67:
1541 + case 164:
1542 + case 11:
1543 + case 29:
1544 + case 47:
1545 + case 48:
1546 + case 95:
1547 + case 52:
1548 + case 51:
1549 + case 46:
1550 + return 200809;
1551 + case 27:
1552 + case 246:
1553 + case 127:
1554 + case 128:
1555 + case 23:
1556 + case 24:
1557 + case 160:
1558 + case 161:
1559 + case 181:
1560 + case 182:
1561 + case 242:
1562 + case 183:
1563 + case 184:
1564 + case 243:
1565 + case 244:
1566 + case 245:
1567 + case 165:
1568 + case 178:
1569 + case 179:
1570 + case 49:
1571 + case 50:
1572 + case 168:
1573 + case 169:
1574 + case 175:
1575 + case 170:
1576 + case 171:
1577 + case 172:
1578 + case 97:
1579 + case 76:
1580 + case 32:
1581 + case 173:
1582 + case 35:
1583 + return -1;
1584 + case 176:
1585 + case 177:
1586 + case 7:
1587 + case 155:
1588 + case 8:
1589 + case 157:
1590 + case 125:
1591 + case 126:
1592 + case 92:
1593 + case 93:
1594 + case 129:
1595 + case 130:
1596 + case 131:
1597 + case 94:
1598 + case 91:
1599 + return 1;
1600 + case 74:
1601 + case 60:
1602 + case 69:
1603 + case 70:
1604 + case 4:
1605 + return 1024;
1606 + case 31:
1607 + case 42:
1608 + case 72:
1609 + return 32;
1610 + case 87:
1611 + case 26:
1612 + case 33:
1613 + return 2147483647;
1614 + case 34:
1615 + case 1:
1616 + return 47839;
1617 + case 38:
1618 + case 36:
1619 + return 99;
1620 + case 43:
1621 + case 37:
1622 + return 2048;
1623 + case 0: return 2097152;
1624 + case 3: return 65536;
1625 + case 28: return 32768;
1626 + case 44: return 32767;
1627 + case 75: return 16384;
1628 + case 39: return 1000;
1629 + case 89: return 700;
1630 + case 71: return 256;
1631 + case 40: return 255;
1632 + case 2: return 100;
1633 + case 180: return 64;
1634 + case 25: return 20;
1635 + case 5: return 16;
1636 + case 6: return 6;
1637 + case 73: return 4;
1638 + case 84: return 1;
1639 + }
1640 + ___setErrNo(ERRNO_CODES.EINVAL);
1641 + return -1;
1642 + }
1643 +
1644 + function _time(ptr) {
1645 + var ret = Math.floor(Date.now()/1000);
1646 + if (ptr) {
1647 + HEAP32[((ptr)>>2)]=ret;
1648 + }
1649 + return ret;
1650 + }
1651 +
1652 +
1653 +
1654 +
1655 +
1656 + function _strlen(ptr) {
1657 + ptr = ptr|0;
1658 + var curr = 0;
1659 + curr = ptr;
1660 + while (HEAP8[(curr)]) {
1661 + curr = (curr + 1)|0;
1662 + }
1663 + return (curr - ptr)|0;
1664 + }
1665 +
1666 +
1667 +
1668 +
1669 + var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};
1670 +
1671 + var TTY={ttys:[],init:function () {
1672 + // https://github.com/kripken/emscripten/pull/1555
1673 + // if (ENVIRONMENT_IS_NODE) {
1674 + // // currently, FS.init does not distinguish if process.stdin is a file or TTY
1675 + // // device, it always assumes it's a TTY device. because of this, we're forcing
1676 + // // process.stdin to UTF8 encoding to at least make stdin reading compatible
1677 + // // with text files until FS.init can be refactored.
1678 + // process['stdin']['setEncoding']('utf8');
1679 + // }
1680 + },shutdown:function () {
1681 + // https://github.com/kripken/emscripten/pull/1555
1682 + // if (ENVIRONMENT_IS_NODE) {
1683 + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?
1684 + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation
1685 + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?
1686 + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
1687 + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call
1688 + // process['stdin']['pause']();
1689 + // }
1690 + },register:function (dev, ops) {
1691 + TTY.ttys[dev] = { input: [], output: [], ops: ops };
1692 + FS.registerDevice(dev, TTY.stream_ops);
1693 + },stream_ops:{open:function (stream) {
1694 + var tty = TTY.ttys[stream.node.rdev];
1695 + if (!tty) {
1696 + throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
1697 + }
1698 + stream.tty = tty;
1699 + stream.seekable = false;
1700 + },close:function (stream) {
1701 + // flush any pending line data
1702 + if (stream.tty.output.length) {
1703 + stream.tty.ops.put_char(stream.tty, 10);
1704 + }
1705 + },read:function (stream, buffer, offset, length, pos /* ignored */) {
1706 + if (!stream.tty || !stream.tty.ops.get_char) {
1707 + throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
1708 + }
1709 + var bytesRead = 0;
1710 + for (var i = 0; i < length; i++) {
1711 + var result;
1712 + try {
1713 + result = stream.tty.ops.get_char(stream.tty);
1714 + } catch (e) {
1715 + throw new FS.ErrnoError(ERRNO_CODES.EIO);
1716 + }
1717 + if (result === undefined && bytesRead === 0) {
1718 + throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
1719 + }
1720 + if (result === null || result === undefined) break;
1721 + bytesRead++;
1722 + buffer[offset+i] = result;
1723 + }
1724 + if (bytesRead) {
1725 + stream.node.timestamp = Date.now();
1726 + }
1727 + return bytesRead;
1728 + },write:function (stream, buffer, offset, length, pos) {
1729 + if (!stream.tty || !stream.tty.ops.put_char) {
1730 + throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
1731 + }
1732 + for (var i = 0; i < length; i++) {
1733 + try {
1734 + stream.tty.ops.put_char(stream.tty, buffer[offset+i]);
1735 + } catch (e) {
1736 + throw new FS.ErrnoError(ERRNO_CODES.EIO);
1737 + }
1738 + }
1739 + if (length) {
1740 + stream.node.timestamp = Date.now();
1741 + }
1742 + return i;
1743 + }},default_tty_ops:{get_char:function (tty) {
1744 + if (!tty.input.length) {
1745 + var result = null;
1746 + if (ENVIRONMENT_IS_NODE) {
1747 + result = process['stdin']['read']();
1748 + if (!result) {
1749 + if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {
1750 + return null; // EOF
1751 + }
1752 + return undefined; // no data available
1753 + }
1754 + } else if (typeof window != 'undefined' &&
1755 + typeof window.prompt == 'function') {
1756 + // Browser.
1757 + result = window.prompt('Input: '); // returns null on cancel
1758 + if (result !== null) {
1759 + result += '\n';
1760 + }
1761 + } else if (typeof readline == 'function') {
1762 + // Command line.
1763 + result = readline();
1764 + if (result !== null) {
1765 + result += '\n';
1766 + }
1767 + }
1768 + if (!result) {
1769 + return null;
1770 + }
1771 + tty.input = intArrayFromString(result, true);
1772 + }
1773 + return tty.input.shift();
1774 + },put_char:function (tty, val) {
1775 + if (val === null || val === 10) {
1776 + Module['print'](tty.output.join(''));
1777 + tty.output = [];
1778 + } else {
1779 + tty.output.push(TTY.utf8.processCChar(val));
1780 + }
1781 + }},default_tty1_ops:{put_char:function (tty, val) {
1782 + if (val === null || val === 10) {
1783 + Module['printErr'](tty.output.join(''));
1784 + tty.output = [];
1785 + } else {
1786 + tty.output.push(TTY.utf8.processCChar(val));
1787 + }
1788 + }}};
1789 +
1790 + var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {
1791 + return MEMFS.createNode(null, '/', 16384 | 0777, 0);
1792 + },createNode:function (parent, name, mode, dev) {
1793 + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
1794 + // no supported
1795 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
1796 + }
1797 + if (!MEMFS.ops_table) {
1798 + MEMFS.ops_table = {
1799 + dir: {
1800 + node: {
1801 + getattr: MEMFS.node_ops.getattr,
1802 + setattr: MEMFS.node_ops.setattr,
1803 + lookup: MEMFS.node_ops.lookup,
1804 + mknod: MEMFS.node_ops.mknod,
1805 + mknod: MEMFS.node_ops.mknod,
1806 + rename: MEMFS.node_ops.rename,
1807 + unlink: MEMFS.node_ops.unlink,
1808 + rmdir: MEMFS.node_ops.rmdir,
1809 + readdir: MEMFS.node_ops.readdir,
1810 + symlink: MEMFS.node_ops.symlink
1811 + },
1812 + stream: {
1813 + llseek: MEMFS.stream_ops.llseek
1814 + }
1815 + },
1816 + file: {
1817 + node: {
1818 + getattr: MEMFS.node_ops.getattr,
1819 + setattr: MEMFS.node_ops.setattr
1820 + },
1821 + stream: {
1822 + llseek: MEMFS.stream_ops.llseek,
1823 + read: MEMFS.stream_ops.read,
1824 + write: MEMFS.stream_ops.write,
1825 + allocate: MEMFS.stream_ops.allocate,
1826 + mmap: MEMFS.stream_ops.mmap
1827 + }
1828 + },
1829 + link: {
1830 + node: {
1831 + getattr: MEMFS.node_ops.getattr,
1832 + setattr: MEMFS.node_ops.setattr,
1833 + readlink: MEMFS.node_ops.readlink
1834 + },
1835 + stream: {}
1836 + },
1837 + chrdev: {
1838 + node: {
1839 + getattr: MEMFS.node_ops.getattr,
1840 + setattr: MEMFS.node_ops.setattr
1841 + },
1842 + stream: FS.chrdev_stream_ops
1843 + },
1844 + };
1845 + }
1846 + var node = FS.createNode(parent, name, mode, dev);
1847 + if (FS.isDir(node.mode)) {
1848 + node.node_ops = MEMFS.ops_table.dir.node;
1849 + node.stream_ops = MEMFS.ops_table.dir.stream;
1850 + node.contents = {};
1851 + } else if (FS.isFile(node.mode)) {
1852 + node.node_ops = MEMFS.ops_table.file.node;
1853 + node.stream_ops = MEMFS.ops_table.file.stream;
1854 + node.contents = [];
1855 + node.contentMode = MEMFS.CONTENT_FLEXIBLE;
1856 + } else if (FS.isLink(node.mode)) {
1857 + node.node_ops = MEMFS.ops_table.link.node;
1858 + node.stream_ops = MEMFS.ops_table.link.stream;
1859 + } else if (FS.isChrdev(node.mode)) {
1860 + node.node_ops = MEMFS.ops_table.chrdev.node;
1861 + node.stream_ops = MEMFS.ops_table.chrdev.stream;
1862 + }
1863 + node.timestamp = Date.now();
1864 + // add the new node to the parent
1865 + if (parent) {
1866 + parent.contents[name] = node;
1867 + }
1868 + return node;
1869 + },ensureFlexible:function (node) {
1870 + if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {
1871 + var contents = node.contents;
1872 + node.contents = Array.prototype.slice.call(contents);
1873 + node.contentMode = MEMFS.CONTENT_FLEXIBLE;
1874 + }
1875 + },node_ops:{getattr:function (node) {
1876 + var attr = {};
1877 + // device numbers reuse inode numbers.
1878 + attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
1879 + attr.ino = node.id;
1880 + attr.mode = node.mode;
1881 + attr.nlink = 1;
1882 + attr.uid = 0;
1883 + attr.gid = 0;
1884 + attr.rdev = node.rdev;
1885 + if (FS.isDir(node.mode)) {
1886 + attr.size = 4096;
1887 + } else if (FS.isFile(node.mode)) {
1888 + attr.size = node.contents.length;
1889 + } else if (FS.isLink(node.mode)) {
1890 + attr.size = node.link.length;
1891 + } else {
1892 + attr.size = 0;
1893 + }
1894 + attr.atime = new Date(node.timestamp);
1895 + attr.mtime = new Date(node.timestamp);
1896 + attr.ctime = new Date(node.timestamp);
1897 + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
1898 + // but this is not required by the standard.
1899 + attr.blksize = 4096;
1900 + attr.blocks = Math.ceil(attr.size / attr.blksize);
1901 + return attr;
1902 + },setattr:function (node, attr) {
1903 + if (attr.mode !== undefined) {
1904 + node.mode = attr.mode;
1905 + }
1906 + if (attr.timestamp !== undefined) {
1907 + node.timestamp = attr.timestamp;
1908 + }
1909 + if (attr.size !== undefined) {
1910 + MEMFS.ensureFlexible(node);
1911 + var contents = node.contents;
1912 + if (attr.size < contents.length) contents.length = attr.size;
1913 + else while (attr.size > contents.length) contents.push(0);
1914 + }
1915 + },lookup:function (parent, name) {
1916 + throw FS.genericErrors[ERRNO_CODES.ENOENT];
1917 + },mknod:function (parent, name, mode, dev) {
1918 + return MEMFS.createNode(parent, name, mode, dev);
1919 + },rename:function (old_node, new_dir, new_name) {
1920 + // if we're overwriting a directory at new_name, make sure it's empty.
1921 + if (FS.isDir(old_node.mode)) {
1922 + var new_node;
1923 + try {
1924 + new_node = FS.lookupNode(new_dir, new_name);
1925 + } catch (e) {
1926 + }
1927 + if (new_node) {
1928 + for (var i in new_node.contents) {
1929 + throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
1930 + }
1931 + }
1932 + }
1933 + // do the internal rewiring
1934 + delete old_node.parent.contents[old_node.name];
1935 + old_node.name = new_name;
1936 + new_dir.contents[new_name] = old_node;
1937 + old_node.parent = new_dir;
1938 + },unlink:function (parent, name) {
1939 + delete parent.contents[name];
1940 + },rmdir:function (parent, name) {
1941 + var node = FS.lookupNode(parent, name);
1942 + for (var i in node.contents) {
1943 + throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
1944 + }
1945 + delete parent.contents[name];
1946 + },readdir:function (node) {
1947 + var entries = ['.', '..']
1948 + for (var key in node.contents) {
1949 + if (!node.contents.hasOwnProperty(key)) {
1950 + continue;
1951 + }
1952 + entries.push(key);
1953 + }
1954 + return entries;
1955 + },symlink:function (parent, newname, oldpath) {
1956 + var node = MEMFS.createNode(parent, newname, 0777 | 40960, 0);
1957 + node.link = oldpath;
1958 + return node;
1959 + },readlink:function (node) {
1960 + if (!FS.isLink(node.mode)) {
1961 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
1962 + }
1963 + return node.link;
1964 + }},stream_ops:{read:function (stream, buffer, offset, length, position) {
1965 + var contents = stream.node.contents;
1966 + if (position >= contents.length)
1967 + return 0;
1968 + var size = Math.min(contents.length - position, length);
1969 + assert(size >= 0);
1970 + if (size > 8 && contents.subarray) { // non-trivial, and typed array
1971 + buffer.set(contents.subarray(position, position + size), offset);
1972 + } else
1973 + {
1974 + for (var i = 0; i < size; i++) {
1975 + buffer[offset + i] = contents[position + i];
1976 + }
1977 + }
1978 + return size;
1979 + },write:function (stream, buffer, offset, length, position, canOwn) {
1980 + var node = stream.node;
1981 + node.timestamp = Date.now();
1982 + var contents = node.contents;
1983 + if (length && contents.length === 0 && position === 0 && buffer.subarray) {
1984 + // just replace it with the new data
1985 + assert(buffer.length);
1986 + if (canOwn && offset === 0) {
1987 + node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.
1988 + node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;
1989 + } else {
1990 + node.contents = new Uint8Array(buffer.subarray(offset, offset+length));
1991 + node.contentMode = MEMFS.CONTENT_FIXED;
1992 + }
1993 + return length;
1994 + }
1995 + MEMFS.ensureFlexible(node);
1996 + var contents = node.contents;
1997 + while (contents.length < position) contents.push(0);
1998 + for (var i = 0; i < length; i++) {
1999 + contents[position + i] = buffer[offset + i];
2000 + }
2001 + return length;
2002 + },llseek:function (stream, offset, whence) {
2003 + var position = offset;
2004 + if (whence === 1) { // SEEK_CUR.
2005 + position += stream.position;
2006 + } else if (whence === 2) { // SEEK_END.
2007 + if (FS.isFile(stream.node.mode)) {
2008 + position += stream.node.contents.length;
2009 + }
2010 + }
2011 + if (position < 0) {
2012 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2013 + }
2014 + stream.ungotten = [];
2015 + stream.position = position;
2016 + return position;
2017 + },allocate:function (stream, offset, length) {
2018 + MEMFS.ensureFlexible(stream.node);
2019 + var contents = stream.node.contents;
2020 + var limit = offset + length;
2021 + while (limit > contents.length) contents.push(0);
2022 + },mmap:function (stream, buffer, offset, length, position, prot, flags) {
2023 + if (!FS.isFile(stream.node.mode)) {
2024 + throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
2025 + }
2026 + var ptr;
2027 + var allocated;
2028 + var contents = stream.node.contents;
2029 + // Only make a new copy when MAP_PRIVATE is specified.
2030 + if ( !(flags & 2) &&
2031 + (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {
2032 + // We can't emulate MAP_SHARED when the file is not backed by the buffer
2033 + // we're mapping to (e.g. the HEAP buffer).
2034 + allocated = false;
2035 + ptr = contents.byteOffset;
2036 + } else {
2037 + // Try to avoid unnecessary slices.
2038 + if (position > 0 || position + length < contents.length) {
2039 + if (contents.subarray) {
2040 + contents = contents.subarray(position, position + length);
2041 + } else {
2042 + contents = Array.prototype.slice.call(contents, position, position + length);
2043 + }
2044 + }
2045 + allocated = true;
2046 + ptr = _malloc(length);
2047 + if (!ptr) {
2048 + throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);
2049 + }
2050 + buffer.set(contents, ptr);
2051 + }
2052 + return { ptr: ptr, allocated: allocated };
2053 + }}};
2054 +
2055 + var IDBFS={dbs:{},indexedDB:function () {
2056 + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
2057 + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",mount:function (mount) {
2058 + return MEMFS.mount.apply(null, arguments);
2059 + },syncfs:function (mount, populate, callback) {
2060 + IDBFS.getLocalSet(mount, function(err, local) {
2061 + if (err) return callback(err);
2062 +
2063 + IDBFS.getRemoteSet(mount, function(err, remote) {
2064 + if (err) return callback(err);
2065 +
2066 + var src = populate ? remote : local;
2067 + var dst = populate ? local : remote;
2068 +
2069 + IDBFS.reconcile(src, dst, callback);
2070 + });
2071 + });
2072 + },reconcile:function (src, dst, callback) {
2073 + var total = 0;
2074 +
2075 + var create = {};
2076 + for (var key in src.files) {
2077 + if (!src.files.hasOwnProperty(key)) continue;
2078 + var e = src.files[key];
2079 + var e2 = dst.files[key];
2080 + if (!e2 || e.timestamp > e2.timestamp) {
2081 + create[key] = e;
2082 + total++;
2083 + }
2084 + }
2085 +
2086 + var remove = {};
2087 + for (var key in dst.files) {
2088 + if (!dst.files.hasOwnProperty(key)) continue;
2089 + var e = dst.files[key];
2090 + var e2 = src.files[key];
2091 + if (!e2) {
2092 + remove[key] = e;
2093 + total++;
2094 + }
2095 + }
2096 +
2097 + if (!total) {
2098 + // early out
2099 + return callback(null);
2100 + }
2101 +
2102 + var completed = 0;
2103 + function done(err) {
2104 + if (err) return callback(err);
2105 + if (++completed >= total) {
2106 + return callback(null);
2107 + }
2108 + };
2109 +
2110 + // create a single transaction to handle and IDB reads / writes we'll need to do
2111 + var db = src.type === 'remote' ? src.db : dst.db;
2112 + var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');
2113 + transaction.onerror = function transaction_onerror() { callback(this.error); };
2114 + var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
2115 +
2116 + for (var path in create) {
2117 + if (!create.hasOwnProperty(path)) continue;
2118 + var entry = create[path];
2119 +
2120 + if (dst.type === 'local') {
2121 + // save file to local
2122 + try {
2123 + if (FS.isDir(entry.mode)) {
2124 + FS.mkdir(path, entry.mode);
2125 + } else if (FS.isFile(entry.mode)) {
2126 + var stream = FS.open(path, 'w+', 0666);
2127 + FS.write(stream, entry.contents, 0, entry.contents.length, 0, true /* canOwn */);
2128 + FS.close(stream);
2129 + }
2130 + done(null);
2131 + } catch (e) {
2132 + return done(e);
2133 + }
2134 + } else {
2135 + // save file to IDB
2136 + var req = store.put(entry, path);
2137 + req.onsuccess = function req_onsuccess() { done(null); };
2138 + req.onerror = function req_onerror() { done(this.error); };
2139 + }
2140 + }
2141 +
2142 + for (var path in remove) {
2143 + if (!remove.hasOwnProperty(path)) continue;
2144 + var entry = remove[path];
2145 +
2146 + if (dst.type === 'local') {
2147 + // delete file from local
2148 + try {
2149 + if (FS.isDir(entry.mode)) {
2150 + // TODO recursive delete?
2151 + FS.rmdir(path);
2152 + } else if (FS.isFile(entry.mode)) {
2153 + FS.unlink(path);
2154 + }
2155 + done(null);
2156 + } catch (e) {
2157 + return done(e);
2158 + }
2159 + } else {
2160 + // delete file from IDB
2161 + var req = store.delete(path);
2162 + req.onsuccess = function req_onsuccess() { done(null); };
2163 + req.onerror = function req_onerror() { done(this.error); };
2164 + }
2165 + }
2166 + },getLocalSet:function (mount, callback) {
2167 + var files = {};
2168 +
2169 + function isRealDir(p) {
2170 + return p !== '.' && p !== '..';
2171 + };
2172 + function toAbsolute(root) {
2173 + return function(p) {
2174 + return PATH.join2(root, p);
2175 + }
2176 + };
2177 +
2178 + var check = FS.readdir(mount.mountpoint)
2179 + .filter(isRealDir)
2180 + .map(toAbsolute(mount.mountpoint));
2181 +
2182 + while (check.length) {
2183 + var path = check.pop();
2184 + var stat, node;
2185 +
2186 + try {
2187 + var lookup = FS.lookupPath(path);
2188 + node = lookup.node;
2189 + stat = FS.stat(path);
2190 + } catch (e) {
2191 + return callback(e);
2192 + }
2193 +
2194 + if (FS.isDir(stat.mode)) {
2195 + check.push.apply(check, FS.readdir(path)
2196 + .filter(isRealDir)
2197 + .map(toAbsolute(path)));
2198 +
2199 + files[path] = { mode: stat.mode, timestamp: stat.mtime };
2200 + } else if (FS.isFile(stat.mode)) {
2201 + files[path] = { contents: node.contents, mode: stat.mode, timestamp: stat.mtime };
2202 + } else {
2203 + return callback(new Error('node type not supported'));
2204 + }
2205 + }
2206 +
2207 + return callback(null, { type: 'local', files: files });
2208 + },getDB:function (name, callback) {
2209 + // look it up in the cache
2210 + var db = IDBFS.dbs[name];
2211 + if (db) {
2212 + return callback(null, db);
2213 + }
2214 + var req;
2215 + try {
2216 + req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);
2217 + } catch (e) {
2218 + return onerror(e);
2219 + }
2220 + req.onupgradeneeded = function req_onupgradeneeded() {
2221 + db = req.result;
2222 + db.createObjectStore(IDBFS.DB_STORE_NAME);
2223 + };
2224 + req.onsuccess = function req_onsuccess() {
2225 + db = req.result;
2226 + // add to the cache
2227 + IDBFS.dbs[name] = db;
2228 + callback(null, db);
2229 + };
2230 + req.onerror = function req_onerror() {
2231 + callback(this.error);
2232 + };
2233 + },getRemoteSet:function (mount, callback) {
2234 + var files = {};
2235 +
2236 + IDBFS.getDB(mount.mountpoint, function(err, db) {
2237 + if (err) return callback(err);
2238 +
2239 + var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');
2240 + transaction.onerror = function transaction_onerror() { callback(this.error); };
2241 +
2242 + var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
2243 + store.openCursor().onsuccess = function store_openCursor_onsuccess(event) {
2244 + var cursor = event.target.result;
2245 + if (!cursor) {
2246 + return callback(null, { type: 'remote', db: db, files: files });
2247 + }
2248 +
2249 + files[cursor.key] = cursor.value;
2250 + cursor.continue();
2251 + };
2252 + });
2253 + }};
2254 +
2255 + var NODEFS={isWindows:false,staticInit:function () {
2256 + NODEFS.isWindows = !!process.platform.match(/^win/);
2257 + },mount:function (mount) {
2258 + assert(ENVIRONMENT_IS_NODE);
2259 + return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);
2260 + },createNode:function (parent, name, mode, dev) {
2261 + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
2262 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2263 + }
2264 + var node = FS.createNode(parent, name, mode);
2265 + node.node_ops = NODEFS.node_ops;
2266 + node.stream_ops = NODEFS.stream_ops;
2267 + return node;
2268 + },getMode:function (path) {
2269 + var stat;
2270 + try {
2271 + stat = fs.lstatSync(path);
2272 + if (NODEFS.isWindows) {
2273 + // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so
2274 + // propagate write bits to execute bits.
2275 + stat.mode = stat.mode | ((stat.mode & 146) >> 1);
2276 + }
2277 + } catch (e) {
2278 + if (!e.code) throw e;
2279 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2280 + }
2281 + return stat.mode;
2282 + },realPath:function (node) {
2283 + var parts = [];
2284 + while (node.parent !== node) {
2285 + parts.push(node.name);
2286 + node = node.parent;
2287 + }
2288 + parts.push(node.mount.opts.root);
2289 + parts.reverse();
2290 + return PATH.join.apply(null, parts);
2291 + },flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:function (flags) {
2292 + if (flags in NODEFS.flagsToPermissionStringMap) {
2293 + return NODEFS.flagsToPermissionStringMap[flags];
2294 + } else {
2295 + return flags;
2296 + }
2297 + },node_ops:{getattr:function (node) {
2298 + var path = NODEFS.realPath(node);
2299 + var stat;
2300 + try {
2301 + stat = fs.lstatSync(path);
2302 + } catch (e) {
2303 + if (!e.code) throw e;
2304 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2305 + }
2306 + // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
2307 + // See http://support.microsoft.com/kb/140365
2308 + if (NODEFS.isWindows && !stat.blksize) {
2309 + stat.blksize = 4096;
2310 + }
2311 + if (NODEFS.isWindows && !stat.blocks) {
2312 + stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;
2313 + }
2314 + return {
2315 + dev: stat.dev,
2316 + ino: stat.ino,
2317 + mode: stat.mode,
2318 + nlink: stat.nlink,
2319 + uid: stat.uid,
2320 + gid: stat.gid,
2321 + rdev: stat.rdev,
2322 + size: stat.size,
2323 + atime: stat.atime,
2324 + mtime: stat.mtime,
2325 + ctime: stat.ctime,
2326 + blksize: stat.blksize,
2327 + blocks: stat.blocks
2328 + };
2329 + },setattr:function (node, attr) {
2330 + var path = NODEFS.realPath(node);
2331 + try {
2332 + if (attr.mode !== undefined) {
2333 + fs.chmodSync(path, attr.mode);
2334 + // update the common node structure mode as well
2335 + node.mode = attr.mode;
2336 + }
2337 + if (attr.timestamp !== undefined) {
2338 + var date = new Date(attr.timestamp);
2339 + fs.utimesSync(path, date, date);
2340 + }
2341 + if (attr.size !== undefined) {
2342 + fs.truncateSync(path, attr.size);
2343 + }
2344 + } catch (e) {
2345 + if (!e.code) throw e;
2346 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2347 + }
2348 + },lookup:function (parent, name) {
2349 + var path = PATH.join2(NODEFS.realPath(parent), name);
2350 + var mode = NODEFS.getMode(path);
2351 + return NODEFS.createNode(parent, name, mode);
2352 + },mknod:function (parent, name, mode, dev) {
2353 + var node = NODEFS.createNode(parent, name, mode, dev);
2354 + // create the backing node for this in the fs root as well
2355 + var path = NODEFS.realPath(node);
2356 + try {
2357 + if (FS.isDir(node.mode)) {
2358 + fs.mkdirSync(path, node.mode);
2359 + } else {
2360 + fs.writeFileSync(path, '', { mode: node.mode });
2361 + }
2362 + } catch (e) {
2363 + if (!e.code) throw e;
2364 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2365 + }
2366 + return node;
2367 + },rename:function (oldNode, newDir, newName) {
2368 + var oldPath = NODEFS.realPath(oldNode);
2369 + var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
2370 + try {
2371 + fs.renameSync(oldPath, newPath);
2372 + } catch (e) {
2373 + if (!e.code) throw e;
2374 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2375 + }
2376 + },unlink:function (parent, name) {
2377 + var path = PATH.join2(NODEFS.realPath(parent), name);
2378 + try {
2379 + fs.unlinkSync(path);
2380 + } catch (e) {
2381 + if (!e.code) throw e;
2382 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2383 + }
2384 + },rmdir:function (parent, name) {
2385 + var path = PATH.join2(NODEFS.realPath(parent), name);
2386 + try {
2387 + fs.rmdirSync(path);
2388 + } catch (e) {
2389 + if (!e.code) throw e;
2390 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2391 + }
2392 + },readdir:function (node) {
2393 + var path = NODEFS.realPath(node);
2394 + try {
2395 + return fs.readdirSync(path);
2396 + } catch (e) {
2397 + if (!e.code) throw e;
2398 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2399 + }
2400 + },symlink:function (parent, newName, oldPath) {
2401 + var newPath = PATH.join2(NODEFS.realPath(parent), newName);
2402 + try {
2403 + fs.symlinkSync(oldPath, newPath);
2404 + } catch (e) {
2405 + if (!e.code) throw e;
2406 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2407 + }
2408 + },readlink:function (node) {
2409 + var path = NODEFS.realPath(node);
2410 + try {
2411 + return fs.readlinkSync(path);
2412 + } catch (e) {
2413 + if (!e.code) throw e;
2414 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2415 + }
2416 + }},stream_ops:{open:function (stream) {
2417 + var path = NODEFS.realPath(stream.node);
2418 + try {
2419 + if (FS.isFile(stream.node.mode)) {
2420 + stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));
2421 + }
2422 + } catch (e) {
2423 + if (!e.code) throw e;
2424 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2425 + }
2426 + },close:function (stream) {
2427 + try {
2428 + if (FS.isFile(stream.node.mode) && stream.nfd) {
2429 + fs.closeSync(stream.nfd);
2430 + }
2431 + } catch (e) {
2432 + if (!e.code) throw e;
2433 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2434 + }
2435 + },read:function (stream, buffer, offset, length, position) {
2436 + // FIXME this is terrible.
2437 + var nbuffer = new Buffer(length);
2438 + var res;
2439 + try {
2440 + res = fs.readSync(stream.nfd, nbuffer, 0, length, position);
2441 + } catch (e) {
2442 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2443 + }
2444 + if (res > 0) {
2445 + for (var i = 0; i < res; i++) {
2446 + buffer[offset + i] = nbuffer[i];
2447 + }
2448 + }
2449 + return res;
2450 + },write:function (stream, buffer, offset, length, position) {
2451 + // FIXME this is terrible.
2452 + var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
2453 + var res;
2454 + try {
2455 + res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);
2456 + } catch (e) {
2457 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2458 + }
2459 + return res;
2460 + },llseek:function (stream, offset, whence) {
2461 + var position = offset;
2462 + if (whence === 1) { // SEEK_CUR.
2463 + position += stream.position;
2464 + } else if (whence === 2) { // SEEK_END.
2465 + if (FS.isFile(stream.node.mode)) {
2466 + try {
2467 + var stat = fs.fstatSync(stream.nfd);
2468 + position += stat.size;
2469 + } catch (e) {
2470 + throw new FS.ErrnoError(ERRNO_CODES[e.code]);
2471 + }
2472 + }
2473 + }
2474 +
2475 + if (position < 0) {
2476 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2477 + }
2478 +
2479 + stream.position = position;
2480 + return position;
2481 + }}};
2482 +
2483 + var _stdin=allocate(1, "i32*", ALLOC_STATIC);
2484 +
2485 + var _stdout=allocate(1, "i32*", ALLOC_STATIC);
2486 +
2487 + var _stderr=allocate(1, "i32*", ALLOC_STATIC);
2488 +
2489 + function _fflush(stream) {
2490 + // int fflush(FILE *stream);
2491 + // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html
2492 + // we don't currently perform any user-space buffering of data
2493 + }var FS={root:null,mounts:[],devices:[null],streams:[null],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {
2494 + if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
2495 + return ___setErrNo(e.errno);
2496 + },lookupPath:function (path, opts) {
2497 + path = PATH.resolve(FS.cwd(), path);
2498 + opts = opts || { recurse_count: 0 };
2499 +
2500 + if (opts.recurse_count > 8) { // max recursive lookup of 8
2501 + throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
2502 + }
2503 +
2504 + // split the path
2505 + var parts = PATH.normalizeArray(path.split('/').filter(function(p) {
2506 + return !!p;
2507 + }), false);
2508 +
2509 + // start at the root
2510 + var current = FS.root;
2511 + var current_path = '/';
2512 +
2513 + for (var i = 0; i < parts.length; i++) {
2514 + var islast = (i === parts.length-1);
2515 + if (islast && opts.parent) {
2516 + // stop resolving
2517 + break;
2518 + }
2519 +
2520 + current = FS.lookupNode(current, parts[i]);
2521 + current_path = PATH.join2(current_path, parts[i]);
2522 +
2523 + // jump to the mount's root node if this is a mountpoint
2524 + if (FS.isMountpoint(current)) {
2525 + current = current.mount.root;
2526 + }
2527 +
2528 + // follow symlinks
2529 + // by default, lookupPath will not follow a symlink if it is the final path component.
2530 + // setting opts.follow = true will override this behavior.
2531 + if (!islast || opts.follow) {
2532 + var count = 0;
2533 + while (FS.isLink(current.mode)) {
2534 + var link = FS.readlink(current_path);
2535 + current_path = PATH.resolve(PATH.dirname(current_path), link);
2536 +
2537 + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });
2538 + current = lookup.node;
2539 +
2540 + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
2541 + throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
2542 + }
2543 + }
2544 + }
2545 + }
2546 +
2547 + return { path: current_path, node: current };
2548 + },getPath:function (node) {
2549 + var path;
2550 + while (true) {
2551 + if (FS.isRoot(node)) {
2552 + var mount = node.mount.mountpoint;
2553 + if (!path) return mount;
2554 + return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;
2555 + }
2556 + path = path ? node.name + '/' + path : node.name;
2557 + node = node.parent;
2558 + }
2559 + },hashName:function (parentid, name) {
2560 + var hash = 0;
2561 +
2562 +
2563 + for (var i = 0; i < name.length; i++) {
2564 + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
2565 + }
2566 + return ((parentid + hash) >>> 0) % FS.nameTable.length;
2567 + },hashAddNode:function (node) {
2568 + var hash = FS.hashName(node.parent.id, node.name);
2569 + node.name_next = FS.nameTable[hash];
2570 + FS.nameTable[hash] = node;
2571 + },hashRemoveNode:function (node) {
2572 + var hash = FS.hashName(node.parent.id, node.name);
2573 + if (FS.nameTable[hash] === node) {
2574 + FS.nameTable[hash] = node.name_next;
2575 + } else {
2576 + var current = FS.nameTable[hash];
2577 + while (current) {
2578 + if (current.name_next === node) {
2579 + current.name_next = node.name_next;
2580 + break;
2581 + }
2582 + current = current.name_next;
2583 + }
2584 + }
2585 + },lookupNode:function (parent, name) {
2586 + var err = FS.mayLookup(parent);
2587 + if (err) {
2588 + throw new FS.ErrnoError(err);
2589 + }
2590 + var hash = FS.hashName(parent.id, name);
2591 + for (var node = FS.nameTable[hash]; node; node = node.name_next) {
2592 + var nodeName = node.name;
2593 + if (node.parent.id === parent.id && nodeName === name) {
2594 + return node;
2595 + }
2596 + }
2597 + // if we failed to find it in the cache, call into the VFS
2598 + return FS.lookup(parent, name);
2599 + },createNode:function (parent, name, mode, rdev) {
2600 + if (!FS.FSNode) {
2601 + FS.FSNode = function(parent, name, mode, rdev) {
2602 + this.id = FS.nextInode++;
2603 + this.name = name;
2604 + this.mode = mode;
2605 + this.node_ops = {};
2606 + this.stream_ops = {};
2607 + this.rdev = rdev;
2608 + this.parent = null;
2609 + this.mount = null;
2610 + if (!parent) {
2611 + parent = this; // root node sets parent to itself
2612 + }
2613 + this.parent = parent;
2614 + this.mount = parent.mount;
2615 + FS.hashAddNode(this);
2616 + };
2617 +
2618 + // compatibility
2619 + var readMode = 292 | 73;
2620 + var writeMode = 146;
2621 +
2622 + FS.FSNode.prototype = {};
2623 +
2624 + // NOTE we must use Object.defineProperties instead of individual calls to
2625 + // Object.defineProperty in order to make closure compiler happy
2626 + Object.defineProperties(FS.FSNode.prototype, {
2627 + read: {
2628 + get: function() { return (this.mode & readMode) === readMode; },
2629 + set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }
2630 + },
2631 + write: {
2632 + get: function() { return (this.mode & writeMode) === writeMode; },
2633 + set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }
2634 + },
2635 + isFolder: {
2636 + get: function() { return FS.isDir(this.mode); },
2637 + },
2638 + isDevice: {
2639 + get: function() { return FS.isChrdev(this.mode); },
2640 + },
2641 + });
2642 + }
2643 + return new FS.FSNode(parent, name, mode, rdev);
2644 + },destroyNode:function (node) {
2645 + FS.hashRemoveNode(node);
2646 + },isRoot:function (node) {
2647 + return node === node.parent;
2648 + },isMountpoint:function (node) {
2649 + return node.mounted;
2650 + },isFile:function (mode) {
2651 + return (mode & 61440) === 32768;
2652 + },isDir:function (mode) {
2653 + return (mode & 61440) === 16384;
2654 + },isLink:function (mode) {
2655 + return (mode & 61440) === 40960;
2656 + },isChrdev:function (mode) {
2657 + return (mode & 61440) === 8192;
2658 + },isBlkdev:function (mode) {
2659 + return (mode & 61440) === 24576;
2660 + },isFIFO:function (mode) {
2661 + return (mode & 61440) === 4096;
2662 + },isSocket:function (mode) {
2663 + return (mode & 49152) === 49152;
2664 + },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) {
2665 + var flags = FS.flagModes[str];
2666 + if (typeof flags === 'undefined') {
2667 + throw new Error('Unknown file open mode: ' + str);
2668 + }
2669 + return flags;
2670 + },flagsToPermissionString:function (flag) {
2671 + var accmode = flag & 2097155;
2672 + var perms = ['r', 'w', 'rw'][accmode];
2673 + if ((flag & 512)) {
2674 + perms += 'w';
2675 + }
2676 + return perms;
2677 + },nodePermissions:function (node, perms) {
2678 + if (FS.ignorePermissions) {
2679 + return 0;
2680 + }
2681 + // return 0 if any user, group or owner bits are set.
2682 + if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
2683 + return ERRNO_CODES.EACCES;
2684 + } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
2685 + return ERRNO_CODES.EACCES;
2686 + } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
2687 + return ERRNO_CODES.EACCES;
2688 + }
2689 + return 0;
2690 + },mayLookup:function (dir) {
2691 + return FS.nodePermissions(dir, 'x');
2692 + },mayCreate:function (dir, name) {
2693 + try {
2694 + var node = FS.lookupNode(dir, name);
2695 + return ERRNO_CODES.EEXIST;
2696 + } catch (e) {
2697 + }
2698 + return FS.nodePermissions(dir, 'wx');
2699 + },mayDelete:function (dir, name, isdir) {
2700 + var node;
2701 + try {
2702 + node = FS.lookupNode(dir, name);
2703 + } catch (e) {
2704 + return e.errno;
2705 + }
2706 + var err = FS.nodePermissions(dir, 'wx');
2707 + if (err) {
2708 + return err;
2709 + }
2710 + if (isdir) {
2711 + if (!FS.isDir(node.mode)) {
2712 + return ERRNO_CODES.ENOTDIR;
2713 + }
2714 + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
2715 + return ERRNO_CODES.EBUSY;
2716 + }
2717 + } else {
2718 + if (FS.isDir(node.mode)) {
2719 + return ERRNO_CODES.EISDIR;
2720 + }
2721 + }
2722 + return 0;
2723 + },mayOpen:function (node, flags) {
2724 + if (!node) {
2725 + return ERRNO_CODES.ENOENT;
2726 + }
2727 + if (FS.isLink(node.mode)) {
2728 + return ERRNO_CODES.ELOOP;
2729 + } else if (FS.isDir(node.mode)) {
2730 + if ((flags & 2097155) !== 0 || // opening for write
2731 + (flags & 512)) {
2732 + return ERRNO_CODES.EISDIR;
2733 + }
2734 + }
2735 + return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
2736 + },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {
2737 + fd_start = fd_start || 1;
2738 + fd_end = fd_end || FS.MAX_OPEN_FDS;
2739 + for (var fd = fd_start; fd <= fd_end; fd++) {
2740 + if (!FS.streams[fd]) {
2741 + return fd;
2742 + }
2743 + }
2744 + throw new FS.ErrnoError(ERRNO_CODES.EMFILE);
2745 + },getStream:function (fd) {
2746 + return FS.streams[fd];
2747 + },createStream:function (stream, fd_start, fd_end) {
2748 + if (!FS.FSStream) {
2749 + FS.FSStream = function(){};
2750 + FS.FSStream.prototype = {};
2751 + // compatibility
2752 + Object.defineProperties(FS.FSStream.prototype, {
2753 + object: {
2754 + get: function() { return this.node; },
2755 + set: function(val) { this.node = val; }
2756 + },
2757 + isRead: {
2758 + get: function() { return (this.flags & 2097155) !== 1; }
2759 + },
2760 + isWrite: {
2761 + get: function() { return (this.flags & 2097155) !== 0; }
2762 + },
2763 + isAppend: {
2764 + get: function() { return (this.flags & 1024); }
2765 + }
2766 + });
2767 + }
2768 + if (stream.__proto__) {
2769 + // reuse the object
2770 + stream.__proto__ = FS.FSStream.prototype;
2771 + } else {
2772 + var newStream = new FS.FSStream();
2773 + for (var p in stream) {
2774 + newStream[p] = stream[p];
2775 + }
2776 + stream = newStream;
2777 + }
2778 + var fd = FS.nextfd(fd_start, fd_end);
2779 + stream.fd = fd;
2780 + FS.streams[fd] = stream;
2781 + return stream;
2782 + },closeStream:function (fd) {
2783 + FS.streams[fd] = null;
2784 + },chrdev_stream_ops:{open:function (stream) {
2785 + var device = FS.getDevice(stream.node.rdev);
2786 + // override node's stream ops with the device's
2787 + stream.stream_ops = device.stream_ops;
2788 + // forward the open call
2789 + if (stream.stream_ops.open) {
2790 + stream.stream_ops.open(stream);
2791 + }
2792 + },llseek:function () {
2793 + throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
2794 + }},major:function (dev) {
2795 + return ((dev) >> 8);
2796 + },minor:function (dev) {
2797 + return ((dev) & 0xff);
2798 + },makedev:function (ma, mi) {
2799 + return ((ma) << 8 | (mi));
2800 + },registerDevice:function (dev, ops) {
2801 + FS.devices[dev] = { stream_ops: ops };
2802 + },getDevice:function (dev) {
2803 + return FS.devices[dev];
2804 + },syncfs:function (populate, callback) {
2805 + if (typeof(populate) === 'function') {
2806 + callback = populate;
2807 + populate = false;
2808 + }
2809 +
2810 + var completed = 0;
2811 + var total = FS.mounts.length;
2812 + function done(err) {
2813 + if (err) {
2814 + return callback(err);
2815 + }
2816 + if (++completed >= total) {
2817 + callback(null);
2818 + }
2819 + };
2820 +
2821 + // sync all mounts
2822 + for (var i = 0; i < FS.mounts.length; i++) {
2823 + var mount = FS.mounts[i];
2824 + if (!mount.type.syncfs) {
2825 + done(null);
2826 + continue;
2827 + }
2828 + mount.type.syncfs(mount, populate, done);
2829 + }
2830 + },mount:function (type, opts, mountpoint) {
2831 + var lookup;
2832 + if (mountpoint) {
2833 + lookup = FS.lookupPath(mountpoint, { follow: false });
2834 + mountpoint = lookup.path; // use the absolute path
2835 + }
2836 + var mount = {
2837 + type: type,
2838 + opts: opts,
2839 + mountpoint: mountpoint,
2840 + root: null
2841 + };
2842 + // create a root node for the fs
2843 + var root = type.mount(mount);
2844 + root.mount = mount;
2845 + mount.root = root;
2846 + // assign the mount info to the mountpoint's node
2847 + if (lookup) {
2848 + lookup.node.mount = mount;
2849 + lookup.node.mounted = true;
2850 + // compatibility update FS.root if we mount to /
2851 + if (mountpoint === '/') {
2852 + FS.root = mount.root;
2853 + }
2854 + }
2855 + // add to our cached list of mounts
2856 + FS.mounts.push(mount);
2857 + return root;
2858 + },lookup:function (parent, name) {
2859 + return parent.node_ops.lookup(parent, name);
2860 + },mknod:function (path, mode, dev) {
2861 + var lookup = FS.lookupPath(path, { parent: true });
2862 + var parent = lookup.node;
2863 + var name = PATH.basename(path);
2864 + var err = FS.mayCreate(parent, name);
2865 + if (err) {
2866 + throw new FS.ErrnoError(err);
2867 + }
2868 + if (!parent.node_ops.mknod) {
2869 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
2870 + }
2871 + return parent.node_ops.mknod(parent, name, mode, dev);
2872 + },create:function (path, mode) {
2873 + mode = mode !== undefined ? mode : 0666;
2874 + mode &= 4095;
2875 + mode |= 32768;
2876 + return FS.mknod(path, mode, 0);
2877 + },mkdir:function (path, mode) {
2878 + mode = mode !== undefined ? mode : 0777;
2879 + mode &= 511 | 512;
2880 + mode |= 16384;
2881 + return FS.mknod(path, mode, 0);
2882 + },mkdev:function (path, mode, dev) {
2883 + if (typeof(dev) === 'undefined') {
2884 + dev = mode;
2885 + mode = 0666;
2886 + }
2887 + mode |= 8192;
2888 + return FS.mknod(path, mode, dev);
2889 + },symlink:function (oldpath, newpath) {
2890 + var lookup = FS.lookupPath(newpath, { parent: true });
2891 + var parent = lookup.node;
2892 + var newname = PATH.basename(newpath);
2893 + var err = FS.mayCreate(parent, newname);
2894 + if (err) {
2895 + throw new FS.ErrnoError(err);
2896 + }
2897 + if (!parent.node_ops.symlink) {
2898 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
2899 + }
2900 + return parent.node_ops.symlink(parent, newname, oldpath);
2901 + },rename:function (old_path, new_path) {
2902 + var old_dirname = PATH.dirname(old_path);
2903 + var new_dirname = PATH.dirname(new_path);
2904 + var old_name = PATH.basename(old_path);
2905 + var new_name = PATH.basename(new_path);
2906 + // parents must exist
2907 + var lookup, old_dir, new_dir;
2908 + try {
2909 + lookup = FS.lookupPath(old_path, { parent: true });
2910 + old_dir = lookup.node;
2911 + lookup = FS.lookupPath(new_path, { parent: true });
2912 + new_dir = lookup.node;
2913 + } catch (e) {
2914 + throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
2915 + }
2916 + // need to be part of the same mount
2917 + if (old_dir.mount !== new_dir.mount) {
2918 + throw new FS.ErrnoError(ERRNO_CODES.EXDEV);
2919 + }
2920 + // source must exist
2921 + var old_node = FS.lookupNode(old_dir, old_name);
2922 + // old path should not be an ancestor of the new path
2923 + var relative = PATH.relative(old_path, new_dirname);
2924 + if (relative.charAt(0) !== '.') {
2925 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
2926 + }
2927 + // new path should not be an ancestor of the old path
2928 + relative = PATH.relative(new_path, old_dirname);
2929 + if (relative.charAt(0) !== '.') {
2930 + throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
2931 + }
2932 + // see if the new path already exists
2933 + var new_node;
2934 + try {
2935 + new_node = FS.lookupNode(new_dir, new_name);
2936 + } catch (e) {
2937 + // not fatal
2938 + }
2939 + // early out if nothing needs to change
2940 + if (old_node === new_node) {
2941 + return;
2942 + }
2943 + // we'll need to delete the old entry
2944 + var isdir = FS.isDir(old_node.mode);
2945 + var err = FS.mayDelete(old_dir, old_name, isdir);
2946 + if (err) {
2947 + throw new FS.ErrnoError(err);
2948 + }
2949 + // need delete permissions if we'll be overwriting.
2950 + // need create permissions if new doesn't already exist.
2951 + err = new_node ?
2952 + FS.mayDelete(new_dir, new_name, isdir) :
2953 + FS.mayCreate(new_dir, new_name);
2954 + if (err) {
2955 + throw new FS.ErrnoError(err);
2956 + }
2957 + if (!old_dir.node_ops.rename) {
2958 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
2959 + }
2960 + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
2961 + throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
2962 + }
2963 + // if we are going to change the parent, check write permissions
2964 + if (new_dir !== old_dir) {
2965 + err = FS.nodePermissions(old_dir, 'w');
2966 + if (err) {
2967 + throw new FS.ErrnoError(err);
2968 + }
2969 + }
2970 + // remove the node from the lookup hash
2971 + FS.hashRemoveNode(old_node);
2972 + // do the underlying fs rename
2973 + try {
2974 + old_dir.node_ops.rename(old_node, new_dir, new_name);
2975 + } catch (e) {
2976 + throw e;
2977 + } finally {
2978 + // add the node back to the hash (in case node_ops.rename
2979 + // changed its name)
2980 + FS.hashAddNode(old_node);
2981 + }
2982 + },rmdir:function (path) {
2983 + var lookup = FS.lookupPath(path, { parent: true });
2984 + var parent = lookup.node;
2985 + var name = PATH.basename(path);
2986 + var node = FS.lookupNode(parent, name);
2987 + var err = FS.mayDelete(parent, name, true);
2988 + if (err) {
2989 + throw new FS.ErrnoError(err);
2990 + }
2991 + if (!parent.node_ops.rmdir) {
2992 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
2993 + }
2994 + if (FS.isMountpoint(node)) {
2995 + throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
2996 + }
2997 + parent.node_ops.rmdir(parent, name);
2998 + FS.destroyNode(node);
2999 + },readdir:function (path) {
3000 + var lookup = FS.lookupPath(path, { follow: true });
3001 + var node = lookup.node;
3002 + if (!node.node_ops.readdir) {
3003 + throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
3004 + }
3005 + return node.node_ops.readdir(node);
3006 + },unlink:function (path) {
3007 + var lookup = FS.lookupPath(path, { parent: true });
3008 + var parent = lookup.node;
3009 + var name = PATH.basename(path);
3010 + var node = FS.lookupNode(parent, name);
3011 + var err = FS.mayDelete(parent, name, false);
3012 + if (err) {
3013 + // POSIX says unlink should set EPERM, not EISDIR
3014 + if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;
3015 + throw new FS.ErrnoError(err);
3016 + }
3017 + if (!parent.node_ops.unlink) {
3018 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3019 + }
3020 + if (FS.isMountpoint(node)) {
3021 + throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
3022 + }
3023 + parent.node_ops.unlink(parent, name);
3024 + FS.destroyNode(node);
3025 + },readlink:function (path) {
3026 + var lookup = FS.lookupPath(path, { follow: false });
3027 + var link = lookup.node;
3028 + if (!link.node_ops.readlink) {
3029 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3030 + }
3031 + return link.node_ops.readlink(link);
3032 + },stat:function (path, dontFollow) {
3033 + var lookup = FS.lookupPath(path, { follow: !dontFollow });
3034 + var node = lookup.node;
3035 + if (!node.node_ops.getattr) {
3036 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3037 + }
3038 + return node.node_ops.getattr(node);
3039 + },lstat:function (path) {
3040 + return FS.stat(path, true);
3041 + },chmod:function (path, mode, dontFollow) {
3042 + var node;
3043 + if (typeof path === 'string') {
3044 + var lookup = FS.lookupPath(path, { follow: !dontFollow });
3045 + node = lookup.node;
3046 + } else {
3047 + node = path;
3048 + }
3049 + if (!node.node_ops.setattr) {
3050 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3051 + }
3052 + node.node_ops.setattr(node, {
3053 + mode: (mode & 4095) | (node.mode & ~4095),
3054 + timestamp: Date.now()
3055 + });
3056 + },lchmod:function (path, mode) {
3057 + FS.chmod(path, mode, true);
3058 + },fchmod:function (fd, mode) {
3059 + var stream = FS.getStream(fd);
3060 + if (!stream) {
3061 + throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3062 + }
3063 + FS.chmod(stream.node, mode);
3064 + },chown:function (path, uid, gid, dontFollow) {
3065 + var node;
3066 + if (typeof path === 'string') {
3067 + var lookup = FS.lookupPath(path, { follow: !dontFollow });
3068 + node = lookup.node;
3069 + } else {
3070 + node = path;
3071 + }
3072 + if (!node.node_ops.setattr) {
3073 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3074 + }
3075 + node.node_ops.setattr(node, {
3076 + timestamp: Date.now()
3077 + // we ignore the uid / gid for now
3078 + });
3079 + },lchown:function (path, uid, gid) {
3080 + FS.chown(path, uid, gid, true);
3081 + },fchown:function (fd, uid, gid) {
3082 + var stream = FS.getStream(fd);
3083 + if (!stream) {
3084 + throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3085 + }
3086 + FS.chown(stream.node, uid, gid);
3087 + },truncate:function (path, len) {
3088 + if (len < 0) {
3089 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3090 + }
3091 + var node;
3092 + if (typeof path === 'string') {
3093 + var lookup = FS.lookupPath(path, { follow: true });
3094 + node = lookup.node;
3095 + } else {
3096 + node = path;
3097 + }
3098 + if (!node.node_ops.setattr) {
3099 + throw new FS.ErrnoError(ERRNO_CODES.EPERM);
3100 + }
3101 + if (FS.isDir(node.mode)) {
3102 + throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3103 + }
3104 + if (!FS.isFile(node.mode)) {
3105 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3106 + }
3107 + var err = FS.nodePermissions(node, 'w');
3108 + if (err) {
3109 + throw new FS.ErrnoError(err);
3110 + }
3111 + node.node_ops.setattr(node, {
3112 + size: len,
3113 + timestamp: Date.now()
3114 + });
3115 + },ftruncate:function (fd, len) {
3116 + var stream = FS.getStream(fd);
3117 + if (!stream) {
3118 + throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3119 + }
3120 + if ((stream.flags & 2097155) === 0) {
3121 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3122 + }
3123 + FS.truncate(stream.node, len);
3124 + },utime:function (path, atime, mtime) {
3125 + var lookup = FS.lookupPath(path, { follow: true });
3126 + var node = lookup.node;
3127 + node.node_ops.setattr(node, {
3128 + timestamp: Math.max(atime, mtime)
3129 + });
3130 + },open:function (path, flags, mode, fd_start, fd_end) {
3131 + flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
3132 + mode = typeof mode === 'undefined' ? 0666 : mode;
3133 + if ((flags & 64)) {
3134 + mode = (mode & 4095) | 32768;
3135 + } else {
3136 + mode = 0;
3137 + }
3138 + var node;
3139 + if (typeof path === 'object') {
3140 + node = path;
3141 + } else {
3142 + path = PATH.normalize(path);
3143 + try {
3144 + var lookup = FS.lookupPath(path, {
3145 + follow: !(flags & 131072)
3146 + });
3147 + node = lookup.node;
3148 + } catch (e) {
3149 + // ignore
3150 + }
3151 + }
3152 + // perhaps we need to create the node
3153 + if ((flags & 64)) {
3154 + if (node) {
3155 + // if O_CREAT and O_EXCL are set, error out if the node already exists
3156 + if ((flags & 128)) {
3157 + throw new FS.ErrnoError(ERRNO_CODES.EEXIST);
3158 + }
3159 + } else {
3160 + // node doesn't exist, try to create it
3161 + node = FS.mknod(path, mode, 0);
3162 + }
3163 + }
3164 + if (!node) {
3165 + throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
3166 + }
3167 + // can't truncate a device
3168 + if (FS.isChrdev(node.mode)) {
3169 + flags &= ~512;
3170 + }
3171 + // check permissions
3172 + var err = FS.mayOpen(node, flags);
3173 + if (err) {
3174 + throw new FS.ErrnoError(err);
3175 + }
3176 + // do truncation if necessary
3177 + if ((flags & 512)) {
3178 + FS.truncate(node, 0);
3179 + }
3180 + // we've already handled these, don't pass down to the underlying vfs
3181 + flags &= ~(128 | 512);
3182 +
3183 + // register the stream with the filesystem
3184 + var stream = FS.createStream({
3185 + node: node,
3186 + path: FS.getPath(node), // we want the absolute path to the node
3187 + flags: flags,
3188 + seekable: true,
3189 + position: 0,
3190 + stream_ops: node.stream_ops,
3191 + // used by the file family libc calls (fopen, fwrite, ferror, etc.)
3192 + ungotten: [],
3193 + error: false
3194 + }, fd_start, fd_end);
3195 + // call the new stream's open function
3196 + if (stream.stream_ops.open) {
3197 + stream.stream_ops.open(stream);
3198 + }
3199 + if (Module['logReadFiles'] && !(flags & 1)) {
3200 + if (!FS.readFiles) FS.readFiles = {};
3201 + if (!(path in FS.readFiles)) {
3202 + FS.readFiles[path] = 1;
3203 + Module['printErr']('read file: ' + path);
3204 + }
3205 + }
3206 + return stream;
3207 + },close:function (stream) {
3208 + try {
3209 + if (stream.stream_ops.close) {
3210 + stream.stream_ops.close(stream);
3211 + }
3212 + } catch (e) {
3213 + throw e;
3214 + } finally {
3215 + FS.closeStream(stream.fd);
3216 + }
3217 + },llseek:function (stream, offset, whence) {
3218 + if (!stream.seekable || !stream.stream_ops.llseek) {
3219 + throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3220 + }
3221 + return stream.stream_ops.llseek(stream, offset, whence);
3222 + },read:function (stream, buffer, offset, length, position) {
3223 + if (length < 0 || position < 0) {
3224 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3225 + }
3226 + if ((stream.flags & 2097155) === 1) {
3227 + throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3228 + }
3229 + if (FS.isDir(stream.node.mode)) {
3230 + throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3231 + }
3232 + if (!stream.stream_ops.read) {
3233 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3234 + }
3235 + var seeking = true;
3236 + if (typeof position === 'undefined') {
3237 + position = stream.position;
3238 + seeking = false;
3239 + } else if (!stream.seekable) {
3240 + throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3241 + }
3242 + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
3243 + if (!seeking) stream.position += bytesRead;
3244 + return bytesRead;
3245 + },write:function (stream, buffer, offset, length, position, canOwn) {
3246 + if (length < 0 || position < 0) {
3247 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3248 + }
3249 + if ((stream.flags & 2097155) === 0) {
3250 + throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3251 + }
3252 + if (FS.isDir(stream.node.mode)) {
3253 + throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
3254 + }
3255 + if (!stream.stream_ops.write) {
3256 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3257 + }
3258 + var seeking = true;
3259 + if (typeof position === 'undefined') {
3260 + position = stream.position;
3261 + seeking = false;
3262 + } else if (!stream.seekable) {
3263 + throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
3264 + }
3265 + if (stream.flags & 1024) {
3266 + // seek to the end before writing in append mode
3267 + FS.llseek(stream, 0, 2);
3268 + }
3269 + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
3270 + if (!seeking) stream.position += bytesWritten;
3271 + return bytesWritten;
3272 + },allocate:function (stream, offset, length) {
3273 + if (offset < 0 || length <= 0) {
3274 + throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
3275 + }
3276 + if ((stream.flags & 2097155) === 0) {
3277 + throw new FS.ErrnoError(ERRNO_CODES.EBADF);
3278 + }
3279 + if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {
3280 + throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
3281 + }
3282 + if (!stream.stream_ops.allocate) {
3283 + throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
3284 + }
3285 + stream.stream_ops.allocate(stream, offset, length);
3286 + },mmap:function (stream, buffer, offset, length, position, prot, flags) {
3287 + // TODO if PROT is PROT_WRITE, make sure we have write access
3288 + if ((stream.flags & 2097155) === 1) {
3289 + throw new FS.ErrnoError(ERRNO_CODES.EACCES);
3290 + }
3291 + if (!stream.stream_ops.mmap) {
3292 + throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
3293 + }
3294 + return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
3295 + },ioctl:function (stream, cmd, arg) {
3296 + if (!stream.stream_ops.ioctl) {
3297 + throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);
3298 + }
3299 + return stream.stream_ops.ioctl(stream, cmd, arg);
3300 + },readFile:function (path, opts) {
3301 + opts = opts || {};
3302 + opts.flags = opts.flags || 'r';
3303 + opts.encoding = opts.encoding || 'binary';
3304 + var ret;
3305 + var stream = FS.open(path, opts.flags);
3306 + var stat = FS.stat(path);
3307 + var length = stat.size;
3308 + var buf = new Uint8Array(length);
3309 + FS.read(stream, buf, 0, length, 0);
3310 + if (opts.encoding === 'utf8') {
3311 + ret = '';
3312 + var utf8 = new Runtime.UTF8Processor();
3313 + for (var i = 0; i < length; i++) {
3314 + ret += utf8.processCChar(buf[i]);
3315 + }
3316 + } else if (opts.encoding === 'binary') {
3317 + ret = buf;
3318 + } else {
3319 + throw new Error('Invalid encoding type "' + opts.encoding + '"');
3320 + }
3321 + FS.close(stream);
3322 + return ret;
3323 + },writeFile:function (path, data, opts) {
3324 + opts = opts || {};
3325 + opts.flags = opts.flags || 'w';
3326 + opts.encoding = opts.encoding || 'utf8';
3327 + var stream = FS.open(path, opts.flags, opts.mode);
3328 + if (opts.encoding === 'utf8') {
3329 + var utf8 = new Runtime.UTF8Processor();
3330 + var buf = new Uint8Array(utf8.processJSString(data));
3331 + FS.write(stream, buf, 0, buf.length, 0);
3332 + } else if (opts.encoding === 'binary') {
3333 + FS.write(stream, data, 0, data.length, 0);
3334 + } else {
3335 + throw new Error('Invalid encoding type "' + opts.encoding + '"');
3336 + }
3337 + FS.close(stream);
3338 + },cwd:function () {
3339 + return FS.currentPath;
3340 + },chdir:function (path) {
3341 + var lookup = FS.lookupPath(path, { follow: true });
3342 + if (!FS.isDir(lookup.node.mode)) {
3343 + throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
3344 + }
3345 + var err = FS.nodePermissions(lookup.node, 'x');
3346 + if (err) {
3347 + throw new FS.ErrnoError(err);
3348 + }
3349 + FS.currentPath = lookup.path;
3350 + },createDefaultDirectories:function () {
3351 + FS.mkdir('/tmp');
3352 + },createDefaultDevices:function () {
3353 + // create /dev
3354 + FS.mkdir('/dev');
3355 + // setup /dev/null
3356 + FS.registerDevice(FS.makedev(1, 3), {
3357 + read: function() { return 0; },
3358 + write: function() { return 0; }
3359 + });
3360 + FS.mkdev('/dev/null', FS.makedev(1, 3));
3361 + // setup /dev/tty and /dev/tty1
3362 + // stderr needs to print output using Module['printErr']
3363 + // so we register a second tty just for it.
3364 + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
3365 + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
3366 + FS.mkdev('/dev/tty', FS.makedev(5, 0));
3367 + FS.mkdev('/dev/tty1', FS.makedev(6, 0));
3368 + // we're not going to emulate the actual shm device,
3369 + // just create the tmp dirs that reside in it commonly
3370 + FS.mkdir('/dev/shm');
3371 + FS.mkdir('/dev/shm/tmp');
3372 + },createStandardStreams:function () {
3373 + // TODO deprecate the old functionality of a single
3374 + // input / output callback and that utilizes FS.createDevice
3375 + // and instead require a unique set of stream ops
3376 +
3377 + // by default, we symlink the standard streams to the
3378 + // default tty devices. however, if the standard streams
3379 + // have been overwritten we create a unique device for
3380 + // them instead.
3381 + if (Module['stdin']) {
3382 + FS.createDevice('/dev', 'stdin', Module['stdin']);
3383 + } else {
3384 + FS.symlink('/dev/tty', '/dev/stdin');
3385 + }
3386 + if (Module['stdout']) {
3387 + FS.createDevice('/dev', 'stdout', null, Module['stdout']);
3388 + } else {
3389 + FS.symlink('/dev/tty', '/dev/stdout');
3390 + }
3391 + if (Module['stderr']) {
3392 + FS.createDevice('/dev', 'stderr', null, Module['stderr']);
3393 + } else {
3394 + FS.symlink('/dev/tty1', '/dev/stderr');
3395 + }
3396 +
3397 + // open default streams for the stdin, stdout and stderr devices
3398 + var stdin = FS.open('/dev/stdin', 'r');
3399 + HEAP32[((_stdin)>>2)]=stdin.fd;
3400 + assert(stdin.fd === 1, 'invalid handle for stdin (' + stdin.fd + ')');
3401 +
3402 + var stdout = FS.open('/dev/stdout', 'w');
3403 + HEAP32[((_stdout)>>2)]=stdout.fd;
3404 + assert(stdout.fd === 2, 'invalid handle for stdout (' + stdout.fd + ')');
3405 +
3406 + var stderr = FS.open('/dev/stderr', 'w');
3407 + HEAP32[((_stderr)>>2)]=stderr.fd;
3408 + assert(stderr.fd === 3, 'invalid handle for stderr (' + stderr.fd + ')');
3409 + },ensureErrnoError:function () {
3410 + if (FS.ErrnoError) return;
3411 + FS.ErrnoError = function ErrnoError(errno) {
3412 + this.errno = errno;
3413 + for (var key in ERRNO_CODES) {
3414 + if (ERRNO_CODES[key] === errno) {
3415 + this.code = key;
3416 + break;
3417 + }
3418 + }
3419 + this.message = ERRNO_MESSAGES[errno];
3420 + if (this.stack) this.stack = demangleAll(this.stack);
3421 + };
3422 + FS.ErrnoError.prototype = new Error();
3423 + FS.ErrnoError.prototype.constructor = FS.ErrnoError;
3424 + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)
3425 + [ERRNO_CODES.ENOENT].forEach(function(code) {
3426 + FS.genericErrors[code] = new FS.ErrnoError(code);
3427 + FS.genericErrors[code].stack = '<generic error, no stack>';
3428 + });
3429 + },staticInit:function () {
3430 + FS.ensureErrnoError();
3431 +
3432 + FS.nameTable = new Array(4096);
3433 +
3434 + FS.root = FS.createNode(null, '/', 16384 | 0777, 0);
3435 + FS.mount(MEMFS, {}, '/');
3436 +
3437 + FS.createDefaultDirectories();
3438 + FS.createDefaultDevices();
3439 + },init:function (input, output, error) {
3440 + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');
3441 + FS.init.initialized = true;
3442 +
3443 + FS.ensureErrnoError();
3444 +
3445 + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
3446 + Module['stdin'] = input || Module['stdin'];
3447 + Module['stdout'] = output || Module['stdout'];
3448 + Module['stderr'] = error || Module['stderr'];
3449 +
3450 + FS.createStandardStreams();
3451 + },quit:function () {
3452 + FS.init.initialized = false;
3453 + for (var i = 0; i < FS.streams.length; i++) {
3454 + var stream = FS.streams[i];
3455 + if (!stream) {
3456 + continue;
3457 + }
3458 + FS.close(stream);
3459 + }
3460 + },getMode:function (canRead, canWrite) {
3461 + var mode = 0;
3462 + if (canRead) mode |= 292 | 73;
3463 + if (canWrite) mode |= 146;
3464 + return mode;
3465 + },joinPath:function (parts, forceRelative) {
3466 + var path = PATH.join.apply(null, parts);
3467 + if (forceRelative && path[0] == '/') path = path.substr(1);
3468 + return path;
3469 + },absolutePath:function (relative, base) {
3470 + return PATH.resolve(base, relative);
3471 + },standardizePath:function (path) {
3472 + return PATH.normalize(path);
3473 + },findObject:function (path, dontResolveLastLink) {
3474 + var ret = FS.analyzePath(path, dontResolveLastLink);
3475 + if (ret.exists) {
3476 + return ret.object;
3477 + } else {
3478 + ___setErrNo(ret.error);
3479 + return null;
3480 + }
3481 + },analyzePath:function (path, dontResolveLastLink) {
3482 + // operate from within the context of the symlink's target
3483 + try {
3484 + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
3485 + path = lookup.path;
3486 + } catch (e) {
3487 + }
3488 + var ret = {
3489 + isRoot: false, exists: false, error: 0, name: null, path: null, object: null,
3490 + parentExists: false, parentPath: null, parentObject: null
3491 + };
3492 + try {
3493 + var lookup = FS.lookupPath(path, { parent: true });
3494 + ret.parentExists = true;
3495 + ret.parentPath = lookup.path;
3496 + ret.parentObject = lookup.node;
3497 + ret.name = PATH.basename(path);
3498 + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
3499 + ret.exists = true;
3500 + ret.path = lookup.path;
3501 + ret.object = lookup.node;
3502 + ret.name = lookup.node.name;
3503 + ret.isRoot = lookup.path === '/';
3504 + } catch (e) {
3505 + ret.error = e.errno;
3506 + };
3507 + return ret;
3508 + },createFolder:function (parent, name, canRead, canWrite) {
3509 + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
3510 + var mode = FS.getMode(canRead, canWrite);
3511 + return FS.mkdir(path, mode);
3512 + },createPath:function (parent, path, canRead, canWrite) {
3513 + parent = typeof parent === 'string' ? parent : FS.getPath(parent);
3514 + var parts = path.split('/').reverse();
3515 + while (parts.length) {
3516 + var part = parts.pop();
3517 + if (!part) continue;
3518 + var current = PATH.join2(parent, part);
3519 + try {
3520 + FS.mkdir(current);
3521 + } catch (e) {
3522 + // ignore EEXIST
3523 + }
3524 + parent = current;
3525 + }
3526 + return current;
3527 + },createFile:function (parent, name, properties, canRead, canWrite) {
3528 + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
3529 + var mode = FS.getMode(canRead, canWrite);
3530 + return FS.create(path, mode);
3531 + },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {
3532 + var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
3533 + var mode = FS.getMode(canRead, canWrite);
3534 + var node = FS.create(path, mode);
3535 + if (data) {
3536 + if (typeof data === 'string') {
3537 + var arr = new Array(data.length);
3538 + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
3539 + data = arr;
3540 + }
3541 + // make sure we can write to the file
3542 + FS.chmod(node, mode | 146);
3543 + var stream = FS.open(node, 'w');
3544 + FS.write(stream, data, 0, data.length, 0, canOwn);
3545 + FS.close(stream);
3546 + FS.chmod(node, mode);
3547 + }
3548 + return node;
3549 + },createDevice:function (parent, name, input, output) {
3550 + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
3551 + var mode = FS.getMode(!!input, !!output);
3552 + if (!FS.createDevice.major) FS.createDevice.major = 64;
3553 + var dev = FS.makedev(FS.createDevice.major++, 0);
3554 + // Create a fake device that a set of stream ops to emulate
3555 + // the old behavior.
3556 + FS.registerDevice(dev, {
3557 + open: function(stream) {
3558 + stream.seekable = false;
3559 + },
3560 + close: function(stream) {
3561 + // flush any pending line data
3562 + if (output && output.buffer && output.buffer.length) {
3563 + output(10);
3564 + }
3565 + },
3566 + read: function(stream, buffer, offset, length, pos /* ignored */) {
3567 + var bytesRead = 0;
3568 + for (var i = 0; i < length; i++) {
3569 + var result;
3570 + try {
3571 + result = input();
3572 + } catch (e) {
3573 + throw new FS.ErrnoError(ERRNO_CODES.EIO);
3574 + }
3575 + if (result === undefined && bytesRead === 0) {
3576 + throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
3577 + }
3578 + if (result === null || result === undefined) break;
3579 + bytesRead++;
3580 + buffer[offset+i] = result;
3581 + }
3582 + if (bytesRead) {
3583 + stream.node.timestamp = Date.now();
3584 + }
3585 + return bytesRead;
3586 + },
3587 + write: function(stream, buffer, offset, length, pos) {
3588 + for (var i = 0; i < length; i++) {
3589 + try {
3590 + output(buffer[offset+i]);
3591 + } catch (e) {
3592 + throw new FS.ErrnoError(ERRNO_CODES.EIO);
3593 + }
3594 + }
3595 + if (length) {
3596 + stream.node.timestamp = Date.now();
3597 + }
3598 + return i;
3599 + }
3600 + });
3601 + return FS.mkdev(path, mode, dev);
3602 + },createLink:function (parent, name, target, canRead, canWrite) {
3603 + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
3604 + return FS.symlink(target, path);
3605 + },forceLoadFile:function (obj) {
3606 + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
3607 + var success = true;
3608 + if (typeof XMLHttpRequest !== 'undefined') {
3609 + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
3610 + } else if (Module['read']) {
3611 + // Command-line.
3612 + try {
3613 + // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as
3614 + // read() will try to parse UTF8.
3615 + obj.contents = intArrayFromString(Module['read'](obj.url), true);
3616 + } catch (e) {
3617 + success = false;
3618 + }
3619 + } else {
3620 + throw new Error('Cannot load without read() or XMLHttpRequest.');
3621 + }
3622 + if (!success) ___setErrNo(ERRNO_CODES.EIO);
3623 + return success;
3624 + },createLazyFile:function (parent, name, url, canRead, canWrite) {
3625 + if (typeof XMLHttpRequest !== 'undefined') {
3626 + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
3627 + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
3628 + function LazyUint8Array() {
3629 + this.lengthKnown = false;
3630 + this.chunks = []; // Loaded chunks. Index is the chunk number
3631 + }
3632 + LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
3633 + if (idx > this.length-1 || idx < 0) {
3634 + return undefined;
3635 + }
3636 + var chunkOffset = idx % this.chunkSize;
3637 + var chunkNum = Math.floor(idx / this.chunkSize);
3638 + return this.getter(chunkNum)[chunkOffset];
3639 + }
3640 + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
3641 + this.getter = getter;
3642 + }
3643 + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
3644 + // Find length
3645 + var xhr = new XMLHttpRequest();
3646 + xhr.open('HEAD', url, false);
3647 + xhr.send(null);
3648 + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
3649 + var datalength = Number(xhr.getResponseHeader("Content-length"));
3650 + var header;
3651 + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
3652 + var chunkSize = 1024*1024; // Chunk size in bytes
3653 +
3654 + if (!hasByteServing) chunkSize = datalength;
3655 +
3656 + // Function to get a range from the remote URL.
3657 + var doXHR = (function(from, to) {
3658 + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
3659 + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!");
3660 +
3661 + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
3662 + var xhr = new XMLHttpRequest();
3663 + xhr.open('GET', url, false);
3664 + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
3665 +
3666 + // Some hints to the browser that we want binary data.
3667 + if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';
3668 + if (xhr.overrideMimeType) {
3669 + xhr.overrideMimeType('text/plain; charset=x-user-defined');
3670 + }
3671 +
3672 + xhr.send(null);
3673 + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
3674 + if (xhr.response !== undefined) {
3675 + return new Uint8Array(xhr.response || []);
3676 + } else {
3677 + return intArrayFromString(xhr.responseText || '', true);
3678 + }
3679 + });
3680 + var lazyArray = this;
3681 + lazyArray.setDataGetter(function(chunkNum) {
3682 + var start = chunkNum * chunkSize;
3683 + var end = (chunkNum+1) * chunkSize - 1; // including this byte
3684 + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block
3685 + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") {
3686 + lazyArray.chunks[chunkNum] = doXHR(start, end);
3687 + }
3688 + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!");
3689 + return lazyArray.chunks[chunkNum];
3690 + });
3691 +
3692 + this._length = datalength;
3693 + this._chunkSize = chunkSize;
3694 + this.lengthKnown = true;
3695 + }
3696 +
3697 + var lazyArray = new LazyUint8Array();
3698 + Object.defineProperty(lazyArray, "length", {
3699 + get: function() {
3700 + if(!this.lengthKnown) {
3701 + this.cacheLength();
3702 + }
3703 + return this._length;
3704 + }
3705 + });
3706 + Object.defineProperty(lazyArray, "chunkSize", {
3707 + get: function() {
3708 + if(!this.lengthKnown) {
3709 + this.cacheLength();
3710 + }
3711 + return this._chunkSize;
3712 + }
3713 + });
3714 +
3715 + var properties = { isDevice: false, contents: lazyArray };
3716 + } else {
3717 + var properties = { isDevice: false, url: url };
3718 + }
3719 +
3720 + var node = FS.createFile(parent, name, properties, canRead, canWrite);
3721 + // This is a total hack, but I want to get this lazy file code out of the
3722 + // core of MEMFS. If we want to keep this lazy file concept I feel it should
3723 + // be its own thin LAZYFS proxying calls to MEMFS.
3724 + if (properties.contents) {
3725 + node.contents = properties.contents;
3726 + } else if (properties.url) {
3727 + node.contents = null;
3728 + node.url = properties.url;
3729 + }
3730 + // override each stream op with one that tries to force load the lazy file first
3731 + var stream_ops = {};
3732 + var keys = Object.keys(node.stream_ops);
3733 + keys.forEach(function(key) {
3734 + var fn = node.stream_ops[key];
3735 + stream_ops[key] = function forceLoadLazyFile() {
3736 + if (!FS.forceLoadFile(node)) {
3737 + throw new FS.ErrnoError(ERRNO_CODES.EIO);
3738 + }
3739 + return fn.apply(null, arguments);
3740 + };
3741 + });
3742 + // use a custom read function
3743 + stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
3744 + if (!FS.forceLoadFile(node)) {
3745 + throw new FS.ErrnoError(ERRNO_CODES.EIO);
3746 + }
3747 + var contents = stream.node.contents;
3748 + if (position >= contents.length)
3749 + return 0;
3750 + var size = Math.min(contents.length - position, length);
3751 + assert(size >= 0);
3752 + if (contents.slice) { // normal array
3753 + for (var i = 0; i < size; i++) {
3754 + buffer[offset + i] = contents[position + i];
3755 + }
3756 + } else {
3757 + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
3758 + buffer[offset + i] = contents.get(position + i);
3759 + }
3760 + }
3761 + return size;
3762 + };
3763 + node.stream_ops = stream_ops;
3764 + return node;
3765 + },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {
3766 + Browser.init();
3767 + // TODO we should allow people to just pass in a complete filename instead
3768 + // of parent and name being that we just join them anyways
3769 + var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
3770 + function processData(byteArray) {
3771 + function finish(byteArray) {
3772 + if (!dontCreateFile) {
3773 + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
3774 + }
3775 + if (onload) onload();
3776 + removeRunDependency('cp ' + fullname);
3777 + }
3778 + var handled = false;
3779 + Module['preloadPlugins'].forEach(function(plugin) {
3780 + if (handled) return;
3781 + if (plugin['canHandle'](fullname)) {
3782 + plugin['handle'](byteArray, fullname, finish, function() {
3783 + if (onerror) onerror();
3784 + removeRunDependency('cp ' + fullname);
3785 + });
3786 + handled = true;
3787 + }
3788 + });
3789 + if (!handled) finish(byteArray);
3790 + }
3791 + addRunDependency('cp ' + fullname);
3792 + if (typeof url == 'string') {
3793 + Browser.asyncLoad(url, function(byteArray) {
3794 + processData(byteArray);
3795 + }, onerror);
3796 + } else {
3797 + processData(url);
3798 + }
3799 + },indexedDB:function () {
3800 + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
3801 + },DB_NAME:function () {
3802 + return 'EM_FS_' + window.location.pathname;
3803 + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) {
3804 + onload = onload || function(){};
3805 + onerror = onerror || function(){};
3806 + var indexedDB = FS.indexedDB();
3807 + try {
3808 + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
3809 + } catch (e) {
3810 + return onerror(e);
3811 + }
3812 + openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
3813 + console.log('creating db');
3814 + var db = openRequest.result;
3815 + db.createObjectStore(FS.DB_STORE_NAME);
3816 + };
3817 + openRequest.onsuccess = function openRequest_onsuccess() {
3818 + var db = openRequest.result;
3819 + var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
3820 + var files = transaction.objectStore(FS.DB_STORE_NAME);
3821 + var ok = 0, fail = 0, total = paths.length;
3822 + function finish() {
3823 + if (fail == 0) onload(); else onerror();
3824 + }
3825 + paths.forEach(function(path) {
3826 + var putRequest = files.put(FS.analyzePath(path).object.contents, path);
3827 + putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };
3828 + putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };
3829 + });
3830 + transaction.onerror = onerror;
3831 + };
3832 + openRequest.onerror = onerror;
3833 + },loadFilesFromDB:function (paths, onload, onerror) {
3834 + onload = onload || function(){};
3835 + onerror = onerror || function(){};
3836 + var indexedDB = FS.indexedDB();
3837 + try {
3838 + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
3839 + } catch (e) {
3840 + return onerror(e);
3841 + }
3842 + openRequest.onupgradeneeded = onerror; // no database to load from
3843 + openRequest.onsuccess = function openRequest_onsuccess() {
3844 + var db = openRequest.result;
3845 + try {
3846 + var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
3847 + } catch(e) {
3848 + onerror(e);
3849 + return;
3850 + }
3851 + var files = transaction.objectStore(FS.DB_STORE_NAME);
3852 + var ok = 0, fail = 0, total = paths.length;
3853 + function finish() {
3854 + if (fail == 0) onload(); else onerror();
3855 + }
3856 + paths.forEach(function(path) {
3857 + var getRequest = files.get(path);
3858 + getRequest.onsuccess = function getRequest_onsuccess() {
3859 + if (FS.analyzePath(path).exists) {
3860 + FS.unlink(path);
3861 + }
3862 + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
3863 + ok++;
3864 + if (ok + fail == total) finish();
3865 + };
3866 + getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };
3867 + });
3868 + transaction.onerror = onerror;
3869 + };
3870 + openRequest.onerror = onerror;
3871 + }};var PATH={splitPath:function (filename) {
3872 + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
3873 + return splitPathRe.exec(filename).slice(1);
3874 + },normalizeArray:function (parts, allowAboveRoot) {
3875 + // if the path tries to go above the root, `up` ends up > 0
3876 + var up = 0;
3877 + for (var i = parts.length - 1; i >= 0; i--) {
3878 + var last = parts[i];
3879 + if (last === '.') {
3880 + parts.splice(i, 1);
3881 + } else if (last === '..') {
3882 + parts.splice(i, 1);
3883 + up++;
3884 + } else if (up) {
3885 + parts.splice(i, 1);
3886 + up--;
3887 + }
3888 + }
3889 + // if the path is allowed to go above the root, restore leading ..s
3890 + if (allowAboveRoot) {
3891 + for (; up--; up) {
3892 + parts.unshift('..');
3893 + }
3894 + }
3895 + return parts;
3896 + },normalize:function (path) {
3897 + var isAbsolute = path.charAt(0) === '/',
3898 + trailingSlash = path.substr(-1) === '/';
3899 + // Normalize the path
3900 + path = PATH.normalizeArray(path.split('/').filter(function(p) {
3901 + return !!p;
3902 + }), !isAbsolute).join('/');
3903 + if (!path && !isAbsolute) {
3904 + path = '.';
3905 + }
3906 + if (path && trailingSlash) {
3907 + path += '/';
3908 + }
3909 + return (isAbsolute ? '/' : '') + path;
3910 + },dirname:function (path) {
3911 + var result = PATH.splitPath(path),
3912 + root = result[0],
3913 + dir = result[1];
3914 + if (!root && !dir) {
3915 + // No dirname whatsoever
3916 + return '.';
3917 + }
3918 + if (dir) {
3919 + // It has a dirname, strip trailing slash
3920 + dir = dir.substr(0, dir.length - 1);
3921 + }
3922 + return root + dir;
3923 + },basename:function (path) {
3924 + // EMSCRIPTEN return '/'' for '/', not an empty string
3925 + if (path === '/') return '/';
3926 + var lastSlash = path.lastIndexOf('/');
3927 + if (lastSlash === -1) return path;
3928 + return path.substr(lastSlash+1);
3929 + },extname:function (path) {
3930 + return PATH.splitPath(path)[3];
3931 + },join:function () {
3932 + var paths = Array.prototype.slice.call(arguments, 0);
3933 + return PATH.normalize(paths.join('/'));
3934 + },join2:function (l, r) {
3935 + return PATH.normalize(l + '/' + r);
3936 + },resolve:function () {
3937 + var resolvedPath = '',
3938 + resolvedAbsolute = false;
3939 + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
3940 + var path = (i >= 0) ? arguments[i] : FS.cwd();
3941 + // Skip empty and invalid entries
3942 + if (typeof path !== 'string') {
3943 + throw new TypeError('Arguments to path.resolve must be strings');
3944 + } else if (!path) {
3945 + continue;
3946 + }
3947 + resolvedPath = path + '/' + resolvedPath;
3948 + resolvedAbsolute = path.charAt(0) === '/';
3949 + }
3950 + // At this point the path should be resolved to a full absolute path, but
3951 + // handle relative paths to be safe (might happen when process.cwd() fails)
3952 + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {
3953 + return !!p;
3954 + }), !resolvedAbsolute).join('/');
3955 + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
3956 + },relative:function (from, to) {
3957 + from = PATH.resolve(from).substr(1);
3958 + to = PATH.resolve(to).substr(1);
3959 + function trim(arr) {
3960 + var start = 0;
3961 + for (; start < arr.length; start++) {
3962 + if (arr[start] !== '') break;
3963 + }
3964 + var end = arr.length - 1;
3965 + for (; end >= 0; end--) {
3966 + if (arr[end] !== '') break;
3967 + }
3968 + if (start > end) return [];
3969 + return arr.slice(start, end - start + 1);
3970 + }
3971 + var fromParts = trim(from.split('/'));
3972 + var toParts = trim(to.split('/'));
3973 + var length = Math.min(fromParts.length, toParts.length);
3974 + var samePartsLength = length;
3975 + for (var i = 0; i < length; i++) {
3976 + if (fromParts[i] !== toParts[i]) {
3977 + samePartsLength = i;
3978 + break;
3979 + }
3980 + }
3981 + var outputParts = [];
3982 + for (var i = samePartsLength; i < fromParts.length; i++) {
3983 + outputParts.push('..');
3984 + }
3985 + outputParts = outputParts.concat(toParts.slice(samePartsLength));
3986 + return outputParts.join('/');
3987 + }};var Browser={mainLoop:{scheduler:null,shouldPause:false,paused:false,queue:[],pause:function () {
3988 + Browser.mainLoop.shouldPause = true;
3989 + },resume:function () {
3990 + if (Browser.mainLoop.paused) {
3991 + Browser.mainLoop.paused = false;
3992 + Browser.mainLoop.scheduler();
3993 + }
3994 + Browser.mainLoop.shouldPause = false;
3995 + },updateStatus:function () {
3996 + if (Module['setStatus']) {
3997 + var message = Module['statusMessage'] || 'Please wait...';
3998 + var remaining = Browser.mainLoop.remainingBlockers;
3999 + var expected = Browser.mainLoop.expectedBlockers;
4000 + if (remaining) {
4001 + if (remaining < expected) {
4002 + Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');
4003 + } else {
4004 + Module['setStatus'](message);
4005 + }
4006 + } else {
4007 + Module['setStatus']('');
4008 + }
4009 + }
4010 + }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {
4011 + if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers
4012 +
4013 + if (Browser.initted || ENVIRONMENT_IS_WORKER) return;
4014 + Browser.initted = true;
4015 +
4016 + try {
4017 + new Blob();
4018 + Browser.hasBlobConstructor = true;
4019 + } catch(e) {
4020 + Browser.hasBlobConstructor = false;
4021 + console.log("warning: no blob constructor, cannot create blobs with mimetypes");
4022 + }
4023 + Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null));
4024 + Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined;
4025 + if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {
4026 + console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
4027 + Module.noImageDecoding = true;
4028 + }
4029 +
4030 + // Support for plugins that can process preloaded files. You can add more of these to
4031 + // your app by creating and appending to Module.preloadPlugins.
4032 + //
4033 + // Each plugin is asked if it can handle a file based on the file's name. If it can,
4034 + // it is given the file's raw data. When it is done, it calls a callback with the file's
4035 + // (possibly modified) data. For example, a plugin might decompress a file, or it
4036 + // might create some side data structure for use later (like an Image element, etc.).
4037 +
4038 + var imagePlugin = {};
4039 + imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {
4040 + return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
4041 + };
4042 + imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {
4043 + var b = null;
4044 + if (Browser.hasBlobConstructor) {
4045 + try {
4046 + b = new Blob([byteArray], { type: Browser.getMimetype(name) });
4047 + if (b.size !== byteArray.length) { // Safari bug #118630
4048 + // Safari's Blob can only take an ArrayBuffer
4049 + b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
4050 + }
4051 + } catch(e) {
4052 + Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
4053 + }
4054 + }
4055 + if (!b) {
4056 + var bb = new Browser.BlobBuilder();
4057 + bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
4058 + b = bb.getBlob();
4059 + }
4060 + var url = Browser.URLObject.createObjectURL(b);
4061 + assert(typeof url == 'string', 'createObjectURL must return a url as a string');
4062 + var img = new Image();
4063 + img.onload = function img_onload() {
4064 + assert(img.complete, 'Image ' + name + ' could not be decoded');
4065 + var canvas = document.createElement('canvas');
4066 + canvas.width = img.width;
4067 + canvas.height = img.height;
4068 + var ctx = canvas.getContext('2d');
4069 + ctx.drawImage(img, 0, 0);
4070 + Module["preloadedImages"][name] = canvas;
4071 + Browser.URLObject.revokeObjectURL(url);
4072 + if (onload) onload(byteArray);
4073 + };
4074 + img.onerror = function img_onerror(event) {
4075 + console.log('Image ' + url + ' could not be decoded');
4076 + if (onerror) onerror();
4077 + };
4078 + img.src = url;
4079 + };
4080 + Module['preloadPlugins'].push(imagePlugin);
4081 +
4082 + var audioPlugin = {};
4083 + audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {
4084 + return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
4085 + };
4086 + audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {
4087 + var done = false;
4088 + function finish(audio) {
4089 + if (done) return;
4090 + done = true;
4091 + Module["preloadedAudios"][name] = audio;
4092 + if (onload) onload(byteArray);
4093 + }
4094 + function fail() {
4095 + if (done) return;
4096 + done = true;
4097 + Module["preloadedAudios"][name] = new Audio(); // empty shim
4098 + if (onerror) onerror();
4099 + }
4100 + if (Browser.hasBlobConstructor) {
4101 + try {
4102 + var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
4103 + } catch(e) {
4104 + return fail();
4105 + }
4106 + var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
4107 + assert(typeof url == 'string', 'createObjectURL must return a url as a string');
4108 + var audio = new Audio();
4109 + audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926
4110 + audio.onerror = function audio_onerror(event) {
4111 + if (done) return;
4112 + console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
4113 + function encode64(data) {
4114 + var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
4115 + var PAD = '=';
4116 + var ret = '';
4117 + var leftchar = 0;
4118 + var leftbits = 0;
4119 + for (var i = 0; i < data.length; i++) {
4120 + leftchar = (leftchar << 8) | data[i];
4121 + leftbits += 8;
4122 + while (leftbits >= 6) {
4123 + var curr = (leftchar >> (leftbits-6)) & 0x3f;
4124 + leftbits -= 6;
4125 + ret += BASE[curr];
4126 + }
4127 + }
4128 + if (leftbits == 2) {
4129 + ret += BASE[(leftchar&3) << 4];
4130 + ret += PAD + PAD;
4131 + } else if (leftbits == 4) {
4132 + ret += BASE[(leftchar&0xf) << 2];
4133 + ret += PAD;
4134 + }
4135 + return ret;
4136 + }
4137 + audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
4138 + finish(audio); // we don't wait for confirmation this worked - but it's worth trying
4139 + };
4140 + audio.src = url;
4141 + // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
4142 + Browser.safeSetTimeout(function() {
4143 + finish(audio); // try to use it even though it is not necessarily ready to play
4144 + }, 10000);
4145 + } else {
4146 + return fail();
4147 + }
4148 + };
4149 + Module['preloadPlugins'].push(audioPlugin);
4150 +
4151 + // Canvas event setup
4152 +
4153 + var canvas = Module['canvas'];
4154 + canvas.requestPointerLock = canvas['requestPointerLock'] ||
4155 + canvas['mozRequestPointerLock'] ||
4156 + canvas['webkitRequestPointerLock'];
4157 + canvas.exitPointerLock = document['exitPointerLock'] ||
4158 + document['mozExitPointerLock'] ||
4159 + document['webkitExitPointerLock'] ||
4160 + function(){}; // no-op if function does not exist
4161 + canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
4162 +
4163 + function pointerLockChange() {
4164 + Browser.pointerLock = document['pointerLockElement'] === canvas ||
4165 + document['mozPointerLockElement'] === canvas ||
4166 + document['webkitPointerLockElement'] === canvas;
4167 + }
4168 +
4169 + document.addEventListener('pointerlockchange', pointerLockChange, false);
4170 + document.addEventListener('mozpointerlockchange', pointerLockChange, false);
4171 + document.addEventListener('webkitpointerlockchange', pointerLockChange, false);
4172 +
4173 + if (Module['elementPointerLock']) {
4174 + canvas.addEventListener("click", function(ev) {
4175 + if (!Browser.pointerLock && canvas.requestPointerLock) {
4176 + canvas.requestPointerLock();
4177 + ev.preventDefault();
4178 + }
4179 + }, false);
4180 + }
4181 + },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {
4182 + var ctx;
4183 + try {
4184 + if (useWebGL) {
4185 + var contextAttributes = {
4186 + antialias: false,
4187 + alpha: false
4188 + };
4189 +
4190 + if (webGLContextAttributes) {
4191 + for (var attribute in webGLContextAttributes) {
4192 + contextAttributes[attribute] = webGLContextAttributes[attribute];
4193 + }
4194 + }
4195 +
4196 +
4197 + var errorInfo = '?';
4198 + function onContextCreationError(event) {
4199 + errorInfo = event.statusMessage || errorInfo;
4200 + }
4201 + canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);
4202 + try {
4203 + ['experimental-webgl', 'webgl'].some(function(webglId) {
4204 + return ctx = canvas.getContext(webglId, contextAttributes);
4205 + });
4206 + } finally {
4207 + canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);
4208 + }
4209 + } else {
4210 + ctx = canvas.getContext('2d');
4211 + }
4212 + if (!ctx) throw ':(';
4213 + } catch (e) {
4214 + Module.print('Could not create canvas: ' + [errorInfo, e]);
4215 + return null;
4216 + }
4217 + if (useWebGL) {
4218 + // Set the background of the WebGL canvas to black
4219 + canvas.style.backgroundColor = "black";
4220 +
4221 + // Warn on context loss
4222 + canvas.addEventListener('webglcontextlost', function(event) {
4223 + alert('WebGL context lost. You will need to reload the page.');
4224 + }, false);
4225 + }
4226 + if (setInModule) {
4227 + GLctx = Module.ctx = ctx;
4228 + Module.useWebGL = useWebGL;
4229 + Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });
4230 + Browser.init();
4231 + }
4232 + return ctx;
4233 + },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {
4234 + Browser.lockPointer = lockPointer;
4235 + Browser.resizeCanvas = resizeCanvas;
4236 + if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;
4237 + if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;
4238 +
4239 + var canvas = Module['canvas'];
4240 + function fullScreenChange() {
4241 + Browser.isFullScreen = false;
4242 + if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
4243 + document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
4244 + document['fullScreenElement'] || document['fullscreenElement']) === canvas) {
4245 + canvas.cancelFullScreen = document['cancelFullScreen'] ||
4246 + document['mozCancelFullScreen'] ||
4247 + document['webkitCancelFullScreen'];
4248 + canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
4249 + if (Browser.lockPointer) canvas.requestPointerLock();
4250 + Browser.isFullScreen = true;
4251 + if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
4252 + } else if (Browser.resizeCanvas){
4253 + Browser.setWindowedCanvasSize();
4254 + }
4255 + if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);
4256 + }
4257 +
4258 + if (!Browser.fullScreenHandlersInstalled) {
4259 + Browser.fullScreenHandlersInstalled = true;
4260 + document.addEventListener('fullscreenchange', fullScreenChange, false);
4261 + document.addEventListener('mozfullscreenchange', fullScreenChange, false);
4262 + document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
4263 + }
4264 +
4265 + canvas.requestFullScreen = canvas['requestFullScreen'] ||
4266 + canvas['mozRequestFullScreen'] ||
4267 + (canvas['webkitRequestFullScreen'] ? function() { canvas['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
4268 + canvas.requestFullScreen();
4269 + },requestAnimationFrame:function requestAnimationFrame(func) {
4270 + if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)
4271 + setTimeout(func, 1000/60);
4272 + } else {
4273 + if (!window.requestAnimationFrame) {
4274 + window.requestAnimationFrame = window['requestAnimationFrame'] ||
4275 + window['mozRequestAnimationFrame'] ||
4276 + window['webkitRequestAnimationFrame'] ||
4277 + window['msRequestAnimationFrame'] ||
4278 + window['oRequestAnimationFrame'] ||
4279 + window['setTimeout'];
4280 + }
4281 + window.requestAnimationFrame(func);
4282 + }
4283 + },safeCallback:function (func) {
4284 + return function() {
4285 + if (!ABORT) return func.apply(null, arguments);
4286 + };
4287 + },safeRequestAnimationFrame:function (func) {
4288 + return Browser.requestAnimationFrame(function() {
4289 + if (!ABORT) func();
4290 + });
4291 + },safeSetTimeout:function (func, timeout) {
4292 + return setTimeout(function() {
4293 + if (!ABORT) func();
4294 + }, timeout);
4295 + },safeSetInterval:function (func, timeout) {
4296 + return setInterval(function() {
4297 + if (!ABORT) func();
4298 + }, timeout);
4299 + },getMimetype:function (name) {
4300 + return {
4301 + 'jpg': 'image/jpeg',
4302 + 'jpeg': 'image/jpeg',
4303 + 'png': 'image/png',
4304 + 'bmp': 'image/bmp',
4305 + 'ogg': 'audio/ogg',
4306 + 'wav': 'audio/wav',
4307 + 'mp3': 'audio/mpeg'
4308 + }[name.substr(name.lastIndexOf('.')+1)];
4309 + },getUserMedia:function (func) {
4310 + if(!window.getUserMedia) {
4311 + window.getUserMedia = navigator['getUserMedia'] ||
4312 + navigator['mozGetUserMedia'];
4313 + }
4314 + window.getUserMedia(func);
4315 + },getMovementX:function (event) {
4316 + return event['movementX'] ||
4317 + event['mozMovementX'] ||
4318 + event['webkitMovementX'] ||
4319 + 0;
4320 + },getMovementY:function (event) {
4321 + return event['movementY'] ||
4322 + event['mozMovementY'] ||
4323 + event['webkitMovementY'] ||
4324 + 0;
4325 + },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup
4326 + if (Browser.pointerLock) {
4327 + // When the pointer is locked, calculate the coordinates
4328 + // based on the movement of the mouse.
4329 + // Workaround for Firefox bug 764498
4330 + if (event.type != 'mousemove' &&
4331 + ('mozMovementX' in event)) {
4332 + Browser.mouseMovementX = Browser.mouseMovementY = 0;
4333 + } else {
4334 + Browser.mouseMovementX = Browser.getMovementX(event);
4335 + Browser.mouseMovementY = Browser.getMovementY(event);
4336 + }
4337 +
4338 + // check if SDL is available
4339 + if (typeof SDL != "undefined") {
4340 + Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
4341 + Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
4342 + } else {
4343 + // just add the mouse delta to the current absolut mouse position
4344 + // FIXME: ideally this should be clamped against the canvas size and zero
4345 + Browser.mouseX += Browser.mouseMovementX;
4346 + Browser.mouseY += Browser.mouseMovementY;
4347 + }
4348 + } else {
4349 + // Otherwise, calculate the movement based on the changes
4350 + // in the coordinates.
4351 + var rect = Module["canvas"].getBoundingClientRect();
4352 + var x, y;
4353 +
4354 + // Neither .scrollX or .pageXOffset are defined in a spec, but
4355 + // we prefer .scrollX because it is currently in a spec draft.
4356 + // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)
4357 + var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);
4358 + var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);
4359 + // If this assert lands, it's likely because the browser doesn't support scrollX or pageXOffset
4360 + // and we have no viable fallback.
4361 + assert((typeof scrollX !== 'undefined') && (typeof scrollY !== 'undefined'), 'Unable to retrieve scroll position, mouse positions likely broken.');
4362 + if (event.type == 'touchstart' ||
4363 + event.type == 'touchend' ||
4364 + event.type == 'touchmove') {
4365 + var t = event.touches.item(0);
4366 + if (t) {
4367 + x = t.pageX - (scrollX + rect.left);
4368 + y = t.pageY - (scrollY + rect.top);
4369 + } else {
4370 + return;
4371 + }
4372 + } else {
4373 + x = event.pageX - (scrollX + rect.left);
4374 + y = event.pageY - (scrollY + rect.top);
4375 + }
4376 +
4377 + // the canvas might be CSS-scaled compared to its backbuffer;
4378 + // SDL-using content will want mouse coordinates in terms
4379 + // of backbuffer units.
4380 + var cw = Module["canvas"].width;
4381 + var ch = Module["canvas"].height;
4382 + x = x * (cw / rect.width);
4383 + y = y * (ch / rect.height);
4384 +
4385 + Browser.mouseMovementX = x - Browser.mouseX;
4386 + Browser.mouseMovementY = y - Browser.mouseY;
4387 + Browser.mouseX = x;
4388 + Browser.mouseY = y;
4389 + }
4390 + },xhrLoad:function (url, onload, onerror) {
4391 + var xhr = new XMLHttpRequest();
4392 + xhr.open('GET', url, true);
4393 + xhr.responseType = 'arraybuffer';
4394 + xhr.onload = function xhr_onload() {
4395 + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
4396 + onload(xhr.response);
4397 + } else {
4398 + onerror();
4399 + }
4400 + };
4401 + xhr.onerror = onerror;
4402 + xhr.send(null);
4403 + },asyncLoad:function (url, onload, onerror, noRunDep) {
4404 + Browser.xhrLoad(url, function(arrayBuffer) {
4405 + assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
4406 + onload(new Uint8Array(arrayBuffer));
4407 + if (!noRunDep) removeRunDependency('al ' + url);
4408 + }, function(event) {
4409 + if (onerror) {
4410 + onerror();
4411 + } else {
4412 + throw 'Loading data file "' + url + '" failed.';
4413 + }
4414 + });
4415 + if (!noRunDep) addRunDependency('al ' + url);
4416 + },resizeListeners:[],updateResizeListeners:function () {
4417 + var canvas = Module['canvas'];
4418 + Browser.resizeListeners.forEach(function(listener) {
4419 + listener(canvas.width, canvas.height);
4420 + });
4421 + },setCanvasSize:function (width, height, noUpdates) {
4422 + var canvas = Module['canvas'];
4423 + canvas.width = width;
4424 + canvas.height = height;
4425 + if (!noUpdates) Browser.updateResizeListeners();
4426 + },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
4427 + var canvas = Module['canvas'];
4428 + this.windowedWidth = canvas.width;
4429 + this.windowedHeight = canvas.height;
4430 + canvas.width = screen.width;
4431 + canvas.height = screen.height;
4432 + // check if SDL is available
4433 + if (typeof SDL != "undefined") {
4434 + var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
4435 + flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
4436 + HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
4437 + }
4438 + Browser.updateResizeListeners();
4439 + },setWindowedCanvasSize:function () {
4440 + var canvas = Module['canvas'];
4441 + canvas.width = this.windowedWidth;
4442 + canvas.height = this.windowedHeight;
4443 + // check if SDL is available
4444 + if (typeof SDL != "undefined") {
4445 + var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
4446 + flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
4447 + HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
4448 + }
4449 + Browser.updateResizeListeners();
4450 + }};
4451 +___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;
4452 +Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
4453 + Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
4454 + Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };
4455 + Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };
4456 + Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };
4457 + Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }
4458 +FS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;
4459 +__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();
4460 +if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); }
4461 +STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
4462 +
4463 +staticSealed = true; // seal the static portion of memory
4464 +
4465 +STACK_MAX = STACK_BASE + 5242880;
4466 +
4467 +DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);
4468 +
4469 +assert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack");
4470 +
4471 +
4472 +
4473 +var FUNCTION_TABLE = [0, 0];
4474 +
4475 +// EMSCRIPTEN_START_FUNCS
4476 +
4477 +function _bitmap_decompress_15($output,$output_width,$output_height,$input_width,$input_height,$input,$size){
4478 + var label=0;
4479 + var sp=STACKTOP; (assert((STACKTOP|0) < (STACK_MAX|0))|0);
4480 + label = 1;
4481 + while(1)switch(label){
4482 + case 1:
4483 + var $1;
4484 + var $2;
4485 + var $3;
4486 + var $4;
4487 + var $5;
4488 + var $6;
4489 + var $7;
4490 + var $temp;
4491 + var $rv;
4492 + var $y;
4493 + var $x;
4494 + var $a;
4495 + var $r;
4496 + var $g;
4497 + var $b;
4498 + $1=$output;
4499 + $2=$output_width;
4500 + $3=$output_height;
4501 + $4=$input_width;
4502 + $5=$input_height;
4503 + $6=$input;
4504 + $7=$size;
4505 + var $8=$4;
4506 + var $9=$5;
4507 + var $10=(Math_imul($8,$9)|0);
4508 + var $11=($10<<1);
4509 + var $12=_malloc($11);
4510 + $temp=$12;
4511 + var $13=$temp;
4512 + var $14=$4;
4513 + var $15=$5;
4514 + var $16=$6;
4515 + var $17=$7;
4516 + var $18=_bitmap_decompress2($13,$14,$15,$16,$17);
4517 + $rv=$18;
4518 + $y=0;
4519 + label=2;break;
4520 + case 2:
4521 + var $20=$y;
4522 + var $21=$3;
4523 + var $22=($20|0)<($21|0);
4524 + if($22){label=3;break;}else{label=9;break;}
4525 + case 3:
4526 + $x=0;
4527 + label=4;break;
4528 + case 4:
4529 + var $25=$x;
4530 + var $26=$2;
4531 + var $27=($25|0)<($26|0);
4532 + if($27){label=5;break;}else{label=7;break;}
4533 + case 5:
4534 + var $29=$y;
4535 + var $30=$4;
4536 + var $31=(Math_imul($29,$30)|0);
4537 + var $32=$x;
4538 + var $33=((($31)+($32))|0);
4539 + var $34=$temp;
4540 + var $35=$34;
4541 + var $36=(($35+($33<<1))|0);
4542 + var $37=HEAP16[(($36)>>1)];
4543 + $a=$37;
4544 + var $38=$a;
4545 + var $39=($38&65535);
4546 + var $40=$39&31744;
4547 + var $41=$40>>10;
4548 + var $42=(($41)&255);
4549 + $r=$42;
4550 + var $43=$a;
4551 + var $44=($43&65535);
4552 + var $45=$44&992;
4553 + var $46=$45>>5;
4554 + var $47=(($46)&255);
4555 + $g=$47;
4556 + var $48=$a;
4557 + var $49=($48&65535);
4558 + var $50=$49&31;
4559 + var $51=(($50)&255);
4560 + $b=$51;
4561 + var $52=$r;
4562 + var $53=($52&255);
4563 + var $54=((($53)*(255))&-1);
4564 + var $55=(((($54|0))/(31))&-1);
4565 + var $56=(($55)&255);
4566 + $r=$56;
4567 + var $57=$g;
4568 + var $58=($57&255);
4569 + var $59=((($58)*(255))&-1);
4570 + var $60=(((($59|0))/(31))&-1);
4571 + var $61=(($60)&255);
4572 + $g=$61;
4573 + var $62=$b;
4574 + var $63=($62&255);
4575 + var $64=((($63)*(255))&-1);
4576 + var $65=(((($64|0))/(31))&-1);
4577 + var $66=(($65)&255);
4578 + $b=$66;
4579 + var $67=$b;
4580 + var $68=($67&255);
4581 + var $69=$68<<16;
4582 + var $70=-16777216|$69;
4583 + var $71=$g;
4584 + var $72=($71&255);
4585 + var $73=$72<<8;
4586 + var $74=$70|$73;
4587 + var $75=$r;
4588 + var $76=($75&255);
4589 + var $77=$74|$76;
4590 + var $78=$y;
4591 + var $79=$2;
4592 + var $80=(Math_imul($78,$79)|0);
4593 + var $81=$x;
4594 + var $82=((($80)+($81))|0);
4595 + var $83=$1;
4596 + var $84=$83;
4597 + var $85=(($84+($82<<2))|0);
4598 + HEAP32[(($85)>>2)]=$77;
4599 + label=6;break;
4600 + case 6:
4601 + var $87=$x;
4602 + var $88=((($87)+(1))|0);
4603 + $x=$88;
4604 + label=4;break;
4605 + case 7:
4606 + label=8;break;
4607 + case 8:
4608 + var $91=$y;
4609 + var $92=((($91)+(1))|0);
4610 + $y=$92;
4611 + label=2;break;
4612 + case 9:
4613 + var $94=$temp;
4614 + _free($94);
4615 + var $95=$rv;
4616 + STACKTOP=sp;return $95;
4617 + default: assert(0, "bad label: " + label);
4618 + }
4619 +
4620 +}
4621 +Module["_bitmap_decompress_15"] = _bitmap_decompress_15;
4622 +
4623 +function _bitmap_decompress2($output,$width,$height,$input,$size){
4624 + var label=0;
4625 + var sp=STACKTOP; (assert((STACKTOP|0) < (STACK_MAX|0))|0);
4626 + label = 1;
4627 + while(1)switch(label){
4628 + case 1:
4629 + var $1;
4630 + var $2;
4631 + var $3;
4632 + var $4;
4633 + var $5;
4634 + var $6;
4635 + var $end;
4636 + var $prevline;
4637 + var $line;
4638 + var $opcode;
4639 + var $count;
4640 + var $offset;
4641 + var $isfillormix;
4642 + var $x;
4643 + var $lastopcode;
4644 + var $insertmix;
4645 + var $bicolour;
4646 + var $code;
4647 + var $colour1;
4648 + var $colour2;
4649 + var $mixmask;
4650 + var $mask;
4651 + var $mix;
4652 + var $fom_mask;
4653 + $2=$output;
4654 + $3=$width;
4655 + $4=$height;
4656 + $5=$input;
4657 + $6=$size;
4658 + var $7=$5;
4659 + var $8=$6;
4660 + var $9=(($7+$8)|0);
4661 + $end=$9;
4662 + $prevline=0;
4663 + $line=0;
4664 + var $10=$3;
4665 + $x=$10;
4666 + $lastopcode=-1;
4667 + $insertmix=0;
4668 + $bicolour=0;
4669 + $colour1=0;
4670 + $colour2=0;
4671 + $mask=0;
4672 + $mix=-1;
4673 + $fom_mask=0;
4674 + label=2;break;
4675 + case 2:
4676 + var $12=$5;
4677 + var $13=$end;
4678 + var $14=($12>>>0)<($13>>>0);
4679 + if($14){label=3;break;}else{label=346;break;}
4680 + case 3:
4681 + $fom_mask=0;
4682 + var $16=$5;
4683 + var $17=(($16+1)|0);
4684 + $5=$17;
4685 + var $18=HEAP8[($16)];
4686 + $code=$18;
4687 + var $19=$code;
4688 + var $20=($19&255);
4689 + var $21=$20>>4;
4690 + $opcode=$21;
4691 + var $22=$opcode;
4692 + if(($22|0)==12|($22|0)==13|($22|0)==14){ label=4;break;}else if(($22|0)==15){ label=5;break;}else{label=9;break;}
4693 + case 4:
4694 + var $24=$opcode;
4695 + var $25=((($24)-(6))|0);
4696 + $opcode=$25;
4697 + var $26=$code;
4698 + var $27=($26&255);
4699 + var $28=$27&15;
4700 + $count=$28;
4701 + $offset=16;
4702 + label=10;break;
4703 + case 5:
4704 + var $30=$code;
4705 + var $31=($30&255);
4706 + var $32=$31&15;
4707 + $opcode=$32;
4708 + var $33=$opcode;
4709 + var $34=($33|0)<9;
4710 + if($34){label=6;break;}else{label=7;break;}
4711 + case 6:
4712 + var $36=$5;
4713 + var $37=(($36+1)|0);
4714 + $5=$37;
4715 + var $38=HEAP8[($36)];
4716 + var $39=($38&255);
4717 + $count=$39;
4718 + var $40=$5;
4719 + var $41=(($40+1)|0);
4720 + $5=$41;
4721 + var $42=HEAP8[($40)];
4722 + var $43=($42&255);
4723 + var $44=$43<<8;
4724 + var $45=$count;
4725 + var $46=$45|$44;
4726 + $count=$46;
4727 + label=8;break;
4728 + case 7:
4729 + var $48=$opcode;
4730 + var $49=($48|0)<11;
4731 + var $50=($49?8:1);
4732 + $count=$50;
4733 + label=8;break;
4734 + case 8:
4735 + $offset=0;
4736 + label=10;break;
4737 + case 9:
4738 + var $53=$opcode;
4739 + var $54=$53>>1;
4740 + $opcode=$54;
4741 + var $55=$code;
4742 + var $56=($55&255);
4743 + var $57=$56&31;
4744 + $count=$57;
4745 + $offset=32;
4746 + label=10;break;
4747 + case 10:
4748 + var $59=$offset;
4749 + var $60=($59|0)!=0;
4750 + if($60){label=11;break;}else{label=22;break;}
4751 + case 11:
4752 + var $62=$opcode;
4753 + var $63=($62|0)==2;
4754 + if($63){var $68=1;label=13;break;}else{label=12;break;}
4755 + case 12:
4756 + var $65=$opcode;
4757 + var $66=($65|0)==7;
4758 + var $68=$66;label=13;break;
4759 + case 13:
4760 + var $68;
4761 + var $69=($68&1);
4762 + $isfillormix=$69;
4763 + var $70=$count;
4764 + var $71=($70|0)==0;
4765 + if($71){label=14;break;}else{label=18;break;}
4766 + case 14:
4767 + var $73=$isfillormix;
4768 + var $74=($73|0)!=0;
4769 + if($74){label=15;break;}else{label=16;break;}
4770 + case 15:
4771 + var $76=$5;
4772 + var $77=(($76+1)|0);
4773 + $5=$77;
4774 + var $78=HEAP8[($76)];
4775 + var $79=($78&255);
4776 + var $80=((($79)+(1))|0);
4777 + $count=$80;
4778 + label=17;break;
4779 + case 16:
4780 + var $82=$5;
4781 + var $83=(($82+1)|0);
4782 + $5=$83;
4783 + var $84=HEAP8[($82)];
4784 + var $85=($84&255);
4785 + var $86=$offset;
4786 + var $87=((($85)+($86))|0);
4787 + $count=$87;
4788 + label=17;break;
4789 + case 17:
4790 + label=21;break;
4791 + case 18:
4792 + var $90=$isfillormix;
4793 + var $91=($90|0)!=0;
4794 + if($91){label=19;break;}else{label=20;break;}
4795 + case 19:
4796 + var $93=$count;
4797 + var $94=$93<<3;
4798 + $count=$94;
4799 + label=20;break;
4800 + case 20:
4801 + label=21;break;
4802 + case 21:
4803 + label=22;break;
4804 + case 22:
4805 + var $98=$opcode;
4806 + switch(($98|0)){case 0:{ label=23;break;}case 8:{ label=28;break;}case 3:{ label=29;break;}case 6:case 7:{ label=30;break;}case 9:{ label=31;break;}case 10:{ label=32;break;}default:{label=33;break;}}break;
4807 + case 23:
4808 + var $100=$lastopcode;
4809 + var $101=$opcode;
4810 + var $102=($100|0)==($101|0);
4811 + if($102){label=24;break;}else{label=27;break;}
4812 + case 24:
4813 + var $104=$x;
4814 + var $105=$3;
4815 + var $106=($104|0)==($105|0);
4816 + if($106){label=25;break;}else{label=26;break;}
4817 + case 25:
4818 + var $108=$prevline;
4819 + var $109=($108|0)==0;
4820 + if($109){label=27;break;}else{label=26;break;}
4821 + case 26:
4822 + $insertmix=1;
4823 + label=27;break;
4824 + case 27:
4825 + label=33;break;
4826 + case 28:
4827 + var $113=$5;
4828 + var $114=(($113+1)|0);
4829 + $5=$114;
4830 + var $115=HEAP8[($113)];
4831 + var $116=($115&255);
4832 + $colour1=$116;
4833 + var $117=$5;
4834 + var $118=(($117+1)|0);
4835 + $5=$118;
4836 + var $119=HEAP8[($117)];
4837 + var $120=($119&255);
4838 + var $121=$120<<8;
4839 + var $122=$colour1;
4840 + var $123=($122&65535);
4841 + var $124=$123|$121;
4842 + var $125=(($124)&65535);
4843 + $colour1=$125;
4844 + label=29;break;
4845 + case 29:
4846 + var $127=$5;
4847 + var $128=(($127+1)|0);
4848 + $5=$128;
4849 + var $129=HEAP8[($127)];
4850 + var $130=($129&255);
4851 + $colour2=$130;
4852 + var $131=$5;
4853 + var $132=(($131+1)|0);
4854 + $5=$132;
4855 + var $133=HEAP8[($131)];
4856 + var $134=($133&255);
4857 + var $135=$134<<8;
4858 + var $136=$colour2;
4859 + var $137=($136&65535);
4860 + var $138=$137|$135;
4861 + var $139=(($138)&65535);
4862 + $colour2=$139;
4863 + label=33;break;
4864 + case 30:
4865 + var $141=$5;
4866 + var $142=(($141+1)|0);
4867 + $5=$142;
4868 + var $143=HEAP8[($141)];
4869 + var $144=($143&255);
4870 + $mix=$144;
4871 + var $145=$5;
4872 + var $146=(($145+1)|0);
4873 + $5=$146;
4874 + var $147=HEAP8[($145)];
4875 + var $148=($147&255);
4876 + var $149=$148<<8;
4877 + var $150=$mix;
4878 + var $151=($150&65535);
4879 + var $152=$151|$149;
4880 + var $153=(($152)&65535);
4881 + $mix=$153;
4882 + var $154=$opcode;
4883 + var $155=((($154)-(5))|0);
4884 + $opcode=$155;
4885 + label=33;break;
4886 + case 31:
4887 + $mask=3;
4888 + $opcode=2;
4889 + $fom_mask=3;
4890 + label=33;break;
4891 + case 32:
4892 + $mask=5;
4893 + $opcode=2;
4894 + $fom_mask=5;
4895 + label=33;break;
4896 + case 33:
4897 + var $159=$opcode;
4898 + $lastopcode=$159;
4899 + $mixmask=0;
4900 + label=34;break;
4901 + case 34:
4902 + var $161=$count;
4903 + var $162=($161|0)>0;
4904 + if($162){label=35;break;}else{label=345;break;}
4905 + case 35:
4906 + var $164=$x;
4907 + var $165=$3;
4908 + var $166=($164|0)>=($165|0);
4909 + if($166){label=36;break;}else{label=39;break;}
4910 + case 36:
4911 + var $168=$4;
4912 + var $169=($168|0)<=0;
4913 + if($169){label=37;break;}else{label=38;break;}
4914 + case 37:
4915 + $1=0;
4916 + label=347;break;
4917 + case 38:
4918 + $x=0;
4919 + var $172=$4;
4920 + var $173=((($172)-(1))|0);
4921 + $4=$173;
4922 + var $174=$line;
4923 + $prevline=$174;
4924 + var $175=$2;
4925 + var $176=$175;
4926 + var $177=$4;
4927 + var $178=$3;
4928 + var $179=(Math_imul($177,$178)|0);
4929 + var $180=(($176+($179<<1))|0);
4930 + $line=$180;
4931 + label=39;break;
4932 + case 39:
4933 + var $182=$opcode;
4934 + switch(($182|0)){case 3:{ label=261;break;}case 4:{ label=272;break;}case 8:{ label=283;break;}case 13:{ label=321;break;}case 14:{ label=332;break;}case 0:{ label=40;break;}case 1:{ label=69;break;}case 2:{ label=93;break;}default:{label=343;break;}}break;
4935 + case 40:
4936 + var $184=$insertmix;
4937 + var $185=($184|0)!=0;
4938 + if($185){label=41;break;}else{label=45;break;}
4939 + case 41:
4940 + var $187=$prevline;
4941 + var $188=($187|0)==0;
4942 + if($188){label=42;break;}else{label=43;break;}
4943 + case 42:
4944 + var $190=$mix;
4945 + var $191=$x;
4946 + var $192=$line;
4947 + var $193=(($192+($191<<1))|0);
4948 + HEAP16[(($193)>>1)]=$190;
4949 + label=44;break;
4950 + case 43:
4951 + var $195=$x;
4952 + var $196=$prevline;
4953 + var $197=(($196+($195<<1))|0);
4954 + var $198=HEAP16[(($197)>>1)];
4955 + var $199=($198&65535);
4956 + var $200=$mix;
4957 + var $201=($200&65535);
4958 + var $202=$199^$201;
4959 + var $203=(($202)&65535);
4960 + var $204=$x;
4961 + var $205=$line;
4962 + var $206=(($205+($204<<1))|0);
4963 + HEAP16[(($206)>>1)]=$203;
4964 + label=44;break;
4965 + case 44:
4966 + $insertmix=0;
4967 + var $208=$count;
4968 + var $209=((($208)-(1))|0);
4969 + $count=$209;
4970 + var $210=$x;
4971 + var $211=((($210)+(1))|0);
4972 + $x=$211;
4973 + label=45;break;
4974 + case 45:
4975 + var $213=$prevline;
4976 + var $214=($213|0)==0;
4977 + if($214){label=46;break;}else{label=57;break;}
4978 + case 46:
4979 + label=47;break;
4980 + case 47:
4981 + var $217=$count;
4982 + var $218=$217&-8;
4983 + var $219=($218|0)!=0;
4984 + if($219){label=48;break;}else{var $226=0;label=49;break;}
4985 + case 48:
4986 + var $221=$x;
4987 + var $222=((($221)+(8))|0);
4988 + var $223=$3;
4989 + var $224=($222|0)<($223|0);
4990 + var $226=$224;label=49;break;
4991 + case 49:
4992 + var $226;
4993 + if($226){label=50;break;}else{label=51;break;}
4994 + case 50:
4995 + var $228=$x;
4996 + var $229=$line;
4997 + var $230=(($229+($228<<1))|0);
4998 + HEAP16[(($230)>>1)]=0;
4999 + var $231=$count;

This file is too large to show in full.

public/mstsc/keymap.html new
+20
@@ -0,0 +1,20 @@
1 +<!DOCTYPE html>
2 +<html lang="en">
3 + <head>
4 +
5 + <script language="javascript">
6 + function install() {
7 + // bind keyboard event
8 + window.addEventListener('keydown', function (e) {
9 + document.getElementById('output').innerHTML += e.keyCode + ' : "' + e.code + '", <br>';
10 + e.preventDefault();
11 + return false;
12 + });
13 + }
14 + </script>
15 + </head>
16 +
17 + <body onload='install()'>
18 + <p id='output'></p>
19 + </body>
20 +</html>
public/scripts/amt-wsman-0.2.0-min.js
+1 -1
@@ -1 +1 @@
1 -var WsmanStackCreateService=function(e,s,r,a,o,t){var p={};function l(e){if(!e)return"";var s=" ";for(var r in e)e.hasOwnProperty(r)&&0===r.indexOf("@")&&(s+=r.substring(1)+'="'+e[r]+'" ');return s}function w(e){if(!e)return"";if("string"==typeof e)return e;if(e.InstanceID)return'<w:SelectorSet><w:Selector Name="InstanceID">'+e.InstanceID+"</w:Selector></w:SelectorSet>";var s="<w:SelectorSet>";for(var r in e)if(e.hasOwnProperty(r)){if(s+='<w:Selector Name="'+r+'">',e[r].ReferenceParameters){s+="<a:EndpointReference>",s+="<a:Address>"+e[r].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+e[r].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var a=e[r].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(a))for(var o=0;o<a.length;o++)s+="<w:Selector"+l(a[o])+">"+a[o].Value+"</w:Selector>";else s+="<w:Selector"+l(a)+">"+a.Value+"</w:Selector>";s+="</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>"}else s+=e[r];s+="</w:Selector>"}return s+="</w:SelectorSet>"}return p.NextMessageId=1,p.Address="/wsman",p.comm=CreateWsmanComm(e,s,r,a,o,t),p.PerformAjax=function(e,o,s,r,a){null==a&&(a=""),p.comm.PerformAjax('<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns="http://www.w3.org/2003/05/soap-envelope" '+a+"><Header><a:Action>"+e,function(e,s,r){if(200==s){var a=p.ParseWsman(e);a&&null!=a?o(p,a.Header.ResourceURI,a,200,r):o(p,null,{Header:{HttpError:s}},601,r)}else o(p,null,{Header:{HttpError:s}},s,r)},s,r)},p.CancelAllQueries=function(e){p.comm.CancelAllQueries(e)},p.GetNameFromUrl=function(e){var s=e.lastIndexOf("/");return-1==s?e:e.substring(s+1)},p.ExecSubscribe=function(e,s,r,a,o,t,n,l,d,c){var m="",i="";null!=d&&null!=c&&(m="<t:IssuedTokens><t:RequestSecurityTokenResponse><t:TokenType>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken</t:TokenType><t:RequestedSecurityToken><se:UsernameToken><se:Username>"+d+'</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">'+c+"</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>",i='<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'),l=null!=l&&null!=l?"<a:ReferenceParameters>"+l+"</a:ReferenceParameters>":"";var u="http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(n)+m+'</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/'+s+'"><e:NotifyTo><a:Address>'+r+"</a:Address></e:NotifyTo>"+i+"</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>";p.PerformAjax(u+"</Body></Envelope>",a,o,t,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:se="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:m="http://x.com"')},p.ExecUnSubscribe=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(o)+"</Header><Body><e:Unsubscribe/>";p.PerformAjax(t+"</Body></Envelope>",s,r,a,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"')},p.ExecPut=function(e,s,r,a,o,t){var n="http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout>"+w(t)+"</Header><Body>"+function(e,s){if(!e||null==s)return"";var r=p.GetNameFromUrl(e),a="<r:"+r+' xmlns:r="'+e+'">';for(var o in s)if(s.hasOwnProperty(o)&&0!==o.indexOf("__")&&0!==o.indexOf("@")&&void 0!==s[o]&&null!==s[o]&&"function"!=typeof s[o])if("object"==typeof s[o]&&s[o].ReferenceParameters){a+="<r:"+o+"><a:Address>"+s[o].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+s[o].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var t=s[o].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(t))for(var n=0;n<t.length;n++)a+="<w:Selector"+l(t[n])+">"+t[n].Value+"</w:Selector>";else a+="<w:Selector"+l(t)+">"+t.Value+"</w:Selector>";a+="</w:SelectorSet></a:ReferenceParameters></r:"+o+">"}else if(Array.isArray(s[o]))for(n=0;n<s[o].length;n++)a+="<r:"+o+">"+s[o][n].toString()+"</r:"+o+">";else a+="<r:"+o+">"+s[o].toString()+"</r:"+o+">";return a+="</r:"+r+">"}(e,s);p.PerformAjax(n+"</Body></Envelope>",r,a,o)},p.ExecCreate=function(e,s,r,a,o,t){var n=p.GetNameFromUrl(e),l="http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(t)+"</Header><Body><g:"+n+' xmlns:g="'+e+'">';for(var d in s)l+="<g:"+d+">"+s[d]+"</g:"+d+">";p.PerformAjax(l+"</g:"+n+"></Body></Envelope>",r,a,o)},p.ExecCreateXml=function(e,s,r,a,o){var t=p.GetNameFromUrl(e);p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout></Header><Body><r:"+t+' xmlns:r="'+e+'">'+s+"</r:"+t+"></Body></Envelope>",r,a,o)},p.ExecDelete=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(s)+"</Header><Body /></Envelope>";p.PerformAjax(t,r,a,o)},p.ExecGet=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body /></Envelope>",s,r,a)},p.ExecMethod=function(e,s,r,a,o,t,n){var l="";for(var d in r)if(null!=r[d])if(Array.isArray(r[d]))for(var c in r[d])l+="<r:"+d+">"+r[d][c]+"</r:"+d+">";else l+="<r:"+d+">"+r[d]+"</r:"+d+">";p.ExecMethodXml(e,s,l,a,o,t,n)},p.ExecMethodXml=function(e,s,r,a,o,t,n){p.PerformAjax(e+"/"+s+"</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(n)+"</Header><Body><r:"+s+'_INPUT xmlns:r="'+e+'">'+r+"</r:"+s+"_INPUT></Body></Envelope>",a,o,t)},p.ExecEnum=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Enumerate xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration" /></Body></Envelope>',s,r,a)},p.ExecPull=function(e,s,r,a,o){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration"><EnumerationContext>'+s+"</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>",r,a,o)},p.ParseWsman=function(s){try{s.childNodes||(s=function(e){{if(window.DOMParser)return(new DOMParser).parseFromString(e,"text/xml");var s=new ActiveXObject("Microsoft.XMLDOM");return s.async=!1,s.loadXML(e),s}}(s));var e,r={Header:{}},a=s.getElementsByTagName("Header")[0];if(!(a=a||s.getElementsByTagName("a:Header")[0]))return null;for(var o=0;o<a.childNodes.length;o++){var t=a.childNodes[o];r.Header[t.localName]=t.textContent}var n=s.getElementsByTagName("Body")[0];return(n=n||s.getElementsByTagName("a:Body")[0])?(0<n.childNodes.length&&((e=n.childNodes[0].localName).indexOf("_OUTPUT")==e.length-7&&(e=e.substring(0,e.length-7)),r.Header.Method=e,r.Body=function e(s){var r,a={};for(var o=0;o<s.childNodes.length;o++){var t=s.childNodes[o];"true"==(r=0==t.childElementCount?t.textContent:e(t))&&(r=!0),"false"==r&&(r=!1);var n=r;if(0<t.attributes.length){n={Value:r};for(var l=0;l<t.attributes.length;l++)n["@"+t.attributes[l].name]=t.attributes[l].value}a[t.localName]instanceof Array?a[t.localName].push(n):null==a[t.localName]?a[t.localName]=n:a[t.localName]=[a[t.localName],n]}return a}(n.childNodes[0])),r):null}catch(e){return console.log("Unable to parse XML: "+s),null}},p}
\ No newline at end of file
1 +var WsmanStackCreateService=function(e,s,r,a,o,t){var p={};function l(e){if(!e)return"";var s=" ";for(var r in e)e.hasOwnProperty(r)&&0===r.indexOf("@")&&(s+=r.substring(1)+'="'+e[r]+'" ');return s}function w(e){if(!e)return"";if("string"==typeof e)return e;if(e.InstanceID)return'<w:SelectorSet><w:Selector Name="InstanceID">'+e.InstanceID+"</w:Selector></w:SelectorSet>";var s="<w:SelectorSet>";for(var r in e)if(e.hasOwnProperty(r)){if(s+='<w:Selector Name="'+r+'">',e[r].ReferenceParameters){s+="<a:EndpointReference>",s+="<a:Address>"+e[r].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+e[r].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var a=e[r].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(a))for(var o=0;o<a.length;o++)s+="<w:Selector"+l(a[o])+">"+a[o].Value+"</w:Selector>";else s+="<w:Selector"+l(a)+">"+a.Value+"</w:Selector>";s+="</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>"}else s+=e[r];s+="</w:Selector>"}return s+="</w:SelectorSet>"}return p.NextMessageId=1,p.Address="/wsman",p.comm=CreateWsmanComm(e,s,r,a,o,t),p.PerformAjax=function(e,o,s,r,a){null==a&&(a=""),p.comm.PerformAjax('<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns="http://www.w3.org/2003/05/soap-envelope" '+a+"><Header><a:Action>"+e,function(e,s,r){if(200==s){var a=p.ParseWsman(e);a&&null!=a?o(p,a.Header.ResourceURI,a,200,r):o(p,null,{Header:{HttpError:s}},601,r)}else o(p,null,{Header:{HttpError:s}},s,r)},s,r)},p.CancelAllQueries=function(e){p.comm.CancelAllQueries(e)},p.GetNameFromUrl=function(e){var s=e.lastIndexOf("/");return-1==s?e:e.substring(s+1)},p.ExecSubscribe=function(e,s,r,a,o,t,n,l,c,d){var m="",i="";null!=c&&null!=d&&(m="<t:IssuedTokens><t:RequestSecurityTokenResponse><t:TokenType>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken</t:TokenType><t:RequestedSecurityToken><se:UsernameToken><se:Username>"+c+'</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">'+d+"</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>",i='<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'),l=null!=l&&null!=l?"<a:ReferenceParameters>"+l+"</a:ReferenceParameters>":"";var u="http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(n)+m+'</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/'+s+'"><e:NotifyTo><a:Address>'+r+"</a:Address></e:NotifyTo>"+i+"</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>";p.PerformAjax(u+"</Body></Envelope>",a,o,t,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:se="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:m="http://x.com"')},p.ExecUnSubscribe=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(o)+"</Header><Body><e:Unsubscribe/>";p.PerformAjax(t+"</Body></Envelope>",s,r,a,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"')},p.ExecPut=function(e,s,r,a,o,t){var n="http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout>"+w(t)+"</Header><Body>"+function(e,s){if(!e||null==s)return"";var r=p.GetNameFromUrl(e),a="<r:"+r+' xmlns:r="'+e+'">';for(var o in s)if(s.hasOwnProperty(o)&&0!==o.indexOf("__")&&0!==o.indexOf("@")&&void 0!==s[o]&&null!==s[o]&&"function"!=typeof s[o])if("object"==typeof s[o]&&s[o].ReferenceParameters){a+="<r:"+o+"><a:Address>"+s[o].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+s[o].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var t=s[o].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(t))for(var n=0;n<t.length;n++)a+="<w:Selector"+l(t[n])+">"+t[n].Value+"</w:Selector>";else a+="<w:Selector"+l(t)+">"+t.Value+"</w:Selector>";a+="</w:SelectorSet></a:ReferenceParameters></r:"+o+">"}else if(Array.isArray(s[o]))for(n=0;n<s[o].length;n++)a+="<r:"+o+">"+s[o][n].toString()+"</r:"+o+">";else a+="<r:"+o+">"+s[o].toString()+"</r:"+o+">";return a+="</r:"+r+">"}(e,s);p.PerformAjax(n+"</Body></Envelope>",r,a,o)},p.ExecCreate=function(e,s,r,a,o,t){var n=p.GetNameFromUrl(e),l="http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(t)+"</Header><Body><g:"+n+' xmlns:g="'+e+'">';for(var c in s)l+="<g:"+c+">"+s[c]+"</g:"+c+">";p.PerformAjax(l+"</g:"+n+"></Body></Envelope>",r,a,o)},p.ExecCreateXml=function(e,s,r,a,o){var t=p.GetNameFromUrl(e);p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout></Header><Body><r:"+t+' xmlns:r="'+e+'">'+s+"</r:"+t+"></Body></Envelope>",r,a,o)},p.ExecDelete=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(s)+"</Header><Body /></Envelope>";p.PerformAjax(t,r,a,o)},p.ExecGet=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body /></Envelope>",s,r,a)},p.ExecMethod=function(e,s,r,a,o,t,n){var l="";for(var c in r)if(null!=r[c])if(Array.isArray(r[c]))for(var d in r[c])l+="<r:"+c+">"+r[c][d]+"</r:"+c+">";else l+="<r:"+c+">"+r[c]+"</r:"+c+">";p.ExecMethodXml(e,s,l,a,o,t,n)},p.ExecMethodXml=function(e,s,r,a,o,t,n){p.PerformAjax(e+"/"+s+"</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(n)+"</Header><Body><r:"+s+'_INPUT xmlns:r="'+e+'">'+r+"</r:"+s+"_INPUT></Body></Envelope>",a,o,t)},p.ExecEnum=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Enumerate xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration" /></Body></Envelope>',s,r,a)},p.ExecPull=function(e,s,r,a,o){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration"><EnumerationContext>'+s+"</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>",r,a,o)},p.ParseWsman=function(s){try{s.childNodes||(s=function(e){{if(window.DOMParser)return(new DOMParser).parseFromString(e,"text/xml");var s=new ActiveXObject("Microsoft.XMLDOM");return s.async=!1,s.loadXML(e),s}}(s));var e,r={Header:{}},a=s.getElementsByTagName("Header")[0];if(!(a=a||s.getElementsByTagName("a:Header")[0]))return null;for(var o=0;o<a.childNodes.length;o++){var t=a.childNodes[o];r.Header[t.localName]=t.textContent}var n=s.getElementsByTagName("Body")[0];return(n=n||s.getElementsByTagName("a:Body")[0])?(0<n.childNodes.length&&((e=n.childNodes[0].localName).indexOf("_OUTPUT")==e.length-7&&(e=e.substring(0,e.length-7)),r.Header.Method=e,r.Body=function e(s){var r,a={};for(var o=0;o<s.childNodes.length;o++){var t=s.childNodes[o];"true"==(r=0==t.childElementCount?t.textContent:e(t))&&(r=!0),"false"==r&&(r=!1);var n=r;if(0<t.attributes.length){n={Value:r};for(var l=0;l<t.attributes.length;l++)n["@"+t.attributes[l].name]=t.attributes[l].value}a[t.localName]instanceof Array?a[t.localName].push(n):null==a[t.localName]?a[t.localName]=n:a[t.localName]=[a[t.localName],n]}return a}(n.childNodes[0])),r):null}catch(e){return console.log("Unable to parse XML: "+s),null}},p}
\ No newline at end of file
translate/translate.json
+1246 -1234
@@ -14,8 +14,8 @@
14 "ru": " + CIRA",
15 "zh-chs": " + CIRA",
16 "xloc": [
17 - "default.handlebars->27->1193",
18 - "default.handlebars->27->1195"
17 + "default.handlebars->27->1195",
18 + "default.handlebars->27->1197"
19 ]
20 },
21 {
@@ -174,7 +174,7 @@
174 "ru": " Может быть использована подсказка пароля, но не рекоммендуется.",
175 "zh-chs": " 可以使用密碼提示,但不建議使用。",
176 "xloc": [
177 - "default.handlebars->27->1119"
177 + "default.handlebars->27->1121"
178 ]
179 },
180 {
@@ -191,8 +191,8 @@
191 "ru": " Для добавления в группу устройств, пользователь должен зайти на сервер хотя бы один раз.",
192 "zh-chs": " 用戶需要先登錄到該服務器一次,然後才能將其添加到設備組。",
193 "xloc": [
194 - "default.handlebars->27->1268",
195 - "default.handlebars->27->1581"
194 + "default.handlebars->27->1270",
195 + "default.handlebars->27->1583"
196 ]
197 },
198 {
@@ -377,7 +377,7 @@
377 "ru": "* Оставьте пустым для установления случайного пароля каждому устройству.",
378 "zh-chs": "*保留空白以為每個設備分配一個隨機密碼。",
379 "xloc": [
380 - "default.handlebars->27->1240"
380 + "default.handlebars->27->1242"
381 ]
382 },
383 {
@@ -411,7 +411,7 @@
411 "zh-chs": ",",
412 "xloc": [
413 "default-mobile.handlebars->9->435",
414 - "default.handlebars->27->1334"
414 + "default.handlebars->27->1336"
415 ]
416 },
417 {
@@ -446,7 +446,7 @@
446 "ru": ", MQTT онлайн",
447 "zh-chs": ",MQTT在線",
448 "xloc": [
449 - "default.handlebars->27->862"
449 + "default.handlebars->27->864"
450 ]
451 },
452 {
@@ -463,7 +463,7 @@
463 "ru": ", Soft-KVM",
464 "zh-chs": ",軟KVM",
465 "xloc": [
466 - "default.handlebars->27->708"
466 + "default.handlebars->27->710"
467 ]
468 },
469 {
@@ -482,9 +482,9 @@
482 "xloc": [
483 "default-mobile.handlebars->9->277",
484 "default-mobile.handlebars->9->286",
485 - "default.handlebars->27->715",
486 - "default.handlebars->27->746",
487 - "default.handlebars->27->758",
485 + "default.handlebars->27->717",
486 + "default.handlebars->27->748",
487 + "default.handlebars->27->760",
488 "xterm.handlebars->9->6"
489 ]
490 },
@@ -510,7 +510,7 @@
510 "en": ", for this link to work you must download MeshCentral Router run it and click the install button.",
511 "nl": ", om deze link te laten werken, moet u MeshCentral Router downloaden, het uitvoeren en op de installatieknop klikken.",
512 "xloc": [
513 - "default.handlebars->27->672"
513 + "default.handlebars->27->674"
514 ]
515 },
516 {
@@ -568,7 +568,7 @@
568 "en": ", {0} watching",
569 "nl": ", {0} kijken",
570 "xloc": [
571 - "default.handlebars->27->709"
571 + "default.handlebars->27->711"
572 ]
573 },
574 {
@@ -625,9 +625,9 @@
625 "xloc": [
626 "default-mobile.handlebars->9->108",
627 "default-mobile.handlebars->9->288",
628 - "default.handlebars->27->1375",
629 - "default.handlebars->27->1729",
630 - "default.handlebars->27->760"
628 + "default.handlebars->27->1377",
629 + "default.handlebars->27->1731",
630 + "default.handlebars->27->762"
631 ]
632 },
633 {
@@ -676,7 +676,7 @@
676 "ru": "1 активная сессия",
677 "zh-chs": "1個活動會話",
678 "xloc": [
679 - "default.handlebars->27->1647"
679 + "default.handlebars->27->1649"
680 ]
681 },
682 {
@@ -695,14 +695,14 @@
695 "xloc": [
696 "default-mobile.handlebars->9->118",
697 "default-mobile.handlebars->9->439",
698 - "default.handlebars->27->1394"
698 + "default.handlebars->27->1396"
699 ]
700 },
701 {
702 "en": "1 connection",
703 "nl": "1 verbinding",
704 "xloc": [
705 - "default.handlebars->27->711"
705 + "default.handlebars->27->713"
706 ]
707 },
708 {
@@ -738,7 +738,7 @@
738 "ru": "1 группа",
739 "zh-chs": "1組",
740 "xloc": [
741 - "default.handlebars->27->1612"
741 + "default.handlebars->27->1614"
742 ]
743 },
744 {
@@ -810,7 +810,7 @@
810 "ru": "Еще 1 пользователь не показан, используйте поиск чтобы найти пользователей...",
811 "zh-chs": "未再顯示1個用戶,請使用搜索框查找用戶...",
812 "xloc": [
813 - "default.handlebars->27->1429"
813 + "default.handlebars->27->1431"
814 ]
815 },
816 {
@@ -865,7 +865,7 @@
865 "default-mobile.handlebars->9->162",
866 "default-mobile.handlebars->9->165",
867 "default-mobile.handlebars->9->168",
868 - "default.handlebars->27->1433",
868 + "default.handlebars->27->1435",
869 "default.handlebars->27->212",
870 "default.handlebars->27->215",
871 "default.handlebars->27->218",
@@ -1137,8 +1137,8 @@
1137 "ru": "двухфакторная аутентификация включена",
1138 "zh-chs": "啟用第二因素身份驗證",
1139 "xloc": [
1140 - "default.handlebars->27->1446",
1141 - "default.handlebars->27->1634"
1140 + "default.handlebars->27->1448",
1141 + "default.handlebars->27->1636"
1142 ]
1143 },
1144 {
@@ -1503,7 +1503,7 @@
1503 "ru": "7-дневная статистика работы",
1504 "zh-chs": "7天電源狀態",
1505 "xloc": [
1506 - "default.handlebars->27->641"
1506 + "default.handlebars->27->643"
1507 ]
1508 },
1509 {
@@ -1850,7 +1850,7 @@
1850 "ru": "Отказано в доступе",
1851 "zh-chs": "拒絕訪問",
1852 "xloc": [
1853 - "default.handlebars->27->863"
1853 + "default.handlebars->27->865"
1854 ]
1855 },
1856 {
@@ -1885,7 +1885,7 @@
1885 "ru": "Доступ к файлам сервера",
1886 "zh-chs": "訪問服務器文件",
1887 "xloc": [
1888 - "default.handlebars->27->1587"
1888 + "default.handlebars->27->1589"
1889 ]
1890 },
1891 {
@@ -1960,8 +1960,8 @@
1960 "default-mobile.handlebars->9->93",
1961 "default-mobile.handlebars->9->95",
1962 "default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->p3AccountActions->p2AccountSecurity->1->0",
1963 - "default.handlebars->27->1128",
1963 "default.handlebars->27->1130",
1964 + "default.handlebars->27->1132",
1965 "default.handlebars->27->464",
1966 "default.handlebars->27->466"
1967 ]
@@ -2009,8 +2009,8 @@
2009 "ru": "Аккаунт заблокирован",
2010 "zh-chs": "帐户已被锁定",
2011 "xloc": [
2012 - "default.handlebars->27->1448",
2013 - "default.handlebars->27->1584"
2012 + "default.handlebars->27->1450",
2013 + "default.handlebars->27->1586"
2014 ]
2015 },
2016 {
@@ -2098,7 +2098,7 @@
2098 "ru": "Действиe",
2099 "zh-chs": "行動",
2100 "xloc": [
2101 - "default.handlebars->27->868",
2101 + "default.handlebars->27->870",
2102 "default.handlebars->container->column_l->p42->p42tbl->1->0->8"
2103 ]
2104 },
@@ -2116,8 +2116,8 @@
2116 "ru": "Файл действий",
2117 "zh-chs": "動作文件",
2118 "xloc": [
2119 - "default.handlebars->27->684",
2120 - "default.handlebars->27->686"
2119 + "default.handlebars->27->686",
2120 + "default.handlebars->27->688"
2121 ]
2122 },
2123 {
@@ -2196,7 +2196,7 @@
2196 "default-mobile.handlebars->9->344",
2197 "default.handlebars->27->488",
2198 "default.handlebars->27->490",
2199 - "default.handlebars->27->826"
2199 + "default.handlebars->27->828"
2200 ]
2201 },
2202 {
@@ -2213,8 +2213,8 @@
2213 "ru": "Активация",
2214 "zh-chs": "激活",
2215 "xloc": [
2216 - "default.handlebars->27->1206",
2216 "default.handlebars->27->1208",
2217 + "default.handlebars->27->1210",
2218 "default.handlebars->27->238",
2219 "default.handlebars->27->240"
2220 ]
@@ -2250,7 +2250,7 @@
2250 "ru": "Добавить агент",
2251 "zh-chs": "添加代理",
2252 "xloc": [
2253 - "default.handlebars->27->1210",
2253 + "default.handlebars->27->1212",
2254 "default.handlebars->27->242"
2255 ]
2256 },
@@ -2285,8 +2285,8 @@
2285 "ru": "Добавить устройство",
2286 "zh-chs": "添加設備",
2287 "xloc": [
2288 - "default.handlebars->27->1561",
2289 - "default.handlebars->27->1680"
2288 + "default.handlebars->27->1563",
2289 + "default.handlebars->27->1682"
2290 ]
2291 },
2292 {
@@ -2303,7 +2303,7 @@
2303 "ru": "Добавить событие к устройству",
2304 "zh-chs": "添加設備事件",
2305 "xloc": [
2306 - "default.handlebars->27->622"
2306 + "default.handlebars->27->624"
2307 ]
2308 },
2309 {
@@ -2320,9 +2320,9 @@
2320 "ru": "Добавить группу устройств",
2321 "zh-chs": "添加設備組",
2322 "xloc": [
2323 - "default.handlebars->27->1300",
2324 - "default.handlebars->27->1555",
2325 - "default.handlebars->27->1668",
2323 + "default.handlebars->27->1302",
2324 + "default.handlebars->27->1557",
2325 + "default.handlebars->27->1670",
2326 "default.handlebars->27->200"
2327 ]
2328 },
@@ -2337,7 +2337,7 @@
2337 "nl": "Machtigingen voor apparaatgroep toevoegen",
2338 "zh-chs": "添加设备组权限",
2339 "xloc": [
2340 - "default.handlebars->27->1297"
2340 + "default.handlebars->27->1299"
2341 ]
2342 },
2343 {
@@ -2353,8 +2353,8 @@
2353 "ru": "Добавить разрешения для устройства",
2354 "zh-chs": "添加设备权限",
2355 "xloc": [
2356 - "default.handlebars->27->1302",
2357 - "default.handlebars->27->1304"
2356 + "default.handlebars->27->1304",
2357 + "default.handlebars->27->1306"
2358 ]
2359 },
2360 {
@@ -2439,7 +2439,7 @@
2439 "ru": "Добавить участие",
2440 "zh-chs": "添加會員",
2441 "xloc": [
2442 - "default.handlebars->27->1698"
2442 + "default.handlebars->27->1700"
2443 ]
2444 },
2445 {
@@ -2477,8 +2477,8 @@
2477 "default.handlebars->27->135",
2478 "default.handlebars->27->138",
2479 "default.handlebars->27->139",
2480 - "default.handlebars->27->896",
2481 - "default.handlebars->27->897"
2480 + "default.handlebars->27->898",
2481 + "default.handlebars->27->899"
2482 ]
2483 },
2484 {
@@ -2496,7 +2496,7 @@
2496 "zh-chs": "添加用戶",
2497 "xloc": [
2498 "default-mobile.handlebars->9->384",
2499 - "default.handlebars->27->579"
2499 + "default.handlebars->27->581"
2500 ]
2501 },
2502 {
@@ -2512,7 +2512,7 @@
2512 "ru": "Добавить разрешения для пользовательских устройств",
2513 "zh-chs": "添加用户设备权限",
2514 "xloc": [
2515 - "default.handlebars->27->1307"
2515 + "default.handlebars->27->1309"
2516 ]
2517 },
2518 {
@@ -2529,10 +2529,10 @@
2529 "ru": "Добавить группу пользователей",
2530 "zh-chs": "添加用戶組",
2531 "xloc": [
2532 - "default.handlebars->27->1200",
2533 - "default.handlebars->27->1299",
2534 - "default.handlebars->27->1674",
2535 - "default.handlebars->27->580"
2532 + "default.handlebars->27->1202",
2533 + "default.handlebars->27->1301",
2534 + "default.handlebars->27->1676",
2535 + "default.handlebars->27->582"
2536 ]
2537 },
2538 {
@@ -2546,7 +2546,7 @@
2546 "nl": "Gebruikersmachtigingen voor apparaatgroep toevoegen",
2547 "zh-chs": "添加用户组设备权限",
2548 "xloc": [
2549 - "default.handlebars->27->1309"
2549 + "default.handlebars->27->1311"
2550 ]
2551 },
2552 {
@@ -2591,8 +2591,8 @@
2591 "ru": "Добавить пользователей",
2592 "zh-chs": "添加用戶",
2593 "xloc": [
2594 - "default.handlebars->27->1199",
2595 - "default.handlebars->27->1550"
2594 + "default.handlebars->27->1201",
2595 + "default.handlebars->27->1552"
2596 ]
2597 },
2598 {
@@ -2609,7 +2609,7 @@
2609 "ru": "Добавить пользователей в группу устройств",
2610 "zh-chs": "將用戶添加到設備組",
2611 "xloc": [
2612 - "default.handlebars->27->1296"
2612 + "default.handlebars->27->1298"
2613 ]
2614 },
2615 {
@@ -2626,7 +2626,7 @@
2626 "ru": "Добавить пользователей в группу",
2627 "zh-chs": "將用戶添加到用戶組",
2628 "xloc": [
2629 - "default.handlebars->27->1583"
2629 + "default.handlebars->27->1585"
2630 ]
2631 },
2632 {
@@ -2677,7 +2677,7 @@
2677 "ru": "Добавить новый Intel&reg; AMT компьютер, находящийся в интернете.",
2678 "zh-chs": "添加位於互聯網上的新英特爾&reg;AMT計算機。",
2679 "xloc": [
2680 - "default.handlebars->27->1201",
2680 + "default.handlebars->27->1203",
2681 "default.handlebars->27->231"
2682 ]
2683 },
@@ -2695,7 +2695,7 @@
2695 "ru": "Добавить новый Intel&reg; AMT компьютер, находящийся в локальной сети.",
2696 "zh-chs": "添加位於本地網絡上的新英特爾&reg;AMT計算機。",
2697 "xloc": [
2698 - "default.handlebars->27->1203",
2698 + "default.handlebars->27->1205",
2699 "default.handlebars->27->233"
2700 ]
2701 },
@@ -2727,7 +2727,7 @@
2727 "nl": "Voeg een nieuwe computer toe aan deze apparaatgroep door de mesh-agent te installeren.",
2728 "zh-chs": "通过安装网状代理,将新计算机添加到该设备组。",
2729 "xloc": [
2730 - "default.handlebars->27->1209",
2730 + "default.handlebars->27->1211",
2731 "default.handlebars->27->241"
2732 ]
2733 },
@@ -2780,7 +2780,7 @@
2780 "zh-chs": "管理員控制模式(ACM)",
2781 "xloc": [
2782 "default-mobile.handlebars->9->346",
2783 - "default.handlebars->27->828"
2783 + "default.handlebars->27->830"
2784 ]
2785 },
2786 {
@@ -2798,7 +2798,7 @@
2798 "zh-chs": "管理員憑證",
2799 "xloc": [
2800 "default-mobile.handlebars->9->352",
2801 - "default.handlebars->27->834"
2801 + "default.handlebars->27->836"
2802 ]
2803 },
2804 {
@@ -2833,7 +2833,7 @@
2833 "ru": "Области администратора",
2834 "zh-chs": "管理領域",
2835 "xloc": [
2836 - "default.handlebars->27->1616"
2836 + "default.handlebars->27->1618"
2837 ]
2838 },
2839 {
@@ -2868,7 +2868,7 @@
2868 "ru": "Административные области",
2869 "zh-chs": "行政領域",
2870 "xloc": [
2871 - "default.handlebars->27->1501"
2871 + "default.handlebars->27->1503"
2872 ]
2873 },
2874 {
@@ -2885,7 +2885,7 @@
2885 "ru": "Администратор",
2886 "zh-chs": "管理員",
2887 "xloc": [
2888 - "default.handlebars->27->1440"
2888 + "default.handlebars->27->1442"
2889 ]
2890 },
2891 {
@@ -2902,7 +2902,7 @@
2902 "ru": "Африканский",
2903 "zh-chs": "南非語",
2904 "xloc": [
2905 - "default.handlebars->27->899"
2905 + "default.handlebars->27->901"
2906 ]
2907 },
2908 {
@@ -2922,8 +2922,8 @@
2922 "default-mobile.handlebars->9->192",
2923 "default-mobile.handlebars->9->216",
2924 "default-mobile.handlebars->9->232",
2925 - "default.handlebars->27->1361",
2926 - "default.handlebars->27->1369",
2925 + "default.handlebars->27->1363",
2926 + "default.handlebars->27->1371",
2927 "default.handlebars->27->179",
2928 "default.handlebars->27->385",
2929 "default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->p15outputselecttd->p15outputselect->1"
@@ -2943,8 +2943,8 @@
2943 "ru": "Агент + Intel AMT",
2944 "zh-chs": "代理+英特爾AMT",
2945 "xloc": [
2946 - "default.handlebars->27->1363",
2947 - "default.handlebars->27->1371"
2946 + "default.handlebars->27->1365",
2947 + "default.handlebars->27->1373"
2948 ]
2949 },
2950 {
@@ -2979,7 +2979,7 @@
2979 "zh-chs": "代理控制台",
2980 "xloc": [
2981 "default-mobile.handlebars->9->419",
2982 - "default.handlebars->27->1317"
2982 + "default.handlebars->27->1319"
2983 ]
2984 },
2985 {
@@ -2996,7 +2996,7 @@
2996 "ru": "Счетчик ошибок агента",
2997 "zh-chs": "座席錯誤計數器",
2998 "xloc": [
2999 - "default.handlebars->27->1739"
2999 + "default.handlebars->27->1741"
3000 ]
3001 },
3002 {
@@ -3065,7 +3065,7 @@
3065 "ru": "Сессии агентов",
3066 "zh-chs": "座席會議",
3067 "xloc": [
3068 - "default.handlebars->27->1755"
3068 + "default.handlebars->27->1757"
3069 ]
3070 },
3071 {
@@ -3100,7 +3100,7 @@
3100 "ru": "Типы агента",
3101 "zh-chs": "代理類型",
3102 "xloc": [
3103 - "default.handlebars->27->1367",
3103 + "default.handlebars->27->1369",
3104 "default.handlebars->container->column_l->p21->3->1->meshOsChartDiv->1"
3105 ]
3106 },
@@ -3119,8 +3119,8 @@
3119 "zh-chs": "代理已連接",
3120 "xloc": [
3121 "default.handlebars->27->144",
3122 - "default.handlebars->27->570",
3123 - "default.handlebars->27->571"
3122 + "default.handlebars->27->572",
3123 + "default.handlebars->27->573"
3124 ]
3125 },
3126 {
@@ -3154,7 +3154,7 @@
3154 "ru": "Агент оффлайн",
3155 "zh-chs": "代理離線",
3156 "xloc": [
3157 - "default.handlebars->27->861"
3157 + "default.handlebars->27->863"
3158 ]
3159 },
3160 {
@@ -3171,7 +3171,7 @@
3171 "ru": "Агент онлайн",
3172 "zh-chs": "代理在線",
3173 "xloc": [
3174 - "default.handlebars->27->860"
3174 + "default.handlebars->27->862"
3175 ]
3176 },
3177 {
@@ -3188,7 +3188,7 @@
3188 "ru": "Агенты",
3189 "zh-chs": "代理商",
3190 "xloc": [
3191 - "default.handlebars->27->1768"
3191 + "default.handlebars->27->1770"
3192 ]
3193 },
3194 {
@@ -3205,7 +3205,7 @@
3205 "ru": "Албанский",
3206 "zh-chs": "阿爾巴尼亞語",
3207 "xloc": [
3208 - "default.handlebars->27->900"
3208 + "default.handlebars->27->902"
3209 ]
3210 },
3211 {
@@ -3255,9 +3255,9 @@
3255 "ru": "Фокусирование всех",
3256 "zh-chs": "全部聚焦",
3257 "xloc": [
3258 - "default.handlebars->27->716",
3258 "default.handlebars->27->718",
3260 - "default.handlebars->27->719"
3259 + "default.handlebars->27->720",
3260 + "default.handlebars->27->721"
3261 ]
3262 },
3263 {
@@ -3274,8 +3274,8 @@
3274 "ru": "Разрешить пользователям управлять этой группой и устройствами этой группы.",
3275 "zh-chs": "允許用戶管理此設備組和該組中的設備。",
3276 "xloc": [
3277 - "default.handlebars->27->1266",
3278 - "default.handlebars->27->1580"
3277 + "default.handlebars->27->1268",
3278 + "default.handlebars->27->1582"
3279 ]
3280 },
3281 {
@@ -3291,7 +3291,7 @@
3291 "ru": "Разрешить пользователям управлять этим устройством.",
3292 "zh-chs": "允许用户管理此设备。",
3293 "xloc": [
3294 - "default.handlebars->27->1267"
3294 + "default.handlebars->27->1269"
3295 ]
3296 },
3297 {
@@ -3344,7 +3344,7 @@
3344 "ru": "Поменять (F10 = ESC+0)",
3345 "zh-chs": "備用(F10 = ESC + 0)",
3346 "xloc": [
3347 - "default.handlebars->27->751"
3347 + "default.handlebars->27->753"
3348 ]
3349 },
3350 {
@@ -3379,8 +3379,8 @@
3379 "ru": "Всегда уведомлять",
3380 "zh-chs": "始終通知",
3381 "xloc": [
3382 - "default.handlebars->27->1180",
3383 - "default.handlebars->27->1625",
3382 + "default.handlebars->27->1182",
3383 + "default.handlebars->27->1627",
3384 "default.handlebars->27->524"
3385 ]
3386 },
@@ -3398,8 +3398,8 @@
3398 "ru": "Всегда запрашивать",
3399 "zh-chs": "總是提示",
3400 "xloc": [
3401 - "default.handlebars->27->1181",
3402 - "default.handlebars->27->1626",
3401 + "default.handlebars->27->1183",
3402 + "default.handlebars->27->1628",
3403 "default.handlebars->27->525"
3404 ]
3405 },
@@ -3599,7 +3599,7 @@
3599 "ru": "Арабский (Алжир)",
3600 "zh-chs": "阿拉伯文(阿爾及利亞)",
3601 "xloc": [
3602 - "default.handlebars->27->902"
3602 + "default.handlebars->27->904"
3603 ]
3604 },
3605 {
@@ -3616,7 +3616,7 @@
3616 "ru": "Арабский (Бахрейн)",
3617 "zh-chs": "阿拉伯文(巴林)",
3618 "xloc": [
3619 - "default.handlebars->27->903"
3619 + "default.handlebars->27->905"
3620 ]
3621 },
3622 {
@@ -3633,7 +3633,7 @@
3633 "ru": "Арабский (Египет)",
3634 "zh-chs": "阿拉伯文(埃及)",
3635 "xloc": [
3636 - "default.handlebars->27->904"
3636 + "default.handlebars->27->906"
3637 ]
3638 },
3639 {
@@ -3650,7 +3650,7 @@
3650 "ru": "Арабский (Ирак)",
3651 "zh-chs": "阿拉伯文(伊拉克)",
3652 "xloc": [
3653 - "default.handlebars->27->905"
3653 + "default.handlebars->27->907"
3654 ]
3655 },
3656 {
@@ -3667,7 +3667,7 @@
3667 "ru": "Арабский (Иордания)",
3668 "zh-chs": "阿拉伯語(約旦)",
3669 "xloc": [
3670 - "default.handlebars->27->906"
3670 + "default.handlebars->27->908"
3671 ]
3672 },
3673 {
@@ -3684,7 +3684,7 @@
3684 "ru": "Арабский (Кувейт)",
3685 "zh-chs": "阿拉伯文(科威特)",
3686 "xloc": [
3687 - "default.handlebars->27->907"
3687 + "default.handlebars->27->909"
3688 ]
3689 },
3690 {
@@ -3701,7 +3701,7 @@
3701 "ru": "Арабский (Ливан)",
3702 "zh-chs": "阿拉伯語(黎巴嫩)",
3703 "xloc": [
3704 - "default.handlebars->27->908"
3704 + "default.handlebars->27->910"
3705 ]
3706 },
3707 {
@@ -3718,7 +3718,7 @@
3718 "ru": "Арабский (Ливия)",
3719 "zh-chs": "阿拉伯文(利比亞)",
3720 "xloc": [
3721 - "default.handlebars->27->909"
3721 + "default.handlebars->27->911"
3722 ]
3723 },
3724 {
@@ -3735,7 +3735,7 @@
3735 "ru": "Арабский (Марокко)",
3736 "zh-chs": "阿拉伯文(摩洛哥)",
3737 "xloc": [
3738 - "default.handlebars->27->910"
3738 + "default.handlebars->27->912"
3739 ]
3740 },
3741 {
@@ -3752,7 +3752,7 @@
3752 "ru": "Арабский (Оман)",
3753 "zh-chs": "阿拉伯文(阿曼)",
3754 "xloc": [
3755 - "default.handlebars->27->911"
3755 + "default.handlebars->27->913"
3756 ]
3757 },
3758 {
@@ -3769,7 +3769,7 @@
3769 "ru": "Арабский (Катар)",
3770 "zh-chs": "阿拉伯語(卡塔爾)",
3771 "xloc": [
3772 - "default.handlebars->27->912"
3772 + "default.handlebars->27->914"
3773 ]
3774 },
3775 {
@@ -3786,7 +3786,7 @@
3786 "ru": "Арабский (Саудовская Аравия)",
3787 "zh-chs": "阿拉伯語(沙特阿拉伯)",
3788 "xloc": [
3789 - "default.handlebars->27->913"
3789 + "default.handlebars->27->915"
3790 ]
3791 },
3792 {
@@ -3803,7 +3803,7 @@
3803 "ru": "Арабский (стандартный)",
3804 "zh-chs": "阿拉伯語(標準)",
3805 "xloc": [
3806 - "default.handlebars->27->901"
3806 + "default.handlebars->27->903"
3807 ]
3808 },
3809 {
@@ -3820,7 +3820,7 @@
3820 "ru": "Арабский (Сирия)",
3821 "zh-chs": "阿拉伯語(敘利亞)",
3822 "xloc": [
3823 - "default.handlebars->27->914"
3823 + "default.handlebars->27->916"
3824 ]
3825 },
3826 {
@@ -3837,7 +3837,7 @@
3837 "ru": "Арабский (Тунис)",
3838 "zh-chs": "阿拉伯文(突尼斯)",
3839 "xloc": [
3840 - "default.handlebars->27->915"
3840 + "default.handlebars->27->917"
3841 ]
3842 },
3843 {
@@ -3854,7 +3854,7 @@
3854 "ru": "Арабский (О.А.Э.)",
3855 "zh-chs": "阿拉伯文(阿聯酋)",
3856 "xloc": [
3857 - "default.handlebars->27->916"
3857 + "default.handlebars->27->918"
3858 ]
3859 },
3860 {
@@ -3871,7 +3871,7 @@
3871 "ru": "Арабский (Йемен)",
3872 "zh-chs": "阿拉伯文(也門)",
3873 "xloc": [
3874 - "default.handlebars->27->917"
3874 + "default.handlebars->27->919"
3875 ]
3876 },
3877 {
@@ -3888,7 +3888,7 @@
3888 "ru": "Арагонский",
3889 "zh-chs": "阿拉貢人",
3890 "xloc": [
3891 - "default.handlebars->27->918"
3891 + "default.handlebars->27->920"
3892 ]
3893 },
3894 {
@@ -3906,7 +3906,7 @@
3906 "zh-chs": "建築",
3907 "xloc": [
3908 "default-mobile.handlebars->9->320",
3909 - "default.handlebars->27->802"
3909 + "default.handlebars->27->804"
3910 ]
3911 },
3912 {
@@ -3941,7 +3941,7 @@
3941 "zh-chs": "您確定要刪除組{0}嗎?刪除設備組還將刪除該組中有關設備的所有信息。",
3942 "xloc": [
3943 "default-mobile.handlebars->9->390",
3944 - "default.handlebars->27->1244"
3944 + "default.handlebars->27->1246"
3945 ]
3946 },
3947 {
@@ -3958,7 +3958,7 @@
3958 "ru": "Вы действительно хотите удалить устройство \\\"{0}\\\"?",
3959 "zh-chs": "您確定要刪除節點{0}嗎?",
3960 "xloc": [
3961 - "default.handlebars->27->663"
3961 + "default.handlebars->27->665"
3962 ]
3963 },
3964 {
@@ -3975,7 +3975,7 @@
3975 "ru": "Вы действительно хотите деинсталировать выбранного агента?",
3976 "zh-chs": "您確定要卸載所選代理嗎?",
3977 "xloc": [
3978 - "default.handlebars->27->652"
3978 + "default.handlebars->27->654"
3979 ]
3980 },
3981 {
@@ -3992,7 +3992,7 @@
3992 "ru": "Вы действительно хотите деинсталлировать выбранных {0} агентов?",
3993 "zh-chs": "您確定要卸載所選的{0}代理嗎?",
3994 "xloc": [
3995 - "default.handlebars->27->651"
3995 + "default.handlebars->27->653"
3996 ]
3997 },
3998 {
@@ -4009,7 +4009,7 @@
4009 "ru": "Вы уверенны, что {0} плагин: {1}",
4010 "zh-chs": "您確定要{0}插件嗎:{1}",
4011 "xloc": [
4012 - "default.handlebars->27->1808"
4012 + "default.handlebars->27->1810"
4013 ]
4014 },
4015 {
@@ -4026,7 +4026,7 @@
4026 "ru": "Армянский",
4027 "zh-chs": "亞美尼亞人",
4028 "xloc": [
4029 - "default.handlebars->27->919"
4029 + "default.handlebars->27->921"
4030 ]
4031 },
4032 {
@@ -4071,7 +4071,7 @@
4071 "ru": "Ассамский",
4072 "zh-chs": "阿薩姆語",
4073 "xloc": [
4074 - "default.handlebars->27->920"
4074 + "default.handlebars->27->922"
4075 ]
4076 },
4077 {
@@ -4088,7 +4088,7 @@
4088 "ru": "Астурии",
4089 "zh-chs": "阿斯圖里亞斯人",
4090 "xloc": [
4091 - "default.handlebars->27->921"
4091 + "default.handlebars->27->923"
4092 ]
4093 },
4094 {
@@ -4105,7 +4105,7 @@
4105 "ru": "Приложение аутентификации",
4106 "zh-chs": "身份驗證應用",
4107 "xloc": [
4108 - "default.handlebars->27->1629"
4108 + "default.handlebars->27->1631"
4109 ]
4110 },
4111 {
@@ -4128,8 +4128,8 @@
4128 "default-mobile.handlebars->9->73",
4129 "default.handlebars->27->109",
4130 "default.handlebars->27->114",
4131 - "default.handlebars->27->885",
4132 - "default.handlebars->27->887"
4131 + "default.handlebars->27->887",
4132 + "default.handlebars->27->889"
4133 ]
4134 },
4135 {
@@ -4197,7 +4197,7 @@
4197 "ru": "Автоудаление",
4198 "zh-chs": "自動刪除",
4199 "xloc": [
4200 - "default.handlebars->27->1168"
4200 + "default.handlebars->27->1170"
4201 ]
4202 },
4203 {
@@ -4251,7 +4251,7 @@
4251 "ru": "Азербайджанский",
4252 "zh-chs": "阿塞拜疆",
4253 "xloc": [
4254 - "default.handlebars->27->922"
4254 + "default.handlebars->27->924"
4255 ]
4256 },
4257 {
@@ -4269,7 +4269,7 @@
4269 "zh-chs": "的BIOS",
4270 "xloc": [
4271 "default-mobile.handlebars->9->358",
4272 - "default.handlebars->27->840"
4272 + "default.handlebars->27->842"
4273 ]
4274 },
4275 {
@@ -4366,8 +4366,8 @@
4366 "ru": "Фоновый и интерактивный",
4367 "zh-chs": "背景與互動",
4368 "xloc": [
4369 - "default.handlebars->27->1344",
4370 - "default.handlebars->27->1351",
4369 + "default.handlebars->27->1346",
4370 + "default.handlebars->27->1353",
4371 "default.handlebars->27->310"
4372 ]
4373 },
@@ -4385,8 +4385,8 @@
4385 "ru": "Только фоновый",
4386 "zh-chs": "僅背景",
4387 "xloc": [
4388 - "default.handlebars->27->1345",
4389 - "default.handlebars->27->1352",
4388 + "default.handlebars->27->1347",
4389 + "default.handlebars->27->1354",
4390 "default.handlebars->27->311",
4391 "default.handlebars->27->333"
4392 ]
@@ -4422,7 +4422,7 @@
4422 "ru": "Резервные коды",
4423 "zh-chs": "備用碼",
4424 "xloc": [
4425 - "default.handlebars->27->1631"
4425 + "default.handlebars->27->1633"
4426 ]
4427 },
4428 {
@@ -4439,7 +4439,7 @@
4439 "ru": "Плохой ключ",
4440 "zh-chs": "錯誤的簽名",
4441 "xloc": [
4442 - "default.handlebars->27->1746"
4442 + "default.handlebars->27->1748"
4443 ]
4444 },
4445 {
@@ -4456,7 +4456,7 @@
4456 "ru": "Плохой веб-сертификат",
4457 "zh-chs": "錯誤的網絡證書",
4458 "xloc": [
4459 - "default.handlebars->27->1745"
4459 + "default.handlebars->27->1747"
4460 ]
4461 },
4462 {
@@ -4473,7 +4473,7 @@
4473 "ru": "Баскский",
4474 "zh-chs": "巴斯克",
4475 "xloc": [
4476 - "default.handlebars->27->923"
4476 + "default.handlebars->27->925"
4477 ]
4478 },
4479 {
@@ -4507,7 +4507,7 @@
4507 "ru": "Белорусский",
4508 "zh-chs": "白俄羅斯語",
4509 "xloc": [
4510 - "default.handlebars->27->925"
4510 + "default.handlebars->27->927"
4511 ]
4512 },
4513 {
@@ -4524,7 +4524,7 @@
4524 "ru": "Бенгальский",
4525 "zh-chs": "孟加拉",
4526 "xloc": [
4527 - "default.handlebars->27->926"
4527 + "default.handlebars->27->928"
4528 ]
4529 },
4530 {
@@ -4560,7 +4560,7 @@
4560 "ru": "Боснийский",
4561 "zh-chs": "波斯尼亞人",
4562 "xloc": [
4563 - "default.handlebars->27->927"
4563 + "default.handlebars->27->929"
4564 ]
4565 },
4566 {
@@ -4577,7 +4577,7 @@
4577 "ru": "Бретонский",
4578 "zh-chs": "布列塔尼",
4579 "xloc": [
4580 - "default.handlebars->27->928"
4580 + "default.handlebars->27->930"
4581 ]
4582 },
4583 {
@@ -4594,7 +4594,7 @@
4594 "ru": "Отправить сообщение",
4595 "zh-chs": "廣播",
4596 "xloc": [
4597 - "default.handlebars->27->1548",
4597 + "default.handlebars->27->1550",
4598 "default.handlebars->container->column_l->p4->3->1->0->3->1"
4599 ]
4600 },
@@ -4612,7 +4612,7 @@
4612 "ru": "Отправить сообщение",
4613 "zh-chs": "廣播消息",
4614 "xloc": [
4615 - "default.handlebars->27->1483"
4615 + "default.handlebars->27->1485"
4616 ]
4617 },
4618 {
@@ -4629,7 +4629,7 @@
4629 "ru": "Отправить сообщение всем подключенным пользователям.",
4630 "zh-chs": "向所有連接的用戶廣播消息。",
4631 "xloc": [
4632 - "default.handlebars->27->1482"
4632 + "default.handlebars->27->1484"
4633 ]
4634 },
4635 {
@@ -4646,7 +4646,7 @@
4646 "ru": "Болгарский",
4647 "zh-chs": "保加利亞語",
4648 "xloc": [
4649 - "default.handlebars->27->924"
4649 + "default.handlebars->27->926"
4650 ]
4651 },
4652 {
@@ -4663,7 +4663,7 @@
4663 "ru": "Бирманский",
4664 "zh-chs": "緬甸人",
4665 "xloc": [
4666 - "default.handlebars->27->929"
4666 + "default.handlebars->27->931"
4667 ]
4668 },
4669 {
@@ -4699,8 +4699,8 @@
4699 "zh-chs": "CIRA",
4700 "xloc": [
4701 "default-mobile.handlebars->9->193",
4702 - "default.handlebars->27->1232",
4703 - "default.handlebars->27->1237",
4702 + "default.handlebars->27->1234",
4703 + "default.handlebars->27->1239",
4704 "default.handlebars->27->181",
4705 "default.handlebars->27->387"
4706 ]
@@ -4719,7 +4719,7 @@
4719 "ru": "CIRA Сервер",
4720 "zh-chs": "CIRA服務器",
4721 "xloc": [
4722 - "default.handlebars->27->1796"
4722 + "default.handlebars->27->1798"
4723 ]
4724 },
4725 {
@@ -4736,7 +4736,7 @@
4736 "ru": "CIRA Сервер команды",
4737 "zh-chs": "CIRA服務器命令",
4738 "xloc": [
4739 - "default.handlebars->27->1797"
4739 + "default.handlebars->27->1799"
4740 ]
4741 },
4742 {
@@ -4753,7 +4753,7 @@
4753 "zh-chs": "CPU",
4754 "xloc": [
4755 "default-mobile.handlebars->9->364",
4756 - "default.handlebars->27->846"
4756 + "default.handlebars->27->848"
4757 ]
4758 },
4759 {
@@ -4770,7 +4770,7 @@
4770 "ru": "Загрузка CPU",
4771 "zh-chs": "CPU負載",
4772 "xloc": [
4773 - "default.handlebars->27->1760"
4773 + "default.handlebars->27->1762"
4774 ]
4775 },
4776 {
@@ -4787,7 +4787,7 @@
4787 "ru": "Загрузка CPU за последние 15 минут",
4788 "zh-chs": "最近15分鐘的CPU負載",
4789 "xloc": [
4790 - "default.handlebars->27->1763"
4790 + "default.handlebars->27->1765"
4791 ]
4792 },
4793 {
@@ -4804,7 +4804,7 @@
4804 "ru": "Загрузка CPU за последние 5 минут",
4805 "zh-chs": "最近5分鐘的CPU負載",
4806 "xloc": [
4807 - "default.handlebars->27->1762"
4807 + "default.handlebars->27->1764"
4808 ]
4809 },
4810 {
@@ -4821,7 +4821,7 @@
4821 "ru": "Загрузка CPU за последнюю минуту",
4822 "zh-chs": "最後一分鐘的CPU負載",
4823 "xloc": [
4824 - "default.handlebars->27->1761"
4824 + "default.handlebars->27->1763"
4825 ]
4826 },
4827 {
@@ -4838,8 +4838,8 @@
4838 "ru": "CR+LF",
4839 "zh-chs": "CR +低頻",
4840 "xloc": [
4841 - "default.handlebars->27->744",
4842 - "default.handlebars->27->753",
4841 + "default.handlebars->27->746",
4842 + "default.handlebars->27->755",
4843 "default.handlebars->container->column_l->p12->termTable->1->1->6->1->1->terminalSettingsButtons"
4844 ]
4845 },
@@ -4857,8 +4857,8 @@
4857 "ru": "Формат CSV",
4858 "zh-chs": "CSV格式",
4859 "xloc": [
4860 - "default.handlebars->27->1415",
4861 - "default.handlebars->27->1474",
4860 + "default.handlebars->27->1417",
4861 + "default.handlebars->27->1476",
4862 "default.handlebars->27->413"
4863 ]
4864 },
@@ -4876,7 +4876,7 @@
4876 "ru": "Ошибка вызова",
4877 "zh-chs": "通話錯誤",
4878 "xloc": [
4879 - "default.handlebars->27->1809"
4879 + "default.handlebars->27->1811"
4880 ]
4881 },
4882 {
@@ -4895,7 +4895,7 @@
4895 "xloc": [
4896 "default-mobile.handlebars->9->82",
4897 "default-mobile.handlebars->dialog->idx_dlgButtonBar",
4898 - "default.handlebars->27->1149",
4898 + "default.handlebars->27->1151",
4899 "default.handlebars->container->dialog->idx_dlgButtonBar",
4900 "login-mobile.handlebars->dialog->idx_dlgButtonBar",
4901 "login.handlebars->dialog->idx_dlgButtonBar",
@@ -4915,8 +4915,8 @@
4915 "xloc": [
4916 "default-mobile.handlebars->9->372",
4917 "default-mobile.handlebars->9->374",
4918 - "default.handlebars->27->854",
4919 - "default.handlebars->27->856"
4918 + "default.handlebars->27->856",
4919 + "default.handlebars->27->858"
4920 ]
4921 },
4922 {
@@ -4934,7 +4934,7 @@
4934 "zh-chs": "容量/速度",
4935 "xloc": [
4936 "default-mobile.handlebars->9->367",
4937 - "default.handlebars->27->849"
4937 + "default.handlebars->27->851"
4938 ]
4939 },
4940 {
@@ -4951,7 +4951,7 @@
4951 "ru": "Каталонский",
4952 "zh-chs": "加泰羅尼亞語",
4953 "xloc": [
4954 - "default.handlebars->27->930"
4954 + "default.handlebars->27->932"
4955 ]
4956 },
4957 {
@@ -4985,7 +4985,7 @@
4985 "ru": "Чаморро",
4986 "zh-chs": "查莫羅",
4987 "xloc": [
4988 - "default.handlebars->27->931"
4988 + "default.handlebars->27->933"
4989 ]
4990 },
4991 {
@@ -5016,7 +5016,7 @@
5016 "ru": "Смена email для {0}",
5017 "zh-chs": "更改{0}的電子郵件",
5018 "xloc": [
5019 - "default.handlebars->27->1657"
5019 + "default.handlebars->27->1659"
5020 ]
5021 },
5022 {
@@ -5034,8 +5034,8 @@
5034 "zh-chs": "變更組",
5035 "xloc": [
5036 "default.handlebars->27->549",
5037 - "default.handlebars->27->660",
5038 - "default.handlebars->27->661"
5037 + "default.handlebars->27->662",
5038 + "default.handlebars->27->663"
5039 ]
5040 },
5041 {
@@ -5053,8 +5053,8 @@
5053 "zh-chs": "更改密碼",
5054 "xloc": [
5055 "default-mobile.handlebars->9->90",
5056 - "default.handlebars->27->1125",
5057 - "default.handlebars->27->1646"
5056 + "default.handlebars->27->1127",
5057 + "default.handlebars->27->1648"
5058 ]
5059 },
5060 {
@@ -5071,7 +5071,7 @@
5071 "ru": "Смена пароля для {0}",
5072 "zh-chs": "更改{0}的密碼",
5073 "xloc": [
5074 - "default.handlebars->27->1664"
5074 + "default.handlebars->27->1666"
5075 ]
5076 },
5077 {
@@ -5141,7 +5141,7 @@
5141 "ru": "Изменить пароль для этого пользователя",
5142 "zh-chs": "更改該用戶的密碼",
5143 "xloc": [
5144 - "default.handlebars->27->1645"
5144 + "default.handlebars->27->1647"
5145 ]
5146 },
5147 {
@@ -5175,7 +5175,7 @@
5175 "ru": "Измените адрес электронной почты вашей учетной записи здесь.",
5176 "zh-chs": "在此處更改您的帳戶電子郵件地址。",
5177 "xloc": [
5178 - "default.handlebars->27->1112"
5178 + "default.handlebars->27->1114"
5179 ]
5180 },
5181 {
@@ -5192,7 +5192,7 @@
5192 "ru": "Измените пароль своей учетной записи, введя старый пароль и дважды новый пароль в поля ниже.",
5193 "zh-chs": "在下面的框中兩次輸入舊密碼和新密碼,以更改帳戶密碼。",
5194 "xloc": [
5195 - "default.handlebars->27->1118"
5195 + "default.handlebars->27->1120"
5196 ]
5197 },
5198 {
@@ -5209,7 +5209,7 @@
5209 "ru": "Изменение языка потребует перезагрузить страницу.",
5210 "zh-chs": "更改語言將需要刷新頁面。",
5211 "xloc": [
5212 - "default.handlebars->27->1097"
5212 + "default.handlebars->27->1099"
5213 ]
5214 },
5215 {
@@ -5226,10 +5226,10 @@
5226 "ru": "Чат",
5227 "zh-chs": "聊天室",
5228 "xloc": [
5229 - "default.handlebars->27->1432",
5230 - "default.handlebars->27->600",
5231 - "default.handlebars->27->619"
5232 - ]
5229 + "default.handlebars->27->1434",
5230 + "default.handlebars->27->602",
5231 + "default.handlebars->27->621"
5232 + ]
5233 },
5234 {
5235 "cs": "Chat a upozornění",
@@ -5247,8 +5247,8 @@
5247 "xloc": [
5248 "default-mobile.handlebars->9->411",
5249 "default-mobile.handlebars->9->429",
5250 - "default.handlebars->27->1294",
5251 - "default.handlebars->27->1328"
5250 + "default.handlebars->27->1296",
5251 + "default.handlebars->27->1330"
5252 ]
5253 },
5254 {
@@ -5265,7 +5265,7 @@
5265 "ru": "Чеченский",
5266 "zh-chs": "車臣",
5267 "xloc": [
5268 - "default.handlebars->27->932"
5268 + "default.handlebars->27->934"
5269 ]
5270 },
5271 {
@@ -5346,8 +5346,8 @@
5346 "ru": "Проверка...",
5347 "zh-chs": "檢查...",
5348 "xloc": [
5349 - "default.handlebars->27->1803",
5350 - "default.handlebars->27->898"
5349 + "default.handlebars->27->1805",
5350 + "default.handlebars->27->900"
5351 ]
5352 },
5353 {
@@ -5364,7 +5364,7 @@
5364 "ru": "Китайский",
5365 "zh-chs": "中文",
5366 "xloc": [
5367 - "default.handlebars->27->933"
5367 + "default.handlebars->27->935"
5368 ]
5369 },
5370 {
@@ -5381,7 +5381,7 @@
5381 "ru": "Китайский (Гонконг)",
5382 "zh-chs": "中文(香港)",
5383 "xloc": [
5384 - "default.handlebars->27->934"
5384 + "default.handlebars->27->936"
5385 ]
5386 },
5387 {
@@ -5398,7 +5398,7 @@
5398 "ru": "Китайский (КНР)",
5399 "zh-chs": "中文(中國)",
5400 "xloc": [
5401 - "default.handlebars->27->935"
5401 + "default.handlebars->27->937"
5402 ]
5403 },
5404 {
@@ -5415,7 +5415,7 @@
5415 "ru": "Упрощенный китайский)",
5416 "zh-chs": "简体中文)",
5417 "xloc": [
5418 - "default.handlebars->27->1095"
5418 + "default.handlebars->27->1097"
5419 ]
5420 },
5421 {
@@ -5432,7 +5432,7 @@
5432 "ru": "Китайский (Сингапур)",
5433 "zh-chs": "中文(新加坡)",
5434 "xloc": [
5435 - "default.handlebars->27->936"
5435 + "default.handlebars->27->938"
5436 ]
5437 },
5438 {
@@ -5449,7 +5449,7 @@
5449 "ru": "Китайский (Тайвань)",
5450 "zh-chs": "中文(台灣)",
5451 "xloc": [
5452 - "default.handlebars->27->937"
5452 + "default.handlebars->27->939"
5453 ]
5454 },
5455 {
@@ -5484,7 +5484,7 @@
5484 "ru": "Чувашский",
5485 "zh-chs": "楚瓦什",
5486 "xloc": [
5487 - "default.handlebars->27->938"
5487 + "default.handlebars->27->940"
5488 ]
5489 },
5490 {
@@ -5524,11 +5524,11 @@
5524 "default-mobile.handlebars->9->311",
5525 "default-mobile.handlebars->9->313",
5526 "default-mobile.handlebars->9->59",
5527 - "default.handlebars->27->1409",
5528 - "default.handlebars->27->779",
5527 + "default.handlebars->27->1411",
5528 "default.handlebars->27->781",
5529 "default.handlebars->27->783",
5530 "default.handlebars->27->785",
5531 + "default.handlebars->27->787",
5532 "default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->7",
5533 "default.handlebars->container->column_l->p41->3->1",
5534 "messenger.handlebars->xbottom"
@@ -5562,7 +5562,7 @@
5562 "nl": "Wis alle meldingen",
5563 "zh-chs": "全部清除",
5564 "xloc": [
5565 - "default.handlebars->27->1733"
5565 + "default.handlebars->27->1735"
5566 ]
5567 },
5568 {
@@ -5579,7 +5579,7 @@
5579 "ru": "Очистить ядро",
5580 "zh-chs": "清除核心",
5581 "xloc": [
5582 - "default.handlebars->27->870"
5582 + "default.handlebars->27->872"
5583 ]
5584 },
5585 {
@@ -5612,7 +5612,7 @@
5612 "ru": "Очистить это уведомление",
5613 "zh-chs": "清除此通知",
5614 "xloc": [
5615 - "default.handlebars->27->1732"
5615 + "default.handlebars->27->1734"
5616 ]
5617 },
5618 {
@@ -5657,8 +5657,8 @@
5657 "nl": "Klik hier om de apparaatgroepsnaam te bewerken",
5658 "zh-chs": "单击此处编辑设备组名称",
5659 "xloc": [
5660 - "default.handlebars->27->1160",
5661 - "default.handlebars->27->1365"
5660 + "default.handlebars->27->1162",
5661 + "default.handlebars->27->1367"
5662 ]
5663 },
5664 {
@@ -5688,7 +5688,7 @@
5688 "nl": "Klik hier om de gebruikersgroepsnaam te bewerken",
5689 "zh-chs": "单击此处编辑用户组名称",
5690 "xloc": [
5691 - "default.handlebars->27->1537"
5691 + "default.handlebars->27->1539"
5692 ]
5693 },
5694 {
@@ -5738,7 +5738,7 @@
5738 "zh-chs": "單擊確定將驗證郵件發送到:",
5739 "xloc": [
5740 "default-mobile.handlebars->9->75",
5741 - "default.handlebars->27->1109"
5741 + "default.handlebars->27->1111"
5742 ]
5743 },
5744 {
@@ -5773,7 +5773,7 @@
5773 "zh-chs": "客戶端控制模式(CCM)",
5774 "xloc": [
5775 "default-mobile.handlebars->9->345",
5776 - "default.handlebars->27->827"
5776 + "default.handlebars->27->829"
5777 ]
5778 },
5779 {
@@ -5790,8 +5790,8 @@
5790 "ru": "Клиент инициировал удаленный доступ",
5791 "zh-chs": "客戶端啟動的遠程訪問",
5792 "xloc": [
5793 - "default.handlebars->27->1231",
5794 - "default.handlebars->27->1236"
5793 + "default.handlebars->27->1233",
5794 + "default.handlebars->27->1238"
5795 ]
5796 },
5797 {
@@ -5828,7 +5828,7 @@
5828 "default-mobile.handlebars->9->57",
5829 "default.handlebars->27->121",
5830 "default.handlebars->27->129",
5831 - "default.handlebars->27->737"
5831 + "default.handlebars->27->739"
5832 ]
5833 },
5834 {
@@ -5863,8 +5863,8 @@
5863 "ru": "Общие группы устройств",
5864 "zh-chs": "通用設備組",
5865 "xloc": [
5866 - "default.handlebars->27->1556",
5867 - "default.handlebars->27->1669"
5866 + "default.handlebars->27->1558",
5867 + "default.handlebars->27->1671"
5868 ]
5869 },
5870 {
@@ -5881,8 +5881,8 @@
5881 "ru": "Общие устройства",
5882 "zh-chs": "通用設備",
5883 "xloc": [
5884 - "default.handlebars->27->1562",
5885 - "default.handlebars->27->1681"
5884 + "default.handlebars->27->1564",
5885 + "default.handlebars->27->1683"
5886 ]
5887 },
5888 {
@@ -5900,7 +5900,7 @@
5900 "zh-chs": "將{1}入口{2}中的{0}限製到此位置?",
5901 "xloc": [
5902 "default-mobile.handlebars->9->127",
5903 - "default.handlebars->27->1404"
5903 + "default.handlebars->27->1406"
5904 ]
5905 },
5906 {
@@ -5919,14 +5919,14 @@
5919 "xloc": [
5920 "default-mobile.handlebars->9->269",
5921 "default-mobile.handlebars->9->391",
5922 - "default.handlebars->27->1245",
5923 - "default.handlebars->27->1458",
5924 - "default.handlebars->27->1527",
5925 - "default.handlebars->27->1576",
5926 - "default.handlebars->27->1667",
5922 + "default.handlebars->27->1247",
5923 + "default.handlebars->27->1460",
5924 + "default.handlebars->27->1529",
5925 + "default.handlebars->27->1578",
5926 + "default.handlebars->27->1669",
5927 "default.handlebars->27->410",
5928 - "default.handlebars->27->655",
5929 - "default.handlebars->27->664"
5928 + "default.handlebars->27->657",
5929 + "default.handlebars->27->666"
5930 ]
5931 },
5932 {
@@ -5944,7 +5944,7 @@
5944 "zh-chs": "確認將1個副本複製到此位置?",
5945 "xloc": [
5946 "default-mobile.handlebars->9->302",
5947 - "default.handlebars->27->774"
5947 + "default.handlebars->27->776"
5948 ]
5949 },
5950 {
@@ -5962,7 +5962,7 @@
5962 "zh-chs": "確認{0}個條目的副本到此位置?",
5963 "xloc": [
5964 "default-mobile.handlebars->9->301",
5965 - "default.handlebars->27->773"
5965 + "default.handlebars->27->775"
5966 ]
5967 },
5968 {
@@ -5976,7 +5976,7 @@
5976 "nl": "Bevestig verwijdering geselecteerde account(s)?",
5977 "zh-chs": "确认删除选定的帐户?",
5978 "xloc": [
5979 - "default.handlebars->27->1457"
5979 + "default.handlebars->27->1459"
5980 ]
5981 },
5982 {
@@ -6007,7 +6007,7 @@
6007 "nl": "Bevestig verwijdering geselecteerde gebruikersgroep(en)?",
6008 "zh-chs": "确认删除选定的用户组?",
6009 "xloc": [
6010 - "default.handlebars->27->1526"
6010 + "default.handlebars->27->1528"
6011 ]
6012 },
6013 {
@@ -6024,7 +6024,7 @@
6024 "ru": "Подтвердить удаление пользователя {0}?",
6025 "zh-chs": "確認刪除用戶{0}?",
6026 "xloc": [
6027 - "default.handlebars->27->1666"
6027 + "default.handlebars->27->1668"
6028 ]
6029 },
6030 {
@@ -6038,7 +6038,7 @@
6038 "nl": "Bevestig lidmaatschap verwijderen van gebruiker \\\"{0}\\\"?",
6039 "zh-chs": "确认删除用户\\“ {0} \\”的成员身份?",
6040 "xloc": [
6041 - "default.handlebars->27->1579"
6041 + "default.handlebars->27->1581"
6042 ]
6043 },
6044 {
@@ -6052,7 +6052,7 @@
6052 "nl": "Bevestig lidmaatschap verwijdering van gebruikergroep \\\"{0}\\\"?",
6053 "zh-chs": "确认删除用户组 “{0}” 的成员身份?",
6054 "xloc": [
6055 - "default.handlebars->27->1696"
6055 + "default.handlebars->27->1698"
6056 ]
6057 },
6058 {
@@ -6070,7 +6070,7 @@
6070 "zh-chs": "確認將1個入口移動到此位置?",
6071 "xloc": [
6072 "default-mobile.handlebars->9->304",
6073 - "default.handlebars->27->776"
6073 + "default.handlebars->27->778"
6074 ]
6075 },
6076 {
@@ -6088,7 +6088,7 @@
6088 "zh-chs": "確認將{0}個條目移到此位置?",
6089 "xloc": [
6090 "default-mobile.handlebars->9->303",
6091 - "default.handlebars->27->775"
6091 + "default.handlebars->27->777"
6092 ]
6093 },
6094 {
@@ -6105,7 +6105,7 @@
6105 "ru": "Подтвердить перезапись?",
6106 "zh-chs": "確認覆蓋?",
6107 "xloc": [
6108 - "default.handlebars->27->1403"
6108 + "default.handlebars->27->1405"
6109 ]
6110 },
6111 {
@@ -6119,8 +6119,8 @@
6119 "nl": "Bevestig verwijdering van toegangsrechten voor apparaat \\\"{0}\\\"?",
6120 "zh-chs": "确认删除设备“ {0} ”的访问权限?",
6121 "xloc": [
6122 - "default.handlebars->27->1569",
6123 - "default.handlebars->27->1687"
6122 + "default.handlebars->27->1571",
6123 + "default.handlebars->27->1689"
6124 ]
6125 },
6126 {
@@ -6134,8 +6134,8 @@
6134 "nl": "Bevestig verwijdering van toegangsrechten voor apparaatgroep \\\"{0}\\\"?",
6135 "zh-chs": "是否确认删除设备组“ {0}”的访问权限?",
6136 "xloc": [
6137 - "default.handlebars->27->1571",
6138 - "default.handlebars->27->1700"
6137 + "default.handlebars->27->1573",
6138 + "default.handlebars->27->1702"
6139 ]
6140 },
6141 {
@@ -6149,7 +6149,7 @@
6149 "nl": "Bevestig verwijdering van toegangsrechten voor gebruiker \\\"{0}\\\"?",
6150 "zh-chs": "确认删除用户\\“ {0} \\”的访问权限?",
6151 "xloc": [
6152 - "default.handlebars->27->1689"
6152 + "default.handlebars->27->1691"
6153 ]
6154 },
6155 {
@@ -6163,7 +6163,7 @@
6163 "nl": "Bevestig verwijdering van toegangsrechten voor gebruikergroep \\\"{0}\\\"?",
6164 "zh-chs": "确认删除用户组“ {0}”的访问权限?",
6165 "xloc": [
6166 - "default.handlebars->27->1692"
6166 + "default.handlebars->27->1694"
6167 ]
6168 },
6169 {
@@ -6177,8 +6177,8 @@
6177 "nl": "Verwijdering van toegangsrechten bevestigen?",
6178 "zh-chs": "确认删除访问权限?",
6179 "xloc": [
6180 - "default.handlebars->27->1690",
6181 - "default.handlebars->27->1693"
6180 + "default.handlebars->27->1692",
6181 + "default.handlebars->27->1695"
6182 ]
6183 },
6184 {
@@ -6196,7 +6196,7 @@
6196 "zh-chs": "確認刪除身份驗證器應用程序兩步登錄?",
6197 "xloc": [
6198 "default-mobile.handlebars->9->74",
6199 - "default.handlebars->27->888"
6199 + "default.handlebars->27->890"
6200 ]
6201 },
6202 {
@@ -6251,7 +6251,7 @@
6251 "nl": "Bevestig de verwijdering van rechten voor gebruiker \\\"{0}\\\"?",
6252 "zh-chs": "确认删除用户“ {0} ”的权限?",
6253 "xloc": [
6254 - "default.handlebars->27->1337"
6254 + "default.handlebars->27->1339"
6255 ]
6256 },
6257 {
@@ -6265,7 +6265,7 @@
6265 "nl": "Bevestig de verwijdering van rechten voor de gebruikergroep \\\"{0}\\\"?",
6266 "zh-chs": "确认删除用户组“ {0} ”的权限?",
6267 "xloc": [
6268 - "default.handlebars->27->1339"
6268 + "default.handlebars->27->1341"
6269 ]
6270 },
6271 {
@@ -6313,8 +6313,8 @@
6313 "default-mobile.handlebars->9->284",
6314 "default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea1->1->3",
6315 "default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->0->1->3",
6316 - "default.handlebars->27->1184",
6317 - "default.handlebars->27->756",
6316 + "default.handlebars->27->1186",
6317 + "default.handlebars->27->758",
6318 "default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->connectbutton1span",
6319 "default.handlebars->container->column_l->p12->termTable->1->1->0->1->3->connectbutton2span",
6320 "default.handlebars->container->column_l->p13->p13toolbar->1->0->1->3",
@@ -6353,8 +6353,8 @@
6353 "ru": "Подключиться к серверу",
6354 "zh-chs": "連接到服務器",
6355 "xloc": [
6356 - "default.handlebars->27->1235",
6357 - "default.handlebars->27->1239"
6356 + "default.handlebars->27->1237",
6357 + "default.handlebars->27->1241"
6358 ]
6359 },
6360 {
@@ -6425,7 +6425,7 @@
6425 "ru": "Подключено Intel&reg; AMT",
6426 "zh-chs": "連接的英特爾&reg;AMT",
6427 "xloc": [
6428 - "default.handlebars->27->1751"
6428 + "default.handlebars->27->1753"
6429 ]
6430 },
6431 {
@@ -6442,7 +6442,7 @@
6442 "ru": "Подключенные пользователи",
6443 "zh-chs": "關聯用戶",
6444 "xloc": [
6445 - "default.handlebars->27->1756"
6445 + "default.handlebars->27->1758"
6446 ]
6447 },
6448 {
@@ -6460,7 +6460,7 @@
6460 "zh-chs": "現在已連接",
6461 "xloc": [
6462 "default-mobile.handlebars->9->324",
6463 - "default.handlebars->27->806"
6463 + "default.handlebars->27->808"
6464 ]
6465 },
6466 {
@@ -6500,7 +6500,7 @@
6500 "default.handlebars->27->206",
6501 "default.handlebars->27->209",
6502 "default.handlebars->27->228",
6503 - "default.handlebars->27->797",
6503 + "default.handlebars->27->799",
6504 "default.handlebars->27->9",
6505 "xterm.handlebars->9->2"
6506 ]
@@ -6519,7 +6519,7 @@
6519 "ru": "Подключений ",
6520 "zh-chs": "連接數",
6521 "xloc": [
6522 - "default.handlebars->27->1767"
6522 + "default.handlebars->27->1769"
6523 ]
6524 },
6525 {
@@ -6536,7 +6536,7 @@
6536 "ru": "Ретранслятор подключения",
6537 "zh-chs": "連接繼電器",
6538 "xloc": [
6539 - "default.handlebars->27->1795"
6539 + "default.handlebars->27->1797"
6540 ]
6541 },
6542 {
@@ -6588,7 +6588,7 @@
6588 "zh-chs": "連接性",
6589 "xloc": [
6590 "default-mobile.handlebars->9->237",
6591 - "default.handlebars->27->1372",
6591 + "default.handlebars->27->1374",
6592 "default.handlebars->27->197",
6593 "default.handlebars->27->538",
6594 "default.handlebars->container->column_l->p21->3->1->meshConnChartDiv->1"
@@ -6608,8 +6608,8 @@
6608 "ru": "Консоль",
6609 "zh-chs": "安慰",
6610 "xloc": [
6611 - "default.handlebars->27->595",
6612 - "default.handlebars->27->614",
6611 + "default.handlebars->27->597",
6612 + "default.handlebars->27->616",
6613 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevConsole",
6614 "default.handlebars->container->topbar->1->1->ServerSubMenuSpan->ServerSubMenu->1->0->ServerConsole",
6615 "default.handlebars->contextMenu->cxconsole"
@@ -6645,8 +6645,8 @@
6645 "ru": "контроль",
6646 "zh-chs": "控制",
6647 "xloc": [
6648 - "default.handlebars->27->594",
6649 - "default.handlebars->27->613"
6648 + "default.handlebars->27->596",
6649 + "default.handlebars->27->615"
6650 ]
6651 },
6652 {
@@ -6663,7 +6663,7 @@
6663 "ru": "Cookie-кодировщик",
6664 "zh-chs": "Cookie編碼器",
6665 "xloc": [
6666 - "default.handlebars->27->1781"
6666 + "default.handlebars->27->1783"
6667 ]
6668 },
6669 {
@@ -6789,8 +6789,8 @@
6789 "ru": "Скопировать ссылку в буфер обмена",
6790 "zh-chs": "複製鏈接到剪貼板",
6791 "xloc": [
6792 - "default.handlebars->27->1377",
6793 - "default.handlebars->27->1391",
6792 + "default.handlebars->27->1379",
6793 + "default.handlebars->27->1393",
6794 "default.handlebars->27->323"
6795 ]
6796 },
@@ -6968,7 +6968,7 @@
6968 "ru": "Основной сервер",
6969 "zh-chs": "核心服務器",
6970 "xloc": [
6971 - "default.handlebars->27->1780"
6971 + "default.handlebars->27->1782"
6972 ]
6973 },
6974 {
@@ -6985,7 +6985,7 @@
6985 "ru": "Kорсиканский",
6986 "zh-chs": "科西嘉人",
6987 "xloc": [
6988 - "default.handlebars->27->939"
6988 + "default.handlebars->27->941"
6989 ]
6990 },
6991 {
@@ -7002,7 +7002,7 @@
7002 "ru": "Создать учетную запись",
7003 "zh-chs": "創建帳號",
7004 "xloc": [
7005 - "default.handlebars->27->1497",
7005 + "default.handlebars->27->1499",
7006 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->createpanel->1->1->9->1->12->1->1",
7007 "login.handlebars->container->column_l->centralTable->1->0->logincell->createpanel->1->9->1->12->1->1"
7008 ]
@@ -7038,7 +7038,7 @@
7038 "ru": "Создать группу пользователей",
7039 "zh-chs": "創建用戶組",
7040 "xloc": [
7041 - "default.handlebars->27->1534"
7041 + "default.handlebars->27->1536"
7042 ]
7043 },
7044 {
@@ -7055,7 +7055,7 @@
7055 "ru": "Создайте новую группу устройств, используя параметры ниже.",
7056 "zh-chs": "使用以下選項創建一個新的設備組。",
7057 "xloc": [
7058 - "default.handlebars->27->1132"
7058 + "default.handlebars->27->1134"
7059 ]
7060 },
7061 {
@@ -7089,7 +7089,7 @@
7089 "ru": "Создайте сразу несколько учетных записей, импортировав файл JSON в следующем формате:",
7090 "zh-chs": "通過導入以下格式的JSON文件一次創建多個帳戶:",
7091 "xloc": [
7092 - "default.handlebars->27->1465"
7092 + "default.handlebars->27->1467"
7093 ]
7094 },
7095 {
@@ -7124,7 +7124,7 @@
7124 "ru": "Создано",
7125 "zh-chs": "創建",
7126 "xloc": [
7127 - "default.handlebars->27->1605"
7127 + "default.handlebars->27->1607"
7128 ]
7129 },
7130 {
@@ -7159,7 +7159,7 @@
7159 "ru": "Кри (Канадский язык)",
7160 "zh-chs": "克里",
7161 "xloc": [
7162 - "default.handlebars->27->940"
7162 + "default.handlebars->27->942"
7163 ]
7164 },
7165 {
@@ -7176,7 +7176,7 @@
7176 "ru": "Хорватский",
7177 "zh-chs": "克羅地亞語",
7178 "xloc": [
7179 - "default.handlebars->27->941"
7179 + "default.handlebars->27->943"
7180 ]
7181 },
7182 {
@@ -7317,7 +7317,7 @@
7317 "ru": "Чешский",
7318 "zh-chs": "捷克文",
7319 "xloc": [
7320 - "default.handlebars->27->942"
7320 + "default.handlebars->27->944"
7321 ]
7322 },
7323 {
@@ -7351,7 +7351,7 @@
7351 "ru": "Датский",
7352 "zh-chs": "丹麥文",
7353 "xloc": [
7354 - "default.handlebars->27->943"
7354 + "default.handlebars->27->945"
7355 ]
7356 },
7357 {
@@ -7368,7 +7368,7 @@
7368 "ru": "DataChannel",
7369 "zh-chs": "數據通道",
7370 "xloc": [
7371 - "default.handlebars->27->707"
7371 + "default.handlebars->27->709"
7372 ]
7373 },
7374 {
@@ -7385,7 +7385,7 @@
7385 "ru": "Дата & Время",
7386 "zh-chs": "日期和時間",
7387 "xloc": [
7388 - "default.handlebars->27->1100"
7388 + "default.handlebars->27->1102"
7389 ]
7390 },
7391 {
@@ -7403,7 +7403,7 @@
7403 "zh-chs": "天",
7404 "xloc": [
7405 "default-mobile.handlebars->9->259",
7406 - "default.handlebars->27->639"
7406 + "default.handlebars->27->641"
7407 ]
7408 },
7409 {
@@ -7420,7 +7420,7 @@
7420 "ru": "Деактивировать режим управления клиентом (CCM)",
7421 "zh-chs": "停用客戶端控制模式(CCM)",
7422 "xloc": [
7423 - "default.handlebars->27->1223"
7423 + "default.handlebars->27->1225"
7424 ]
7425 },
7426 {
@@ -7445,10 +7445,10 @@
7445 "en": "Default",
7446 "nl": "Standaard",
7447 "xloc": [
7448 - "default.handlebars->27->1484",
7449 - "default.handlebars->27->1530",
7450 - "default.handlebars->27->1541",
7451 - "default.handlebars->27->1596"
7448 + "default.handlebars->27->1486",
7449 + "default.handlebars->27->1532",
7450 + "default.handlebars->27->1543",
7451 + "default.handlebars->27->1598"
7452 ]
7453 },
7454 {
@@ -7469,9 +7469,9 @@
7469 "default-mobile.handlebars->9->294",
7470 "default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->2->1->1",
7471 "default-mobile.handlebars->container->page_content->column_l->p5->p5myfiles->p5toolbar->1->0->1->1",
7472 - "default.handlebars->27->1398",
7472 + "default.handlebars->27->1400",
7473 "default.handlebars->27->442",
7474 - "default.handlebars->27->766",
7474 + "default.handlebars->27->768",
7475 "default.handlebars->container->column_l->p13->p13toolbar->1->2->1->3",
7476 "default.handlebars->container->column_l->p5->p5toolbar->1->0->p5filehead->3",
7477 "default.handlebars->container->dialog->idx_dlgButtonBar->5",
@@ -7495,7 +7495,7 @@
7495 "zh-chs": "刪除帳戶",
7496 "xloc": [
7497 "default-mobile.handlebars->9->84",
7498 - "default.handlebars->27->1117"
7498 + "default.handlebars->27->1119"
7499 ]
7500 },
7501 {
@@ -7509,7 +7509,7 @@
7509 "nl": "Verwijder accounts",
7510 "zh-chs": "删除帐号",
7511 "xloc": [
7512 - "default.handlebars->27->1459"
7512 + "default.handlebars->27->1461"
7513 ]
7514 },
7515 {
@@ -7546,8 +7546,8 @@
7546 "xloc": [
7547 "default-mobile.handlebars->9->389",
7548 "default-mobile.handlebars->9->392",
7549 - "default.handlebars->27->1216",
7550 - "default.handlebars->27->1246"
7549 + "default.handlebars->27->1218",
7550 + "default.handlebars->27->1248"
7551 ]
7552 },
7553 {
@@ -7565,7 +7565,7 @@
7565 "zh-chs": "刪除節點",
7566 "xloc": [
7567 "default-mobile.handlebars->9->267",
7568 - "default.handlebars->27->665"
7568 + "default.handlebars->27->667"
7569 ]
7570 },
7571 {
@@ -7599,7 +7599,7 @@
7599 "ru": "Удалить пользователя",
7600 "zh-chs": "刪除用戶",
7601 "xloc": [
7602 - "default.handlebars->27->1644"
7602 + "default.handlebars->27->1646"
7603 ]
7604 },
7605 {
@@ -7616,8 +7616,8 @@
7616 "ru": "Удалить группу пользователей",
7617 "zh-chs": "刪除用戶組",
7618 "xloc": [
7619 - "default.handlebars->27->1567",
7620 - "default.handlebars->27->1577"
7619 + "default.handlebars->27->1569",
7620 + "default.handlebars->27->1579"
7621 ]
7622 },
7623 {
@@ -7631,7 +7631,7 @@
7631 "nl": "Gebruikersgroepen verwijderen",
7632 "zh-chs": "删除用户组",
7633 "xloc": [
7634 - "default.handlebars->27->1528"
7634 + "default.handlebars->27->1530"
7635 ]
7636 },
7637 {
@@ -7648,7 +7648,7 @@
7648 "ru": "Удалить пользователя {0}",
7649 "zh-chs": "刪除用戶{0}",
7650 "xloc": [
7651 - "default.handlebars->27->1665"
7651 + "default.handlebars->27->1667"
7652 ]
7653 },
7654 {
@@ -7666,7 +7666,7 @@
7666 "zh-chs": "刪除帳戶",
7667 "xloc": [
7668 "default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->p3AccountActions->p2AccountActions->3->9->0",
7669 - "default.handlebars->27->1455",
7669 + "default.handlebars->27->1457",
7670 "default.handlebars->container->column_l->p2->p2info->p2AccountActions->3->p2AccountPassActions->7"
7671 ]
7672 },
@@ -7698,7 +7698,7 @@
7698 "nl": "Verwijder groep",
7699 "zh-chs": "删除群组",
7700 "xloc": [
7701 - "default.handlebars->27->1524"
7701 + "default.handlebars->27->1526"
7702 ]
7703 },
7704 {
@@ -7734,8 +7734,8 @@
7734 "xloc": [
7735 "default-mobile.handlebars->9->124",
7736 "default-mobile.handlebars->9->296",
7737 - "default.handlebars->27->1400",
7738 - "default.handlebars->27->768"
7737 + "default.handlebars->27->1402",
7738 + "default.handlebars->27->770"
7739 ]
7740 },
7741 {
@@ -7752,7 +7752,7 @@
7752 "ru": "Удалить группу пользователей {0}?",
7753 "zh-chs": "刪除用戶組{0}?",
7754 "xloc": [
7755 - "default.handlebars->27->1575"
7755 + "default.handlebars->27->1577"
7756 ]
7757 },
7758 {
@@ -7771,8 +7771,8 @@
7771 "xloc": [
7772 "default-mobile.handlebars->9->123",
7773 "default-mobile.handlebars->9->295",
7774 - "default.handlebars->27->1399",
7775 - "default.handlebars->27->767"
7774 + "default.handlebars->27->1401",
7775 + "default.handlebars->27->769"
7776 ]
7777 },
7778 {
@@ -7802,7 +7802,7 @@
7802 "ko": "거부",
7803 "zh-chs": "被拒绝",
7804 "xloc": [
7805 - "default.handlebars->27->703"
7805 + "default.handlebars->27->705"
7806 ]
7807 },
7808 {
@@ -7886,18 +7886,18 @@
7886 "default-mobile.handlebars->9->330",
7887 "default-mobile.handlebars->9->381",
7888 "default-mobile.handlebars->9->394",
7889 - "default.handlebars->27->1137",
7890 - "default.handlebars->27->1165",
7891 - "default.handlebars->27->1248",
7892 - "default.handlebars->27->1533",
7893 - "default.handlebars->27->1543",
7894 - "default.handlebars->27->1544",
7895 - "default.handlebars->27->1573",
7889 + "default.handlebars->27->1139",
7890 + "default.handlebars->27->1167",
7891 + "default.handlebars->27->1250",
7892 + "default.handlebars->27->1535",
7893 + "default.handlebars->27->1545",
7894 + "default.handlebars->27->1546",
7895 + "default.handlebars->27->1575",
7896 "default.handlebars->27->483",
7897 "default.handlebars->27->484",
7898 - "default.handlebars->27->698",
7898 + "default.handlebars->27->700",
7899 "default.handlebars->27->78",
7900 - "default.handlebars->27->812",
7900 + "default.handlebars->27->814",
7901 "default.handlebars->container->column_l->p42->p42tbl->1->0->3"
7902 ]
7903 },
@@ -7930,8 +7930,8 @@
7930 "zh-chs": "桌面",
7931 "xloc": [
7932 "default-mobile.handlebars->9->249",
7933 - "default.handlebars->27->1253",
7934 - "default.handlebars->27->1710",
7933 + "default.handlebars->27->1255",
7934 + "default.handlebars->27->1712",
7935 "default.handlebars->27->448",
7936 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevDesktop",
7937 "default.handlebars->contextMenu->cxdesktop"
@@ -7968,8 +7968,8 @@
7968 "ru": "Уведомление на рабочем столе",
7969 "zh-chs": "桌面通知",
7970 "xloc": [
7971 - "default.handlebars->27->1175",
7972 - "default.handlebars->27->1620",
7971 + "default.handlebars->27->1177",
7972 + "default.handlebars->27->1622",
7973 "default.handlebars->27->519"
7974 ]
7975 },
@@ -7987,8 +7987,8 @@
7987 "ru": "Запрос рабочего стола",
7988 "zh-chs": "桌面提示",
7989 "xloc": [
7990 - "default.handlebars->27->1174",
7991 - "default.handlebars->27->1619",
7990 + "default.handlebars->27->1176",
7991 + "default.handlebars->27->1621",
7992 "default.handlebars->27->518"
7993 ]
7994 },
@@ -8006,8 +8006,8 @@
8006 "ru": "Запрос рабочего стола + панель инструментов",
8007 "zh-chs": "桌面提示+工具欄",
8008 "xloc": [
8009 - "default.handlebars->27->1172",
8010 - "default.handlebars->27->1617",
8009 + "default.handlebars->27->1174",
8010 + "default.handlebars->27->1619",
8011 "default.handlebars->27->516"
8012 ]
8013 },
@@ -8039,8 +8039,8 @@
8039 "ru": "Панель инструментов рабочего стола",
8040 "zh-chs": "桌面工具欄",
8041 "xloc": [
8042 - "default.handlebars->27->1173",
8043 - "default.handlebars->27->1618",
8042 + "default.handlebars->27->1175",
8043 + "default.handlebars->27->1620",
8044 "default.handlebars->27->517"
8045 ]
8046 },
@@ -8112,8 +8112,8 @@
8112 "ru": "Устройство",
8113 "zh-chs": "設備",
8114 "xloc": [
8115 - "default.handlebars->27->1275",
8116 - "default.handlebars->27->1684",
8115 + "default.handlebars->27->1277",
8116 + "default.handlebars->27->1686",
8117 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSort->sortselect->5"
8118 ]
8119 },
@@ -8132,7 +8132,7 @@
8132 "zh-chs": "設備動作",
8133 "xloc": [
8134 "default-mobile.handlebars->9->258",
8135 - "default.handlebars->27->638"
8135 + "default.handlebars->27->640"
8136 ]
8137 },
8138 {
@@ -8149,13 +8149,13 @@
8149 "ru": "Группа устройства",
8150 "zh-chs": "設備組",
8151 "xloc": [
8152 - "default.handlebars->27->1270",
8153 - "default.handlebars->27->1273",
8154 - "default.handlebars->27->1274",
8155 - "default.handlebars->27->1559",
8156 - "default.handlebars->27->1565",
8157 - "default.handlebars->27->1672",
8158 - "default.handlebars->27->1719"
8152 + "default.handlebars->27->1272",
8153 + "default.handlebars->27->1275",
8154 + "default.handlebars->27->1276",
8155 + "default.handlebars->27->1561",
8156 + "default.handlebars->27->1567",
8157 + "default.handlebars->27->1674",
8158 + "default.handlebars->27->1721"
8159 ]
8160 },
8161 {
@@ -8173,7 +8173,7 @@
8173 "zh-chs": "設備組用戶",
8174 "xloc": [
8175 "default-mobile.handlebars->9->436",
8176 - "default.handlebars->27->1335"
8176 + "default.handlebars->27->1337"
8177 ]
8178 },
8179 {
@@ -8191,11 +8191,11 @@
8191 "zh-chs": "設備組",
8192 "xloc": [
8193 "default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->3",
8194 - "default.handlebars->27->1424",
8195 - "default.handlebars->27->1518",
8196 - "default.handlebars->27->1546",
8197 - "default.handlebars->27->1614",
8198 - "default.handlebars->27->1754",
8194 + "default.handlebars->27->1426",
8195 + "default.handlebars->27->1520",
8196 + "default.handlebars->27->1548",
8197 + "default.handlebars->27->1616",
8198 + "default.handlebars->27->1756",
8199 "default.handlebars->container->column_l->p2->p2info->7"
8200 ]
8201 },
@@ -8230,7 +8230,7 @@
8230 "ru": "Местонахождение устройства",
8231 "zh-chs": "設備位置",
8232 "xloc": [
8233 - "default.handlebars->27->666"
8233 + "default.handlebars->27->668"
8234 ]
8235 },
8236 {
@@ -8238,7 +8238,7 @@
8238 "nl": "Apparaatbericht",
8239 "fr": "Message de Service\r\n",
8240 "xloc": [
8241 - "default.handlebars->27->627"
8241 + "default.handlebars->27->629"
8242 ]
8243 },
8244 {
@@ -8256,9 +8256,9 @@
8256 "zh-chs": "設備名稱",
8257 "xloc": [
8258 "default-mobile.handlebars->9->271",
8259 - "default.handlebars->27->1718",
8259 + "default.handlebars->27->1720",
8260 "default.handlebars->27->246",
8261 - "default.handlebars->27->696",
8261 + "default.handlebars->27->698",
8262 "player.handlebars->3->9"
8263 ]
8264 },
@@ -8276,7 +8276,7 @@
8276 "ru": "Уведомление устройства",
8277 "zh-chs": "設備通知",
8278 "xloc": [
8279 - "default.handlebars->27->629"
8279 + "default.handlebars->27->631"
8280 ]
8281 },
8282 {
@@ -8310,8 +8310,8 @@
8310 "ru": "Подключения устройств.",
8311 "zh-chs": "設備連接。",
8312 "xloc": [
8313 - "default.handlebars->27->1105",
8314 - "default.handlebars->27->1356"
8313 + "default.handlebars->27->1107",
8314 + "default.handlebars->27->1358"
8315 ]
8316 },
8317 {
@@ -8328,8 +8328,8 @@
8328 "ru": "Отключения устройств.",
8329 "zh-chs": "設備斷開連接。",
8330 "xloc": [
8331 - "default.handlebars->27->1106",
8332 - "default.handlebars->27->1357"
8331 + "default.handlebars->27->1108",
8332 + "default.handlebars->27->1359"
8333 ]
8334 },
8335 {
@@ -8346,7 +8346,7 @@
8346 "ru": "Примечания могут быть просмотрены и изменены другими администраторами.",
8347 "zh-chs": "其他設備組管理員可以查看和更改設備組註釋。",
8348 "xloc": [
8349 - "default.handlebars->27->625"
8349 + "default.handlebars->27->627"
8350 ]
8351 },
8352 {
@@ -8656,8 +8656,8 @@
8656 "nl": "Apparaten",
8657 "zh-chs": "设备",
8658 "xloc": [
8659 - "default.handlebars->27->1519",
8660 - "default.handlebars->27->1547"
8659 + "default.handlebars->27->1521",
8660 + "default.handlebars->27->1549"
8661 ]
8662 },
8663 {
@@ -8693,8 +8693,8 @@
8693 "xloc": [
8694 "default-mobile.handlebars->9->285",
8695 "default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea1->1->3",
8696 - "default.handlebars->27->1185",
8697 - "default.handlebars->27->757",
8696 + "default.handlebars->27->1187",
8697 + "default.handlebars->27->759",
8698 "default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->disconnectbutton1span",
8699 "default.handlebars->container->column_l->p12->termTable->1->1->0->1->3->disconnectbutton2span",
8700 "xterm.handlebars->p11->deskarea0->deskarea1->3"
@@ -8750,7 +8750,7 @@
8750 "nl": "Geef een berichtvenster weer op het externe apparaat.",
8751 "fr": "Afficher un message sur le poste distant",
8752 "xloc": [
8753 - "default.handlebars->27->628"
8753 + "default.handlebars->27->630"
8754 ]
8755 },
8756 {
@@ -8792,7 +8792,7 @@
8792 "ru": "Отобразить имя группы устройств",
8793 "zh-chs": "顯示設備組名稱",
8794 "xloc": [
8795 - "default.handlebars->27->1104"
8795 + "default.handlebars->27->1106"
8796 ]
8797 },
8798 {
@@ -8809,7 +8809,7 @@
8809 "ru": "Отображаемое имя",
8810 "zh-chs": "顯示名稱",
8811 "xloc": [
8812 - "default.handlebars->27->728"
8812 + "default.handlebars->27->730"
8813 ]
8814 },
8815 {
@@ -8825,7 +8825,7 @@
8825 "ru": "Показать публичную ссылку",
8826 "zh-chs": "显示公共链接",
8827 "xloc": [
8828 - "default.handlebars->27->1376"
8828 + "default.handlebars->27->1378"
8829 ]
8830 },
8831 {
@@ -8842,17 +8842,17 @@
8842 "ru": "Ничего не делать",
8843 "zh-chs": "沒做什麼",
8844 "xloc": [
8845 - "default.handlebars->27->1229"
8845 + "default.handlebars->27->1231"
8846 ]
8847 },
8848 {
8849 "en": "Domain",
8850 "nl": "Domein",
8851 "xloc": [
8852 - "default.handlebars->27->1485",
8853 - "default.handlebars->27->1531",
8854 - "default.handlebars->27->1540",
8855 - "default.handlebars->27->1595"
8852 + "default.handlebars->27->1487",
8853 + "default.handlebars->27->1533",
8854 + "default.handlebars->27->1542",
8855 + "default.handlebars->27->1597"
8856 ]
8857 },
8858 {
@@ -8865,8 +8865,8 @@
8865 "nl": "Niet configureren",
8866 "zh-chs": "不要配置",
8867 "xloc": [
8868 - "default.handlebars->27->1233",
8869 - "default.handlebars->27->1238"
8868 + "default.handlebars->27->1235",
8869 + "default.handlebars->27->1240"
8870 ]
8871 },
8872 {
@@ -8879,7 +8879,7 @@
8879 "nl": "Maak geen verbinding met de server",
8880 "zh-chs": "不要连接到服务器",
8881 "xloc": [
8882 - "default.handlebars->27->1234"
8882 + "default.handlebars->27->1236"
8883 ]
8884 },
8885 {
@@ -8979,7 +8979,7 @@
8979 "zh-chs": "下載文件",
8980 "xloc": [
8981 "default-mobile.handlebars->9->315",
8982 - "default.handlebars->27->786"
8982 + "default.handlebars->27->788"
8983 ]
8984 },
8985 {
@@ -9013,7 +9013,7 @@
9013 "ru": "Скачать MeshCmd",
9014 "zh-chs": "下載MeshCmd",
9015 "xloc": [
9016 - "default.handlebars->27->688"
9016 + "default.handlebars->27->690"
9017 ]
9018 },
9019 {
@@ -9064,7 +9064,7 @@
9064 "ru": "Скачайте \\\"meshcmd\\\" с файлом команд для маршрутизации трафика к этому устройству через сервер. Не забудьте указать пароль от своей учетной записи в meshaction.txt и сделать другие правки при необходимости.",
9065 "zh-chs": "下載帶有動作文件的“ meshcmd”,以將通過此服務器的流量路由到該設備。確保編輯meshaction.txt並添加您的帳戶密碼或進行任何必要的更改。",
9066 "xloc": [
9067 - "default.handlebars->27->681"
9067 + "default.handlebars->27->683"
9068 ]
9069 },
9070 {
@@ -9132,7 +9132,7 @@
9132 "ru": "Скачать события состояния питания",
9133 "zh-chs": "下載電源事件",
9134 "xloc": [
9135 - "default.handlebars->27->640"
9135 + "default.handlebars->27->642"
9136 ]
9137 },
9138 {
@@ -9200,7 +9200,7 @@
9200 "ru": "Скачать список событий в одном из форматов ниже.",
9201 "zh-chs": "使用以下一種文件格式下載事件列表。",
9202 "xloc": [
9203 - "default.handlebars->27->1414"
9203 + "default.handlebars->27->1416"
9204 ]
9205 },
9206 {
@@ -9217,7 +9217,7 @@
9217 "ru": "Скачать список пользователей в одном из форматов ниже.",
9218 "zh-chs": "使用以下一種文件格式下載用戶列表。",
9219 "xloc": [
9220 - "default.handlebars->27->1473"
9220 + "default.handlebars->27->1475"
9221 ]
9222 },
9223 {
@@ -9300,7 +9300,7 @@
9300 "nl": "Dubbele agent",
9301 "zh-chs": "代理重复",
9302 "xloc": [
9303 - "default.handlebars->27->1750"
9303 + "default.handlebars->27->1752"
9304 ]
9305 },
9306 {
@@ -9334,7 +9334,7 @@
9334 "ru": "Скопировать группу пользователей",
9335 "zh-chs": "重複的用戶組",
9336 "xloc": [
9337 - "default.handlebars->27->1535"
9337 + "default.handlebars->27->1537"
9338 ]
9339 },
9340 {
@@ -9365,8 +9365,8 @@
9365 "ru": "Длительность",
9366 "zh-chs": "持續時間",
9367 "xloc": [
9368 - "default.handlebars->27->1704",
9369 - "default.handlebars->27->1724",
9368 + "default.handlebars->27->1706",
9369 + "default.handlebars->27->1726",
9370 "player.handlebars->3->2"
9371 ]
9372 },
@@ -9384,7 +9384,7 @@
9384 "ru": "Во время активации агент будет иметь доступ к паролю администратора.",
9385 "zh-chs": "在激活期間,代理將有權訪問管理員密碼信息。",
9386 "xloc": [
9387 - "default.handlebars->27->1243"
9387 + "default.handlebars->27->1245"
9388 ]
9389 },
9390 {
@@ -9401,7 +9401,7 @@
9401 "ru": "Голландский (Бельгийский)",
9402 "zh-chs": "荷蘭語(比利時)",
9403 "xloc": [
9404 - "default.handlebars->27->945"
9404 + "default.handlebars->27->947"
9405 ]
9406 },
9407 {
@@ -9418,7 +9418,7 @@
9418 "ru": "Голландский (Стандартный)",
9419 "zh-chs": "荷蘭語(標準)",
9420 "xloc": [
9421 - "default.handlebars->27->944"
9421 + "default.handlebars->27->946"
9422 ]
9423 },
9424 {
@@ -9609,7 +9609,7 @@
9609 "zh-chs": "編輯裝置",
9610 "xloc": [
9611 "default-mobile.handlebars->9->276",
9612 - "default.handlebars->27->701"
9612 + "default.handlebars->27->703"
9613 ]
9614 },
9615 {
@@ -9629,11 +9629,11 @@
9629 "default-mobile.handlebars->9->395",
9630 "default-mobile.handlebars->9->397",
9631 "default-mobile.handlebars->9->415",
9632 - "default.handlebars->27->1249",
9633 - "default.handlebars->27->1279",
9634 - "default.handlebars->27->1301",
9635 - "default.handlebars->27->1313"
9636 - ]
9632 + "default.handlebars->27->1251",
9633 + "default.handlebars->27->1281",
9634 + "default.handlebars->27->1303",
9635 + "default.handlebars->27->1315"
9636 + ]
9637 },
9638 {
9639 "cs": "Upravit vlastnosti skupiny zařízení",
@@ -9649,7 +9649,7 @@
9649 "ru": "Редактировать функции группы устройств",
9650 "zh-chs": "編輯設備組功能",
9651 "xloc": [
9652 - "default.handlebars->27->1265"
9652 + "default.handlebars->27->1267"
9653 ]
9654 },
9655 {
@@ -9666,8 +9666,8 @@
9666 "ru": "Редактировать права группы устройств",
9667 "zh-chs": "編輯設備組權限",
9668 "xloc": [
9669 - "default.handlebars->27->1298",
9670 - "default.handlebars->27->1310"
9669 + "default.handlebars->27->1300",
9670 + "default.handlebars->27->1312"
9671 ]
9672 },
9673 {
@@ -9684,7 +9684,7 @@
9684 "ru": "Редактировать согласие пользователя группы устройств",
9685 "zh-chs": "編輯設備組用戶同意",
9686 "xloc": [
9687 - "default.handlebars->27->1250"
9687 + "default.handlebars->27->1252"
9688 ]
9689 },
9690 {
@@ -9702,7 +9702,7 @@
9702 "zh-chs": "編輯設備說明",
9703 "xloc": [
9704 "default-mobile.handlebars->9->409",
9705 - "default.handlebars->27->1292"
9705 + "default.handlebars->27->1294"
9706 ]
9707 },
9708 {
@@ -9718,8 +9718,8 @@
9718 "ru": "Изменить разрешения устройства",
9719 "zh-chs": "编辑设备权限",
9720 "xloc": [
9721 - "default.handlebars->27->1303",
9722 - "default.handlebars->27->1305"
9721 + "default.handlebars->27->1305",
9722 + "default.handlebars->27->1307"
9723 ]
9724 },
9725 {
@@ -9733,7 +9733,7 @@
9733 "nl": "Gebruikerstoestemming apparaat bewerken",
9734 "zh-chs": "编辑设备用户同意",
9735 "xloc": [
9736 - "default.handlebars->27->1252"
9736 + "default.handlebars->27->1254"
9737 ]
9738 },
9739 {
@@ -9749,7 +9749,7 @@
9749 "ru": "Редактировать группу",
9750 "zh-chs": "编辑组",
9751 "xloc": [
9752 - "default.handlebars->27->604"
9752 + "default.handlebars->27->606"
9753 ]
9754 },
9755 {
@@ -9769,7 +9769,7 @@
9769 "default-mobile.handlebars->9->266",
9770 "default.handlebars->27->498",
9771 "default.handlebars->27->501",
9772 - "default.handlebars->27->647"
9772 + "default.handlebars->27->649"
9773 ]
9774 },
9775 {
@@ -9787,7 +9787,7 @@
9787 "zh-chs": "編輯筆記",
9788 "xloc": [
9789 "default-mobile.handlebars->9->422",
9790 - "default.handlebars->27->1320"
9790 + "default.handlebars->27->1322"
9791 ]
9792 },
9793 {
@@ -9801,7 +9801,7 @@
9801 "nl": "Gebruikerstoestemming bewerken",
9802 "zh-chs": "编辑用户同意",
9803 "xloc": [
9804 - "default.handlebars->27->1251"
9804 + "default.handlebars->27->1253"
9805 ]
9806 },
9807 {
@@ -9818,7 +9818,7 @@
9818 "ru": "Редактировать права пользователя для группы устройств",
9819 "zh-chs": "編輯用戶設備組權限",
9820 "xloc": [
9821 - "default.handlebars->27->1311"
9821 + "default.handlebars->27->1313"
9822 ]
9823 },
9824 {
@@ -9834,7 +9834,7 @@
9834 "ru": "Изменить разрешения для пользовательских устройств",
9835 "zh-chs": "编辑用户设备权限",
9836 "xloc": [
9837 - "default.handlebars->27->1306"
9837 + "default.handlebars->27->1308"
9838 ]
9839 },
9840 {
@@ -9851,7 +9851,7 @@
9851 "ru": "Редактировать группу пользователей",
9852 "zh-chs": "編輯用戶組",
9853 "xloc": [
9854 - "default.handlebars->27->1574"
9854 + "default.handlebars->27->1576"
9855 ]
9856 },
9857 {
@@ -9865,7 +9865,7 @@
9865 "nl": "Gebruikersmachtigingen voor apparaatgroep bewerken",
9866 "zh-chs": "编辑用户组设备权限",
9867 "xloc": [
9868 - "default.handlebars->27->1308"
9868 + "default.handlebars->27->1310"
9869 ]
9870 },
9871 {
@@ -9900,11 +9900,11 @@
9900 "zh-chs": "電子郵件",
9901 "xloc": [
9902 "default-mobile.handlebars->9->78",
9903 - "default.handlebars->27->1487",
9904 - "default.handlebars->27->1599",
9905 - "default.handlebars->27->1600",
9906 - "default.handlebars->27->1639",
9907 - "default.handlebars->27->1653",
9903 + "default.handlebars->27->1489",
9904 + "default.handlebars->27->1601",
9905 + "default.handlebars->27->1602",
9906 + "default.handlebars->27->1641",
9907 + "default.handlebars->27->1655",
9908 "default.handlebars->27->294",
9909 "login-mobile.handlebars->5->42",
9910 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3",
@@ -9927,7 +9927,7 @@
9927 "zh-chs": "電郵地址變更",
9928 "xloc": [
9929 "default-mobile.handlebars->9->79",
9930 - "default.handlebars->27->1113"
9930 + "default.handlebars->27->1115"
9931 ]
9932 },
9933 {
@@ -9945,7 +9945,7 @@
9945 "zh-chs": "郵件認證",
9946 "xloc": [
9947 "default-mobile.handlebars->9->68",
9948 - "default.handlebars->27->882"
9948 + "default.handlebars->27->884"
9949 ]
9950 },
9951 {
@@ -9990,7 +9990,7 @@
9990 "zh-chs": "電子郵件驗證",
9991 "xloc": [
9992 "default-mobile.handlebars->9->77",
9993 - "default.handlebars->27->1111"
9993 + "default.handlebars->27->1113"
9994 ]
9995 },
9996 {
@@ -10020,7 +10020,7 @@
10020 "ru": "Электронная почта не подтверждена",
10021 "zh-chs": "邮件未验证",
10022 "xloc": [
10023 - "default.handlebars->27->1443"
10023 + "default.handlebars->27->1445"
10024 ]
10025 },
10026 {
@@ -10037,8 +10037,8 @@
10037 "ru": "Email подтвержден",
10038 "zh-chs": "電子郵件已驗證",
10039 "xloc": [
10040 - "default.handlebars->27->1444",
10041 - "default.handlebars->27->1593"
10040 + "default.handlebars->27->1446",
10041 + "default.handlebars->27->1595"
10042 ]
10043 },
10044 {
@@ -10055,7 +10055,7 @@
10055 "ru": "Email подтвержден.",
10056 "zh-chs": "電子郵件已驗證。",
10057 "xloc": [
10058 - "default.handlebars->27->1493"
10058 + "default.handlebars->27->1495"
10059 ]
10060 },
10061 {
@@ -10072,7 +10072,7 @@
10072 "ru": "Email не подтвержден",
10073 "zh-chs": "電子郵件未驗證",
10074 "xloc": [
10075 - "default.handlebars->27->1594"
10075 + "default.handlebars->27->1596"
10076 ]
10077 },
10078 {
@@ -10111,7 +10111,7 @@
10111 "en": "Email verified and forced password reset required.",
10112 "nl": "E-mail geverifieerd en geforceerd opnieuw instellen van wachtwoord vereist.",
10113 "xloc": [
10114 - "default.handlebars->27->1494"
10114 + "default.handlebars->27->1496"
10115 ]
10116 },
10117 {
@@ -10124,7 +10124,7 @@
10124 "nl": "Email/SMS verkeer",
10125 "zh-chs": "电子邮件/短信流量",
10126 "xloc": [
10127 - "default.handlebars->27->1789"
10127 + "default.handlebars->27->1791"
10128 ]
10129 },
10130 {
@@ -10163,7 +10163,7 @@
10163 "ru": "Включить коды приглашения",
10164 "zh-chs": "啟用邀請代碼",
10165 "xloc": [
10166 - "default.handlebars->27->1341"
10166 + "default.handlebars->27->1343"
10167 ]
10168 },
10169 {
@@ -10198,7 +10198,7 @@
10198 "zh-chs": "啟用電子郵件兩因素驗證。",
10199 "xloc": [
10200 "default-mobile.handlebars->9->70",
10201 - "default.handlebars->27->884"
10201 + "default.handlebars->27->886"
10202 ]
10203 },
10204 {
@@ -10222,7 +10222,7 @@
10222 "en": "Enabled",
10223 "nl": "Ingeschakeld",
10224 "xloc": [
10225 - "default.handlebars->27->1726"
10225 + "default.handlebars->27->1728"
10226 ]
10227 },
10228 {
@@ -10246,7 +10246,7 @@
10246 "en": "End Time",
10247 "nl": "Eindtijd",
10248 "xloc": [
10249 - "default.handlebars->27->1723"
10249 + "default.handlebars->27->1725"
10250 ]
10251 },
10252 {
@@ -10263,7 +10263,7 @@
10263 "ru": "Английский",
10264 "zh-chs": "英語",
10265 "xloc": [
10266 - "default.handlebars->27->946"
10266 + "default.handlebars->27->948"
10267 ]
10268 },
10269 {
@@ -10280,7 +10280,7 @@
10280 "ru": "Английский (Австралия)",
10281 "zh-chs": "英文(澳洲)",
10282 "xloc": [
10283 - "default.handlebars->27->947"
10283 + "default.handlebars->27->949"
10284 ]
10285 },
10286 {
@@ -10297,7 +10297,7 @@
10297 "ru": "Английский (Белиз)",
10298 "zh-chs": "英語(伯利茲)",
10299 "xloc": [
10300 - "default.handlebars->27->948"
10300 + "default.handlebars->27->950"
10301 ]
10302 },
10303 {
@@ -10314,7 +10314,7 @@
10314 "ru": "Английский (Канада)",
10315 "zh-chs": "英文(加拿大)",
10316 "xloc": [
10317 - "default.handlebars->27->949"
10317 + "default.handlebars->27->951"
10318 ]
10319 },
10320 {
@@ -10331,7 +10331,7 @@
10331 "ru": "Английский (Ирландия)",
10332 "zh-chs": "英文(愛爾蘭)",
10333 "xloc": [
10334 - "default.handlebars->27->950"
10334 + "default.handlebars->27->952"
10335 ]
10336 },
10337 {
@@ -10348,7 +10348,7 @@
10348 "ru": "Английский (Ямайка)",
10349 "zh-chs": "英文(牙買加)",
10350 "xloc": [
10351 - "default.handlebars->27->951"
10351 + "default.handlebars->27->953"
10352 ]
10353 },
10354 {
@@ -10365,7 +10365,7 @@
10365 "ru": "Английский (Новая Зеландия)",
10366 "zh-chs": "英文(紐西蘭)",
10367 "xloc": [
10368 - "default.handlebars->27->952"
10368 + "default.handlebars->27->954"
10369 ]
10370 },
10371 {
@@ -10382,7 +10382,7 @@
10382 "ru": "Английский (Филиппины)",
10383 "zh-chs": "英文(菲律賓)",
10384 "xloc": [
10385 - "default.handlebars->27->953"
10385 + "default.handlebars->27->955"
10386 ]
10387 },
10388 {
@@ -10399,7 +10399,7 @@
10399 "ru": "Английский (Южная Африка)",
10400 "zh-chs": "英語(南非)",
10401 "xloc": [
10402 - "default.handlebars->27->954"
10402 + "default.handlebars->27->956"
10403 ]
10404 },
10405 {
@@ -10416,7 +10416,7 @@
10416 "ru": "Английский (Тринидад и Тобаго)",
10417 "zh-chs": "英文(特立尼達和多巴哥)",
10418 "xloc": [
10419 - "default.handlebars->27->955"
10419 + "default.handlebars->27->957"
10420 ]
10421 },
10422 {
@@ -10433,7 +10433,7 @@
10433 "ru": "Английский (Великобритания)",
10434 "zh-chs": "英文(英國)",
10435 "xloc": [
10436 - "default.handlebars->27->956"
10436 + "default.handlebars->27->958"
10437 ]
10438 },
10439 {
@@ -10450,7 +10450,7 @@
10450 "ru": "Английский (Соединенные Штаты)",
10451 "zh-chs": "美國英語)",
10452 "xloc": [
10453 - "default.handlebars->27->957"
10453 + "default.handlebars->27->959"
10454 ]
10455 },
10456 {
@@ -10467,7 +10467,7 @@
10467 "ru": "Английский (Зимбабве)",
10468 "zh-chs": "英文(津巴布韋)",
10469 "xloc": [
10470 - "default.handlebars->27->958"
10470 + "default.handlebars->27->960"
10471 ]
10472 },
10473 {
@@ -10484,8 +10484,8 @@
10484 "ru": "Ввод",
10485 "zh-chs": "輸入",
10486 "xloc": [
10487 - "default.handlebars->27->1139",
10488 - "default.handlebars->27->1140"
10487 + "default.handlebars->27->1141",
10488 + "default.handlebars->27->1142"
10489 ]
10490 },
10491 {
@@ -10502,7 +10502,7 @@
10502 "ru": "Введите разделенный запятыми список имен административных областей.",
10503 "zh-chs": "輸入管理領域名稱的逗號分隔列表。",
10504 "xloc": [
10505 - "default.handlebars->27->1498"
10505 + "default.handlebars->27->1500"
10506 ]
10507 },
10508 {
@@ -10536,7 +10536,7 @@
10536 "ru": "Для удаленного набора введите текст, используя английскую раскладку и нажмите OK. Перед продолжением убедитесь, что курсор на удаленном компьютере установлен в правильное положение.",
10537 "zh-chs": "輸入文本,然後單擊“確定”以使用美式英語鍵盤遠程輸入文本。在繼續操作之前,請確保將遠程光標放置在正確的位置。",
10538 "xloc": [
10539 - "default.handlebars->27->722"
10539 + "default.handlebars->27->724"
10540 ]
10541 },
10542 {
@@ -10584,7 +10584,7 @@
10584 "nl": "Voer uw telefoonnummer in dat geschikt is voor SMS. Na verificatie kan het nummer worden gebruikt voor inlogverificatie en andere meldingen.",
10585 "zh-chs": "输入支持SMS的电话号码。验证后,该号码可用于登录验证和其他通知。",
10586 "xloc": [
10587 - "default.handlebars->27->879"
10587 + "default.handlebars->27->881"
10588 ]
10589 },
10590 {
@@ -10635,7 +10635,7 @@
10635 "ru": "Эсперанто",
10636 "zh-chs": "世界語",
10637 "xloc": [
10638 - "default.handlebars->27->959"
10638 + "default.handlebars->27->961"
10639 ]
10640 },
10641 {
@@ -10652,7 +10652,7 @@
10652 "ru": "Эстонский",
10653 "zh-chs": "愛沙尼亞語",
10654 "xloc": [
10655 - "default.handlebars->27->960"
10655 + "default.handlebars->27->962"
10656 ]
10657 },
10658 {
@@ -10669,7 +10669,7 @@
10669 "ru": "Детали события",
10670 "zh-chs": "活動詳情",
10671 "xloc": [
10672 - "default.handlebars->27->799"
10672 + "default.handlebars->27->801"
10673 ]
10674 },
10675 {
@@ -10686,7 +10686,7 @@
10686 "ru": "Экспорт списка событий",
10687 "zh-chs": "活動列表導出",
10688 "xloc": [
10689 - "default.handlebars->27->1419"
10689 + "default.handlebars->27->1421"
10690 ]
10691 },
10692 {
@@ -10775,7 +10775,7 @@
10775 "ru": "Расширенный ASCII",
10776 "zh-chs": "擴展ASCII",
10777 "xloc": [
10778 - "default.handlebars->27->748"
10778 + "default.handlebars->27->750"
10779 ]
10780 },
10781 {
@@ -10809,7 +10809,7 @@
10809 "ru": "Внешний",
10810 "zh-chs": "外部",
10811 "xloc": [
10812 - "default.handlebars->27->1774"
10812 + "default.handlebars->27->1776"
10813 ]
10814 },
10815 {
@@ -10826,7 +10826,7 @@
10826 "ru": "Mакедонский (БЮР)",
10827 "zh-chs": "FYRO馬其頓語",
10828 "xloc": [
10829 - "default.handlebars->27->1010"
10829 + "default.handlebars->27->1012"
10830 ]
10831 },
10832 {
@@ -10843,7 +10843,7 @@
10843 "ru": "Фарерский",
10844 "zh-chs": "法羅語",
10845 "xloc": [
10846 - "default.handlebars->27->961"
10846 + "default.handlebars->27->963"
10847 ]
10848 },
10849 {
@@ -10873,7 +10873,7 @@
10873 "ko": "원격 터미널 세션을 시작하지 못했습니다 : {0} ({1})",
10874 "zh-chs": "无法启动远程终端会话{0}({1})",
10875 "xloc": [
10876 - "default.handlebars->27->704"
10876 + "default.handlebars->27->706"
10877 ]
10878 },
10879 {
@@ -10890,7 +10890,7 @@
10890 "ru": "Фарси (Персидский)",
10891 "zh-chs": "波斯語(波斯語)",
10892 "xloc": [
10893 - "default.handlebars->27->962"
10893 + "default.handlebars->27->964"
10894 ]
10895 },
10896 {
@@ -10925,7 +10925,7 @@
10925 "ru": "Функции",
10926 "zh-chs": "特徵",
10927 "xloc": [
10928 - "default.handlebars->27->1171"
10928 + "default.handlebars->27->1173"
10929 ]
10930 },
10931 {
@@ -10942,7 +10942,7 @@
10942 "ru": "Фиджи",
10943 "zh-chs": "斐濟",
10944 "xloc": [
10945 - "default.handlebars->27->963"
10945 + "default.handlebars->27->965"
10946 ]
10947 },
10948 {
@@ -10961,7 +10961,7 @@
10961 "xloc": [
10962 "default-mobile.handlebars->9->299",
10963 "default.handlebars->27->440",
10964 - "default.handlebars->27->771"
10964 + "default.handlebars->27->773"
10965 ]
10966 },
10967 {
@@ -10995,7 +10995,7 @@
10995 "ru": "Драйвер файловой системы",
10996 "zh-chs": "FileSystemDriver",
10997 "xloc": [
10998 - "default.handlebars->27->731"
10998 + "default.handlebars->27->733"
10999 ]
11000 },
11001 {
@@ -11014,8 +11014,8 @@
11014 "xloc": [
11015 "default-mobile.handlebars->9->167",
11016 "default-mobile.handlebars->9->250",
11017 - "default.handlebars->27->1260",
11018 - "default.handlebars->27->1711",
11017 + "default.handlebars->27->1262",
11018 + "default.handlebars->27->1713",
11019 "default.handlebars->27->220",
11020 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevFiles",
11021 "default.handlebars->contextMenu->cxfiles"
@@ -11052,8 +11052,8 @@
11052 "ru": "Уведомление файлов",
11053 "zh-chs": "文件通知",
11054 "xloc": [
11055 - "default.handlebars->27->1179",
11056 - "default.handlebars->27->1624",
11055 + "default.handlebars->27->1181",
11056 + "default.handlebars->27->1626",
11057 "default.handlebars->27->523"
11058 ]
11059 },
@@ -11071,8 +11071,8 @@
11071 "ru": "Запрос файлов",
11072 "zh-chs": "文件提示",
11073 "xloc": [
11074 - "default.handlebars->27->1178",
11075 - "default.handlebars->27->1623",
11074 + "default.handlebars->27->1180",
11075 + "default.handlebars->27->1625",
11076 "default.handlebars->27->522"
11077 ]
11078 },
@@ -11110,7 +11110,7 @@
11110 "ru": "Финский",
11111 "zh-chs": "芬蘭",
11112 "xloc": [
11113 - "default.handlebars->27->964"
11113 + "default.handlebars->27->966"
11114 ]
11115 },
11116 {
@@ -11233,8 +11233,8 @@
11233 "ru": "Принудительно сбросить пароль при следующем входе в систему.",
11234 "zh-chs": "下次登錄時強制重置密碼。",
11235 "xloc": [
11236 - "default.handlebars->27->1492",
11237 - "default.handlebars->27->1662"
11236 + "default.handlebars->27->1494",
11237 + "default.handlebars->27->1664"
11238 ]
11239 },
11240 {
@@ -11320,8 +11320,8 @@
11320 "ru": "Свободно",
11321 "zh-chs": "自由",
11322 "xloc": [
11323 - "default.handlebars->27->1735",
11324 - "default.handlebars->27->1737"
11323 + "default.handlebars->27->1737",
11324 + "default.handlebars->27->1739"
11325 ]
11326 },
11327 {
@@ -11356,7 +11356,7 @@
11356 "ru": "Французский (Бельгия)",
11357 "zh-chs": "法語(比利時)",
11358 "xloc": [
11359 - "default.handlebars->27->966"
11359 + "default.handlebars->27->968"
11360 ]
11361 },
11362 {
@@ -11373,7 +11373,7 @@
11373 "ru": "Французский (Канада)",
11374 "zh-chs": "法語(加拿大)",
11375 "xloc": [
11376 - "default.handlebars->27->967"
11376 + "default.handlebars->27->969"
11377 ]
11378 },
11379 {
@@ -11390,7 +11390,7 @@
11390 "ru": "Французский (Франция)",
11391 "zh-chs": "法語(法國)",
11392 "xloc": [
11393 - "default.handlebars->27->968"
11393 + "default.handlebars->27->970"
11394 ]
11395 },
11396 {
@@ -11407,7 +11407,7 @@
11407 "ru": "Французский (Люксембург)",
11408 "zh-chs": "法語(盧森堡)",
11409 "xloc": [
11410 - "default.handlebars->27->969"
11410 + "default.handlebars->27->971"
11411 ]
11412 },
11413 {
@@ -11424,7 +11424,7 @@
11424 "ru": "Французский (Монако)",
11425 "zh-chs": "法語(摩納哥)",
11426 "xloc": [
11427 - "default.handlebars->27->970"
11427 + "default.handlebars->27->972"
11428 ]
11429 },
11430 {
@@ -11441,7 +11441,7 @@
11441 "ru": "Французский (Стандартный)",
11442 "zh-chs": "法語(標準)",
11443 "xloc": [
11444 - "default.handlebars->27->965"
11444 + "default.handlebars->27->967"
11445 ]
11446 },
11447 {
@@ -11458,7 +11458,7 @@
11458 "ru": "Французский (Швейцария)",
11459 "zh-chs": "法語(瑞士)",
11460 "xloc": [
11461 - "default.handlebars->27->971"
11461 + "default.handlebars->27->973"
11462 ]
11463 },
11464 {
@@ -11475,7 +11475,7 @@
11475 "ru": "Фризский",
11476 "zh-chs": "弗里斯蘭語",
11477 "xloc": [
11478 - "default.handlebars->27->972"
11478 + "default.handlebars->27->974"
11479 ]
11480 },
11481 {
@@ -11492,7 +11492,7 @@
11492 "ru": "Фриульский",
11493 "zh-chs": "弗留利",
11494 "xloc": [
11495 - "default.handlebars->27->973"
11495 + "default.handlebars->27->975"
11496 ]
11497 },
11498 {
@@ -11513,9 +11513,9 @@
11513 "default-mobile.handlebars->9->387",
11514 "default-mobile.handlebars->9->396",
11515 "default-mobile.handlebars->9->414",
11516 - "default.handlebars->27->1146",
11517 - "default.handlebars->27->1278",
11518 - "default.handlebars->27->1504"
11516 + "default.handlebars->27->1148",
11517 + "default.handlebars->27->1280",
11518 + "default.handlebars->27->1506"
11519 ]
11520 },
11521 {
@@ -11532,7 +11532,7 @@
11532 "ru": "Администратор с полным доступом (все права)",
11533 "zh-chs": "正式管理員(保留所有權利)",
11534 "xloc": [
11535 - "default.handlebars->27->1312"
11535 + "default.handlebars->27->1314"
11536 ]
11537 },
11538 {
@@ -11563,7 +11563,7 @@
11563 "ru": "Полные права на устройство",
11564 "zh-chs": "完整的設備權限",
11565 "xloc": [
11566 - "default.handlebars->27->587"
11566 + "default.handlebars->27->589"
11567 ]
11568 },
11569 {
@@ -11579,7 +11579,7 @@
11579 "ru": "Полные права",
11580 "zh-chs": "完全权利",
11581 "xloc": [
11582 - "default.handlebars->27->603"
11582 + "default.handlebars->27->605"
11583 ]
11584 },
11585 {
@@ -11615,7 +11615,7 @@
11615 "ru": "Администратор с полным доступом",
11616 "zh-chs": "正式管理員",
11617 "xloc": [
11618 - "default.handlebars->27->1588"
11618 + "default.handlebars->27->1590"
11619 ]
11620 },
11621 {
@@ -11629,7 +11629,7 @@
11629 "zh-chs": "显卡",
11630 "xloc": [
11631 "default-mobile.handlebars->9->365",
11632 - "default.handlebars->27->847"
11632 + "default.handlebars->27->849"
11633 ]
11634 },
11635 {
@@ -11646,7 +11646,7 @@
11646 "ru": "Гэльский (Ирландский)",
11647 "zh-chs": "蓋爾語(愛爾蘭)",
11648 "xloc": [
11649 - "default.handlebars->27->975"
11649 + "default.handlebars->27->977"
11650 ]
11651 },
11652 {
@@ -11663,7 +11663,7 @@
11663 "ru": "Гэльский (Шотландия)",
11664 "zh-chs": "蓋爾語(蘇格蘭語)",
11665 "xloc": [
11666 - "default.handlebars->27->974"
11666 + "default.handlebars->27->976"
11667 ]
11668 },
11669 {
@@ -11680,7 +11680,7 @@
11680 "ru": "Галицкий",
11681 "zh-chs": "加拉契人",
11682 "xloc": [
11683 - "default.handlebars->27->976"
11683 + "default.handlebars->27->978"
11684 ]
11685 },
11686 {
@@ -11788,7 +11788,7 @@
11788 "ru": "Грузинский",
11789 "zh-chs": "格魯吉亞人",
11790 "xloc": [
11791 - "default.handlebars->27->977"
11791 + "default.handlebars->27->979"
11792 ]
11793 },
11794 {
@@ -11805,7 +11805,7 @@
11805 "ru": "Немецкий (Австрия)",
11806 "zh-chs": "德語(奧地利)",
11807 "xloc": [
11808 - "default.handlebars->27->979"
11808 + "default.handlebars->27->981"
11809 ]
11810 },
11811 {
@@ -11822,7 +11822,7 @@
11822 "ru": "Немецкий (Германия)",
11823 "zh-chs": "德文(德國)",
11824 "xloc": [
11825 - "default.handlebars->27->980"
11825 + "default.handlebars->27->982"
11826 ]
11827 },
11828 {
@@ -11839,7 +11839,7 @@
11839 "ru": "Немецкий (Лихтенштейн)",
11840 "zh-chs": "德文(列支敦士登)",
11841 "xloc": [
11842 - "default.handlebars->27->981"
11842 + "default.handlebars->27->983"
11843 ]
11844 },
11845 {
@@ -11856,7 +11856,7 @@
11856 "ru": "Немецкий (Люксембург)",
11857 "zh-chs": "德語(盧森堡)",
11858 "xloc": [
11859 - "default.handlebars->27->982"
11859 + "default.handlebars->27->984"
11860 ]
11861 },
11862 {
@@ -11873,7 +11873,7 @@
11873 "ru": "Немецкий (Стандартный)",
11874 "zh-chs": "德語(標準)",
11875 "xloc": [
11876 - "default.handlebars->27->978"
11876 + "default.handlebars->27->980"
11877 ]
11878 },
11879 {
@@ -11890,7 +11890,7 @@
11890 "ru": "Немецкий (Швейцария)",
11891 "zh-chs": "德語(瑞士)",
11892 "xloc": [
11893 - "default.handlebars->27->983"
11893 + "default.handlebars->27->985"
11894 ]
11895 },
11896 {
@@ -11907,7 +11907,7 @@
11907 "ru": "Получить учетные данные MQTT для этого устройства.",
11908 "zh-chs": "獲取此設備的MQTT登錄憑據。",
11909 "xloc": [
11910 - "default.handlebars->27->568"
11910 + "default.handlebars->27->570"
11911 ]
11912 },
11913 {
@@ -11973,7 +11973,7 @@
11973 "ru": "Хорошо",
11974 "zh-chs": "好",
11975 "xloc": [
11976 - "default.handlebars->27->1142"
11976 + "default.handlebars->27->1144"
11977 ]
11978 },
11979 {
@@ -12010,7 +12010,7 @@
12010 "ru": "Греческий",
12011 "zh-chs": "希臘語",
12012 "xloc": [
12013 - "default.handlebars->27->984"
12013 + "default.handlebars->27->986"
12014 ]
12015 },
12016 {
@@ -12046,8 +12046,8 @@
12046 "ru": "Групповое действие",
12047 "zh-chs": "集體行動",
12048 "xloc": [
12049 - "default.handlebars->27->1456",
12050 - "default.handlebars->27->1525",
12049 + "default.handlebars->27->1458",
12050 + "default.handlebars->27->1527",
12051 "default.handlebars->27->408",
12052 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->devListToolbar",
12053 "default.handlebars->container->column_l->p4->3->1->0->3->3",
@@ -12058,7 +12058,7 @@
12058 "en": "Group Identifier",
12059 "nl": "Groepsidentificatie",
12060 "xloc": [
12061 - "default.handlebars->27->1542"
12061 + "default.handlebars->27->1544"
12062 ]
12063 },
12064 {
@@ -12075,7 +12075,7 @@
12075 "ru": "Члены группы",
12076 "zh-chs": "小組成員",
12077 "xloc": [
12078 - "default.handlebars->27->1551"
12078 + "default.handlebars->27->1553"
12079 ]
12080 },
12081 {
@@ -12092,7 +12092,7 @@
12092 "ru": "Права на группу для пользователя {0}.",
12093 "zh-chs": "用戶{0}的組權限。",
12094 "xloc": [
12095 - "default.handlebars->27->1277"
12095 + "default.handlebars->27->1279"
12096 ]
12097 },
12098 {
@@ -12109,7 +12109,7 @@
12109 "ru": "Права на группу для {0}.",
12110 "zh-chs": "{0}的組權限。",
12111 "xloc": [
12112 - "default.handlebars->27->1276"
12112 + "default.handlebars->27->1278"
12113 ]
12114 },
12115 {
@@ -12160,7 +12160,7 @@
12160 "ru": "Гуджарати",
12161 "zh-chs": "古久拉提",
12162 "xloc": [
12163 - "default.handlebars->27->985"
12163 + "default.handlebars->27->987"
12164 ]
12165 },
12166 {
@@ -12196,7 +12196,7 @@
12196 "ru": "Гаитянский",
12197 "zh-chs": "海地",
12198 "xloc": [
12199 - "default.handlebars->27->986"
12199 + "default.handlebars->27->988"
12200 ]
12201 },
12202 {
@@ -12230,7 +12230,7 @@
12230 "ru": "Жесткое отключение агента",
12231 "zh-chs": "硬斷開劑",
12232 "xloc": [
12233 - "default.handlebars->27->874"
12233 + "default.handlebars->27->876"
12234 ]
12235 },
12236 {
@@ -12247,7 +12247,7 @@
12247 "ru": "Всего кучи",
12248 "zh-chs": "堆總數",
12249 "xloc": [
12250 - "default.handlebars->27->1776"
12250 + "default.handlebars->27->1778"
12251 ]
12252 },
12253 {
@@ -12264,7 +12264,7 @@
12264 "ru": "Куча используется",
12265 "zh-chs": "堆使用",
12266 "xloc": [
12267 - "default.handlebars->27->1775"
12267 + "default.handlebars->27->1777"
12268 ]
12269 },
12270 {
@@ -12281,7 +12281,7 @@
12281 "ru": "Иврит",
12282 "zh-chs": "希伯來語",
12283 "xloc": [
12284 - "default.handlebars->27->987"
12284 + "default.handlebars->27->989"
12285 ]
12286 },
12287 {
@@ -12315,7 +12315,7 @@
12315 "ru": "Помочь перевести MeshCentral",
12316 "zh-chs": "幫助翻譯MeshCentral",
12317 "xloc": [
12318 - "default.handlebars->27->1101"
12318 + "default.handlebars->27->1103"
12319 ]
12320 },
12321 {
@@ -12401,7 +12401,7 @@
12401 "ru": "Хинди",
12402 "zh-chs": "印地語",
12403 "xloc": [
12404 - "default.handlebars->27->988"
12404 + "default.handlebars->27->990"
12405 ]
12406 },
12407 {
@@ -12437,7 +12437,7 @@
12437 "zh-chs": "持有1份副本",
12438 "xloc": [
12439 "default-mobile.handlebars->9->308",
12440 - "default.handlebars->27->780"
12440 + "default.handlebars->27->782"
12441 ]
12442 },
12443 {
@@ -12455,7 +12455,7 @@
12455 "zh-chs": "持有1個搬家公司",
12456 "xloc": [
12457 "default-mobile.handlebars->9->312",
12458 - "default.handlebars->27->784"
12458 + "default.handlebars->27->786"
12459 ]
12460 },
12461 {
@@ -12473,7 +12473,7 @@
12473 "zh-chs": "保留{0}個條目進行複制",
12474 "xloc": [
12475 "default-mobile.handlebars->9->306",
12476 - "default.handlebars->27->778"
12476 + "default.handlebars->27->780"
12477 ]
12478 },
12479 {
@@ -12491,7 +12491,7 @@
12491 "zh-chs": "保留{0}個條目以進行移動",
12492 "xloc": [
12493 "default-mobile.handlebars->9->310",
12494 - "default.handlebars->27->782"
12494 + "default.handlebars->27->784"
12495 ]
12496 },
12497 {
@@ -12509,7 +12509,7 @@
12509 "zh-chs": "保持{2}的{0}入口{1}",
12510 "xloc": [
12511 "default-mobile.handlebars->9->129",
12512 - "default.handlebars->27->1406"
12512 + "default.handlebars->27->1408"
12513 ]
12514 },
12515 {
@@ -12532,7 +12532,7 @@
12532 "default-mobile.handlebars->9->272",
12533 "default.handlebars->27->247",
12534 "default.handlebars->27->480",
12535 - "default.handlebars->27->697"
12535 + "default.handlebars->27->699"
12536 ]
12537 },
12538 {
@@ -12549,7 +12549,7 @@
12549 "ru": "Синхронизация имени хоста",
12550 "zh-chs": "主機名同步",
12551 "xloc": [
12552 - "default.handlebars->27->1169"
12552 + "default.handlebars->27->1171"
12553 ]
12554 },
12555 {
@@ -12566,7 +12566,7 @@
12566 "ru": "Венгерский",
12567 "zh-chs": "匈牙利",
12568 "xloc": [
12569 - "default.handlebars->27->989"
12569 + "default.handlebars->27->991"
12570 ]
12571 },
12572 {
@@ -12619,7 +12619,7 @@
12619 "zh-chs": "IP:{0}",
12620 "xloc": [
12621 "default-mobile.handlebars->9->338",
12622 - "default.handlebars->27->820"
12622 + "default.handlebars->27->822"
12623 ]
12624 },
12625 {
@@ -12637,7 +12637,7 @@
12637 "zh-chs": "IP:{0},掩碼:{1},網關:{2}",
12638 "xloc": [
12639 "default-mobile.handlebars->9->336",
12640 - "default.handlebars->27->818"
12640 + "default.handlebars->27->820"
12641 ]
12642 },
12643 {
@@ -12656,8 +12656,8 @@
12656 "xloc": [
12657 "default-mobile.handlebars->9->335",
12658 "default-mobile.handlebars->9->337",
12659 - "default.handlebars->27->817",
12660 - "default.handlebars->27->819"
12659 + "default.handlebars->27->819",
12660 + "default.handlebars->27->821"
12661 ]
12662 },
12663 {
@@ -12725,7 +12725,7 @@
12725 "ru": "Исландский",
12726 "zh-chs": "冰島的",
12727 "xloc": [
12728 - "default.handlebars->27->990"
12728 + "default.handlebars->27->992"
12729 ]
12730 },
12731 {
@@ -12743,7 +12743,7 @@
12743 "zh-chs": "圖標選擇",
12744 "xloc": [
12745 "default-mobile.handlebars->9->270",
12746 - "default.handlebars->27->695"
12746 + "default.handlebars->27->697"
12747 ]
12748 },
12749 {
@@ -12761,7 +12761,7 @@
12761 "zh-chs": "識別碼",
12762 "xloc": [
12763 "default-mobile.handlebars->9->363",
12764 - "default.handlebars->27->845"
12764 + "default.handlebars->27->847"
12765 ]
12766 },
12767 {
@@ -12864,7 +12864,7 @@
12864 "ru": "Индонезийский",
12865 "zh-chs": "印度尼西亞",
12866 "xloc": [
12867 - "default.handlebars->27->991"
12867 + "default.handlebars->27->993"
12868 ]
12869 },
12870 {
@@ -12981,7 +12981,7 @@
12981 "ru": "Установка CIRA",
12982 "zh-chs": "安裝CIRA",
12983 "xloc": [
12984 - "default.handlebars->27->1202"
12984 + "default.handlebars->27->1204"
12985 ]
12986 },
12987 {
@@ -12998,7 +12998,7 @@
12998 "ru": "Локальная установка",
12999 "zh-chs": "安裝本地",
13000 "xloc": [
13001 - "default.handlebars->27->1204"
13001 + "default.handlebars->27->1206"
13002 ]
13003 },
13004 {
@@ -13015,8 +13015,8 @@
13015 "ru": "Тип установки",
13016 "zh-chs": "安裝類型",
13017 "xloc": [
13018 - "default.handlebars->27->1343",
13019 - "default.handlebars->27->1350",
13018 + "default.handlebars->27->1345",
13019 + "default.handlebars->27->1352",
13020 "default.handlebars->27->309",
13021 "default.handlebars->27->331"
13022 ]
@@ -13035,7 +13035,7 @@
13035 "ru": "Intel (F10 = ESC+[OM)",
13036 "zh-chs": "英特爾(F10 = ESC + [OM)",
13037 "xloc": [
13038 - "default.handlebars->27->750",
13038 + "default.handlebars->27->752",
13039 "default.handlebars->container->column_l->p12->termTable->1->1->6->1->1->terminalSettingsButtons"
13040 ]
13041 },
@@ -13053,10 +13053,10 @@
13053 "ru": "Intel AMT",
13054 "zh-chs": "英特爾AMT",
13055 "xloc": [
13056 - "default.handlebars->27->1362",
13057 - "default.handlebars->27->1370",
13058 - "default.handlebars->27->1772",
13059 - "default.handlebars->27->1794"
13056 + "default.handlebars->27->1364",
13057 + "default.handlebars->27->1372",
13058 + "default.handlebars->27->1774",
13059 + "default.handlebars->27->1796"
13060 ]
13061 },
13062 {
@@ -13097,14 +13097,14 @@
13097 "en": "Intel AMT Redirection",
13098 "nl": "Intel AMT omleiding",
13099 "xloc": [
13100 - "default.handlebars->27->1713"
13100 + "default.handlebars->27->1715"
13101 ]
13102 },
13103 {
13104 "en": "Intel AMT WSMAN",
13105 "nl": "Intel AMT WSMAN",
13106 "xloc": [
13107 - "default.handlebars->27->1712"
13107 + "default.handlebars->27->1714"
13108 ]
13109 },
13110 {
@@ -13223,7 +13223,7 @@
13223 "ru": "Intel ASCII",
13224 "zh-chs": "英特爾ASCII",
13225 "xloc": [
13226 - "default.handlebars->27->749"
13226 + "default.handlebars->27->751"
13227 ]
13228 },
13229 {
@@ -13243,8 +13243,8 @@
13243 "default-mobile.handlebars->9->194",
13244 "default-mobile.handlebars->9->229",
13245 "default-mobile.handlebars->9->234",
13246 - "default.handlebars->27->1186",
13247 - "default.handlebars->27->1196",
13246 + "default.handlebars->27->1188",
13247 + "default.handlebars->27->1198",
13248 "default.handlebars->27->450",
13249 "default.handlebars->27->505",
13250 "default.handlebars->27->533"
@@ -13320,7 +13320,7 @@
13320 "ru": "Политика Intel&reg; AMT",
13321 "zh-chs": "英特爾&reg;AMT政策",
13322 "xloc": [
13323 - "default.handlebars->27->1225"
13323 + "default.handlebars->27->1227"
13324 ]
13325 },
13326 {
@@ -13407,8 +13407,8 @@
13407 "zh-chs": "英特爾&reg;AMT已連接",
13408 "xloc": [
13409 "default-mobile.handlebars->9->244",
13410 - "default.handlebars->27->572",
13411 - "default.handlebars->27->573"
13410 + "default.handlebars->27->574",
13411 + "default.handlebars->27->575"
13412 ]
13413 },
13414 {
@@ -13425,8 +13425,8 @@
13425 "ru": "События Intel&reg; AMT desktop или serial.",
13426 "zh-chs": "英特爾&reg;AMT桌面和串行事件。",
13427 "xloc": [
13428 - "default.handlebars->27->1107",
13429 - "default.handlebars->27->1358"
13428 + "default.handlebars->27->1109",
13429 + "default.handlebars->27->1360"
13430 ]
13431 },
13432 {
@@ -13444,8 +13444,8 @@
13444 "zh-chs": "檢測到英特爾&reg;AMT",
13445 "xloc": [
13446 "default-mobile.handlebars->9->245",
13447 - "default.handlebars->27->574",
13448 - "default.handlebars->27->575"
13447 + "default.handlebars->27->576",
13448 + "default.handlebars->27->577"
13449 ]
13450 },
13451 {
@@ -13515,8 +13515,8 @@
13515 "zh-chs": "僅限英特爾&reg;AMT,無代理",
13516 "xloc": [
13517 "default-mobile.handlebars->9->378",
13518 - "default.handlebars->27->1136",
13519 - "default.handlebars->27->1162"
13518 + "default.handlebars->27->1138",
13519 + "default.handlebars->27->1164"
13520 ]
13521 },
13522 {
@@ -13551,7 +13551,7 @@
13551 "zh-chs": "英特爾&reg;主動管理技術(英特爾&reg;AMT)",
13552 "xloc": [
13553 "default-mobile.handlebars->9->355",
13554 - "default.handlebars->27->837"
13554 + "default.handlebars->27->839"
13555 ]
13556 },
13557 {
@@ -13718,7 +13718,7 @@
13718 "ru": "Интерактивный",
13719 "zh-chs": "互動",
13720 "xloc": [
13721 - "default.handlebars->27->732"
13721 + "default.handlebars->27->734"
13722 ]
13723 },
13724 {
@@ -13735,8 +13735,8 @@
13735 "ru": "Только интерактивный режим",
13736 "zh-chs": "僅限互動",
13737 "xloc": [
13738 - "default.handlebars->27->1346",
13739 - "default.handlebars->27->1353",
13738 + "default.handlebars->27->1348",
13739 + "default.handlebars->27->1355",
13740 "default.handlebars->27->312",
13741 "default.handlebars->27->334"
13742 ]
@@ -13772,7 +13772,7 @@
13772 "ru": "Инуктитут",
13773 "zh-chs": "因紐特人",
13774 "xloc": [
13775 - "default.handlebars->27->992"
13775 + "default.handlebars->27->994"
13776 ]
13777 },
13778 {
@@ -13789,7 +13789,7 @@
13789 "ru": "Некорректный тип группы устройств",
13790 "zh-chs": "無效的設備組類型",
13791 "xloc": [
13792 - "default.handlebars->27->1749"
13792 + "default.handlebars->27->1751"
13793 ]
13794 },
13795 {
@@ -13806,7 +13806,7 @@
13806 "ru": "Некорректный JSON",
13807 "zh-chs": "無效的JSON",
13808 "xloc": [
13809 - "default.handlebars->27->1743"
13809 + "default.handlebars->27->1745"
13810 ]
13811 },
13812 {
@@ -13823,8 +13823,8 @@
13823 "ru": "Некорректный формат файла JSON.",
13824 "zh-chs": "無效的JSON文件格式。",
13825 "xloc": [
13826 - "default.handlebars->27->1470",
13827 - "default.handlebars->27->1472"
13826 + "default.handlebars->27->1472",
13827 + "default.handlebars->27->1474"
13828 ]
13829 },
13830 {
@@ -13841,7 +13841,7 @@
13841 "ru": "Некорректный файл JSON: {0}.",
13842 "zh-chs": "無效的JSON文件:{0}。",
13843 "xloc": [
13844 - "default.handlebars->27->1468"
13844 + "default.handlebars->27->1470"
13845 ]
13846 },
13847 {
@@ -13858,7 +13858,7 @@
13858 "ru": "Некорректная сигнатура PKCS",
13859 "zh-chs": "無效的PKCS簽名",
13860 "xloc": [
13861 - "default.handlebars->27->1741"
13861 + "default.handlebars->27->1743"
13862 ]
13863 },
13864 {
@@ -13875,7 +13875,7 @@
13875 "ru": "Некорректная сигнатура RSA",
13876 "zh-chs": "無效的RSA密碼",
13877 "xloc": [
13878 - "default.handlebars->27->1742"
13878 + "default.handlebars->27->1744"
13879 ]
13880 },
13881 {
@@ -14011,7 +14011,7 @@
14011 "ru": "Коды приглашений могут использоваться любым пользователем для присоединения устройств к этой группе устройств по следующей общедоступной ссылке:",
14012 "zh-chs": "任何人都可以使用邀請代碼通過以下公共鏈接將設備加入該設備組:",
14013 "xloc": [
14014 - "default.handlebars->27->1348"
14014 + "default.handlebars->27->1350"
14015 ]
14016 },
14017 {
@@ -14044,7 +14044,7 @@
14044 "ru": "Пригласить",
14045 "zh-chs": "邀請",
14046 "xloc": [
14047 - "default.handlebars->27->1212",
14047 + "default.handlebars->27->1214",
14048 "default.handlebars->27->244",
14049 "default.handlebars->27->324"
14050 ]
@@ -14063,11 +14063,11 @@
14063 "ru": "Пригласительные коды",
14064 "zh-chs": "邀請碼",
14065 "xloc": [
14066 - "default.handlebars->27->1190",
14067 - "default.handlebars->27->1342",
14068 - "default.handlebars->27->1347",
14066 + "default.handlebars->27->1192",
14067 + "default.handlebars->27->1344",
14068 "default.handlebars->27->1349",
14070 - "default.handlebars->27->1354"
14069 + "default.handlebars->27->1351",
14070 + "default.handlebars->27->1356"
14071 ]
14072 },
14073 {
@@ -14098,7 +14098,7 @@
14098 "nl": "Nodig iemand uit om de mesh-agent in deze apparaatgroep te installeren.",
14099 "zh-chs": "邀请某人在该设备组上安装网状代理。",
14100 "xloc": [
14101 - "default.handlebars->27->1211",
14101 + "default.handlebars->27->1213",
14102 "default.handlebars->27->243"
14103 ]
14104 },
@@ -14133,7 +14133,7 @@
14133 "ru": "Ирландский",
14134 "zh-chs": "愛爾蘭人",
14135 "xloc": [
14136 - "default.handlebars->27->993"
14136 + "default.handlebars->27->995"
14137 ]
14138 },
14139 {
@@ -14150,7 +14150,7 @@
14150 "ru": "Итальянский (Стандартный)",
14151 "zh-chs": "意大利語(標準)",
14152 "xloc": [
14153 - "default.handlebars->27->994"
14153 + "default.handlebars->27->996"
14154 ]
14155 },
14156 {
@@ -14167,7 +14167,7 @@
14167 "ru": "Итальянский (Швейцария)",
14168 "zh-chs": "義大利文(瑞士)",
14169 "xloc": [
14170 - "default.handlebars->27->995"
14170 + "default.handlebars->27->997"
14171 ]
14172 },
14173 {
@@ -14184,8 +14184,8 @@
14184 "ru": "Формат JSON",
14185 "zh-chs": "JSON格式",
14186 "xloc": [
14187 - "default.handlebars->27->1417",
14188 - "default.handlebars->27->1476",
14187 + "default.handlebars->27->1419",
14188 + "default.handlebars->27->1478",
14189 "default.handlebars->27->415"
14190 ]
14191 },
@@ -14203,7 +14203,7 @@
14203 "ru": "Японский",
14204 "zh-chs": "日本",
14205 "xloc": [
14206 - "default.handlebars->27->996"
14206 + "default.handlebars->27->998"
14207 ]
14208 },
14209 {
@@ -14220,7 +14220,7 @@
14220 "ru": "Каннада",
14221 "zh-chs": "卡納達語",
14222 "xloc": [
14223 - "default.handlebars->27->997"
14223 + "default.handlebars->27->999"
14224 ]
14225 },
14226 {
@@ -14237,7 +14237,7 @@
14237 "ru": "Кашмирский",
14238 "zh-chs": "克什米爾語",
14239 "xloc": [
14240 - "default.handlebars->27->998"
14240 + "default.handlebars->27->1000"
14241 ]
14242 },
14243 {
@@ -14254,7 +14254,7 @@
14254 "ru": "Казахский",
14255 "zh-chs": "哈薩克語",
14256 "xloc": [
14257 - "default.handlebars->27->999"
14257 + "default.handlebars->27->1001"
14258 ]
14259 },
14260 {
@@ -14271,7 +14271,7 @@
14271 "ru": "Драйвер ядра",
14272 "zh-chs": "內核驅動程序",
14273 "xloc": [
14274 - "default.handlebars->27->733"
14274 + "default.handlebars->27->735"
14275 ]
14276 },
14277 {
@@ -14288,8 +14288,8 @@
14288 "ru": "Имя ключа",
14289 "zh-chs": "鍵名",
14290 "xloc": [
14291 - "default.handlebars->27->890",
14292 - "default.handlebars->27->893"
14291 + "default.handlebars->27->892",
14292 + "default.handlebars->27->895"
14293 ]
14294 },
14295 {
@@ -14330,7 +14330,7 @@
14330 "ru": "Кхмерский",
14331 "zh-chs": "高棉語",
14332 "xloc": [
14333 - "default.handlebars->27->1000"
14333 + "default.handlebars->27->1002"
14334 ]
14335 },
14336 {
@@ -14347,7 +14347,7 @@
14347 "ru": "Киргизский",
14348 "zh-chs": "吉爾吉斯",
14349 "xloc": [
14350 - "default.handlebars->27->1001"
14350 + "default.handlebars->27->1003"
14351 ]
14352 },
14353 {
@@ -14364,7 +14364,7 @@
14364 "ru": "Клингонский",
14365 "zh-chs": "克林貢",
14366 "xloc": [
14367 - "default.handlebars->27->1002"
14367 + "default.handlebars->27->1004"
14368 ]
14369 },
14370 {
@@ -14382,7 +14382,7 @@
14382 "zh-chs": "已知的",
14383 "xloc": [
14384 "default-mobile.handlebars->9->354",
14385 - "default.handlebars->27->836"
14385 + "default.handlebars->27->838"
14386 ]
14387 },
14388 {
@@ -14399,7 +14399,7 @@
14399 "ru": "Korean",
14400 "zh-chs": "韓語",
14401 "xloc": [
14402 - "default.handlebars->27->1003"
14402 + "default.handlebars->27->1005"
14403 ]
14404 },
14405 {
@@ -14416,7 +14416,7 @@
14416 "ru": "Корейский (Северная Корея)",
14417 "zh-chs": "韓語(朝鮮)",
14418 "xloc": [
14419 - "default.handlebars->27->1004"
14419 + "default.handlebars->27->1006"
14420 ]
14421 },
14422 {
@@ -14433,7 +14433,7 @@
14433 "ru": "Корейский (Южная Корея)",
14434 "zh-chs": "韓語(韓國)",
14435 "xloc": [
14436 - "default.handlebars->27->1005"
14436 + "default.handlebars->27->1007"
14437 ]
14438 },
14439 {
@@ -14450,8 +14450,8 @@
14450 "ru": "LF",
14451 "zh-chs": "如果",
14452 "xloc": [
14453 - "default.handlebars->27->745",
14454 - "default.handlebars->27->754"
14453 + "default.handlebars->27->747",
14454 + "default.handlebars->27->756"
14455 ]
14456 },
14457 {
@@ -14468,7 +14468,7 @@
14468 "ru": "Язык",
14469 "zh-chs": "語言",
14470 "xloc": [
14471 - "default.handlebars->27->1099"
14471 + "default.handlebars->27->1101"
14472 ]
14473 },
14474 {
@@ -14502,7 +14502,7 @@
14502 "ru": "Большой Фокус",
14503 "zh-chs": "大焦點",
14504 "xloc": [
14505 - "default.handlebars->27->721"
14505 + "default.handlebars->27->723"
14506 ]
14507 },
14508 {
@@ -14685,7 +14685,7 @@
14685 "ru": "Последний доступ",
14686 "zh-chs": "最後訪問",
14687 "xloc": [
14688 - "default.handlebars->27->1425"
14688 + "default.handlebars->27->1427"
14689 ]
14690 },
14691 {
@@ -14702,7 +14702,7 @@
14702 "ru": "Последний вход в систему",
14703 "zh-chs": "上次登錄",
14704 "xloc": [
14705 - "default.handlebars->27->1606"
14705 + "default.handlebars->27->1608"
14706 ]
14707 },
14708 {
@@ -14725,9 +14725,9 @@
14725 "default.handlebars->27->70",
14726 "default.handlebars->27->72",
14727 "default.handlebars->27->74",
14728 - "default.handlebars->27->808",
14729 - "default.handlebars->27->809",
14730 - "default.handlebars->27->810"
14728 + "default.handlebars->27->810",
14729 + "default.handlebars->27->811",
14730 + "default.handlebars->27->812"
14731 ]
14732 },
14733 {
@@ -14747,8 +14747,8 @@
14747 "default-mobile.handlebars->9->323",
14748 "default-mobile.handlebars->9->325",
14749 "default.handlebars->27->69",
14750 - "default.handlebars->27->805",
14751 - "default.handlebars->27->807"
14750 + "default.handlebars->27->807",
14751 + "default.handlebars->27->809"
14752 ]
14753 },
14754 {
@@ -14765,7 +14765,7 @@
14765 "ru": "Последнее изменение: {0}",
14766 "zh-chs": "上次更改:{0}",
14767 "xloc": [
14768 - "default.handlebars->27->1610"
14768 + "default.handlebars->27->1612"
14769 ]
14770 },
14771 {
@@ -14816,7 +14816,7 @@
14816 "ru": "Последний вход в систему: {0}",
14817 "zh-chs": "上次登錄:{0}",
14818 "xloc": [
14819 - "default.handlebars->27->1435"
14819 + "default.handlebars->27->1437"
14820 ]
14821 },
14822 {
@@ -14833,7 +14833,7 @@
14833 "ru": "Последнее посещение:",
14834 "zh-chs": "最後一次露面:",
14835 "xloc": [
14836 - "default.handlebars->27->578",
14836 + "default.handlebars->27->580",
14837 "default.handlebars->27->65"
14838 ]
14839 },
@@ -14902,7 +14902,7 @@
14902 "ru": "Латинский",
14903 "zh-chs": "拉丁",
14904 "xloc": [
14905 - "default.handlebars->27->1006"
14905 + "default.handlebars->27->1008"
14906 ]
14907 },
14908 {
@@ -14919,7 +14919,13 @@
14919 "ru": "Латышский",
14920 "zh-chs": "拉脫維亞語",
14921 "xloc": [
14922 - "default.handlebars->27->1007"
14922 + "default.handlebars->27->1009"
14923 + ]
14924 + },
14925 + {
14926 + "en": "Launch RDP session to this device",
14927 + "xloc": [
14928 + "default.handlebars->27->568"
14929 ]
14930 },
14931 {
@@ -14939,7 +14945,7 @@
14945 "nl": "Leeg laten voor geen.",
14946 "zh-chs": "一无所有。",
14947 "xloc": [
14942 - "default.handlebars->27->1650"
14948 + "default.handlebars->27->1652"
14949 ]
14950 },
14951 {
@@ -14978,7 +14984,7 @@
14984 "ru": "Меньше",
14985 "zh-chs": "減",
14986 "xloc": [
14981 - "default.handlebars->27->1811"
14987 + "default.handlebars->27->1813"
14988 ]
14989 },
14990 {
@@ -14994,8 +15000,8 @@
15000 "ru": "Предельные события",
15001 "zh-chs": "极限赛事",
15002 "xloc": [
14997 - "default.handlebars->27->599",
14998 - "default.handlebars->27->618"
15003 + "default.handlebars->27->601",
15004 + "default.handlebars->27->620"
15005 ]
15006 },
15007 {
@@ -15031,9 +15037,9 @@
15037 "zh-chs": "有限輸入",
15038 "xloc": [
15039 "default-mobile.handlebars->9->427",
15034 - "default.handlebars->27->1326",
15035 - "default.handlebars->27->592",
15036 - "default.handlebars->27->611"
15040 + "default.handlebars->27->1328",
15041 + "default.handlebars->27->594",
15042 + "default.handlebars->27->613"
15043 ]
15044 },
15045 {
@@ -15051,7 +15057,7 @@
15057 "zh-chs": "僅限於輸入",
15058 "xloc": [
15059 "default-mobile.handlebars->9->402",
15054 - "default.handlebars->27->1284"
15060 + "default.handlebars->27->1286"
15061 ]
15062 },
15063 {
@@ -15224,7 +15230,7 @@
15230 "ru": "Linux ARM, Raspberry Pi (32bit)",
15231 "zh-chs": "Linux ARM,Raspberry Pi(32位)",
15232 "xloc": [
15227 - "default.handlebars->27->679"
15233 + "default.handlebars->27->681"
15234 ]
15235 },
15236 {
@@ -15330,7 +15336,7 @@
15336 "ru": "Linux x86 (32bit)",
15337 "zh-chs": "Linux x86(32位)",
15338 "xloc": [
15333 - "default.handlebars->27->676"
15339 + "default.handlebars->27->678"
15340 ]
15341 },
15342 {
@@ -15347,7 +15353,7 @@
15353 "ru": "Linux x86 (64bit)",
15354 "zh-chs": "Linux x86(64位)",
15355 "xloc": [
15350 - "default.handlebars->27->677"
15356 + "default.handlebars->27->679"
15357 ]
15358 },
15359 {
@@ -15382,7 +15388,7 @@
15388 "ru": "Литовский",
15389 "zh-chs": "立陶宛語",
15390 "xloc": [
15385 - "default.handlebars->27->1008"
15391 + "default.handlebars->27->1010"
15392 ]
15393 },
15394 {
@@ -15400,10 +15406,10 @@
15406 "zh-chs": "載入中...",
15407 "xloc": [
15408 "default-mobile.handlebars->9->72",
15403 - "default.handlebars->27->1153",
15404 - "default.handlebars->27->1157",
15405 - "default.handlebars->27->668",
15406 - "default.handlebars->27->886"
15409 + "default.handlebars->27->1155",
15410 + "default.handlebars->27->1159",
15411 + "default.handlebars->27->670",
15412 + "default.handlebars->27->888"
15413 ]
15414 },
15415 {
@@ -15471,7 +15477,7 @@
15477 "ru": "Настройки локализации",
15478 "zh-chs": "本地化設置",
15479 "xloc": [
15474 - "default.handlebars->27->1102",
15480 + "default.handlebars->27->1104",
15481 "default.handlebars->container->column_l->p2->p2info->p2AccountActions->3->7"
15482 ]
15483 },
@@ -15523,7 +15529,7 @@
15529 "ru": "Заблокировать учетную запись",
15530 "zh-chs": "鎖定賬戶",
15531 "xloc": [
15526 - "default.handlebars->27->1511"
15532 + "default.handlebars->27->1513"
15533 ]
15534 },
15535 {
@@ -15540,7 +15546,7 @@
15546 "ru": "Заблокировать учетную запись",
15547 "zh-chs": "鎖定賬戶",
15548 "xloc": [
15543 - "default.handlebars->27->1453"
15549 + "default.handlebars->27->1455"
15550 ]
15551 },
15552 {
@@ -15557,7 +15563,7 @@
15563 "ru": "Заблокирован",
15564 "zh-chs": "已鎖定",
15565 "xloc": [
15560 - "default.handlebars->27->1436"
15566 + "default.handlebars->27->1438"
15567 ]
15568 },
15569 {
@@ -15574,7 +15580,7 @@
15580 "ru": "Заблокированная учетная запись",
15581 "zh-chs": "賬戶鎖定",
15582 "xloc": [
15577 - "default.handlebars->27->1585"
15583 + "default.handlebars->27->1587"
15584 ]
15585 },
15586 {
@@ -15761,7 +15767,7 @@
15767 "ru": "Люксембургский",
15768 "zh-chs": "盧森堡語",
15769 "xloc": [
15764 - "default.handlebars->27->1009"
15770 + "default.handlebars->27->1011"
15771 ]
15772 },
15773 {
@@ -15780,8 +15786,8 @@
15786 "xloc": [
15787 "default-mobile.handlebars->9->331",
15788 "default-mobile.handlebars->9->333",
15783 - "default.handlebars->27->813",
15784 - "default.handlebars->27->815"
15789 + "default.handlebars->27->815",
15790 + "default.handlebars->27->817"
15791 ]
15792 },
15793 {
@@ -15816,7 +15822,7 @@
15822 "zh-chs": "MAC:{0}",
15823 "xloc": [
15824 "default-mobile.handlebars->9->334",
15819 - "default.handlebars->27->816"
15825 + "default.handlebars->27->818"
15826 ]
15827 },
15828 {
@@ -15834,7 +15840,7 @@
15840 "zh-chs": "MAC:{0},網關:{1}",
15841 "xloc": [
15842 "default-mobile.handlebars->9->332",
15837 - "default.handlebars->27->814"
15843 + "default.handlebars->27->816"
15844 ]
15845 },
15846 {
@@ -15892,8 +15898,8 @@
15898 "default.handlebars->27->187",
15899 "default.handlebars->27->393",
15900 "default.handlebars->27->537",
15895 - "default.handlebars->27->864",
15896 - "default.handlebars->27->865",
15901 + "default.handlebars->27->866",
15902 + "default.handlebars->27->867",
15903 "default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->p15outputselecttd->p15outputselect->3"
15904 ]
15905 },
@@ -15928,7 +15934,7 @@
15934 "ru": "MQTT Вход",
15935 "zh-chs": "MQTT登錄",
15936 "xloc": [
15931 - "default.handlebars->27->569"
15937 + "default.handlebars->27->571"
15938 ]
15939 },
15940 {
@@ -15946,7 +15952,7 @@
15952 "zh-chs": "MQTT通道已連接",
15953 "xloc": [
15954 "default-mobile.handlebars->9->246",
15949 - "default.handlebars->27->577"
15955 + "default.handlebars->27->579"
15956 ]
15957 },
15958 {
@@ -15964,7 +15970,7 @@
15970 "zh-chs": "MQTT已連接",
15971 "xloc": [
15972 "default.handlebars->27->147",
15967 - "default.handlebars->27->576"
15973 + "default.handlebars->27->578"
15974 ]
15975 },
15976 {
@@ -16003,6 +16009,12 @@
16009 "default.handlebars->27->151"
16010 ]
16011 },
16012 + {
16013 + "en": "MSTSC",
16014 + "xloc": [
16015 + "default.handlebars->27->569"
16016 + ]
16017 + },
16018 {
16019 "cs": "macOS",
16020 "de": "MacOS",
@@ -16034,7 +16046,7 @@
16046 "ru": "MacOS (64bit)",
16047 "zh-chs": "MacOS(64位)",
16048 "xloc": [
16037 - "default.handlebars->27->678"
16049 + "default.handlebars->27->680"
16050 ]
16051 },
16052 {
@@ -16087,7 +16099,7 @@
16099 "ru": "Сообщения главного сервера",
16100 "zh-chs": "主服務器消息",
16101 "xloc": [
16090 - "default.handlebars->27->1783"
16102 + "default.handlebars->27->1785"
16103 ]
16104 },
16105 {
@@ -16104,7 +16116,7 @@
16116 "ru": "Малайский",
16117 "zh-chs": "馬來語",
16118 "xloc": [
16107 - "default.handlebars->27->1011"
16119 + "default.handlebars->27->1013"
16120 ]
16121 },
16122 {
@@ -16121,7 +16133,7 @@
16133 "ru": "Малаяламский",
16134 "zh-chs": "馬拉雅拉姆語",
16135 "xloc": [
16124 - "default.handlebars->27->1012"
16136 + "default.handlebars->27->1014"
16137 ]
16138 },
16139 {
@@ -16138,7 +16150,7 @@
16150 "ru": "Мальтийский",
16151 "zh-chs": "馬耳他語",
16152 "xloc": [
16141 - "default.handlebars->27->1013"
16153 + "default.handlebars->27->1015"
16154 ]
16155 },
16156 {
@@ -16175,8 +16187,8 @@
16187 "xloc": [
16188 "default-mobile.handlebars->9->399",
16189 "default-mobile.handlebars->9->417",
16178 - "default.handlebars->27->1281",
16179 - "default.handlebars->27->1315"
16190 + "default.handlebars->27->1283",
16191 + "default.handlebars->27->1317"
16192 ]
16193 },
16194 {
@@ -16195,8 +16207,8 @@
16207 "xloc": [
16208 "default-mobile.handlebars->9->398",
16209 "default-mobile.handlebars->9->416",
16198 - "default.handlebars->27->1280",
16199 - "default.handlebars->27->1314"
16210 + "default.handlebars->27->1282",
16211 + "default.handlebars->27->1316"
16212 ]
16213 },
16214 {
@@ -16212,14 +16224,14 @@
16224 "ru": "Управление устройствами",
16225 "zh-chs": "管理设备",
16226 "xloc": [
16215 - "default.handlebars->27->606"
16227 + "default.handlebars->27->608"
16228 ]
16229 },
16230 {
16231 "en": "Manage Recordings",
16232 "nl": "Beheeer opnames",
16233 "xloc": [
16222 - "default.handlebars->27->1510"
16234 + "default.handlebars->27->1512"
16235 ]
16236 },
16237 {
@@ -16253,7 +16265,7 @@
16265 "ru": "Управление группами пользователя",
16266 "zh-chs": "管理用戶組",
16267 "xloc": [
16256 - "default.handlebars->27->1509"
16268 + "default.handlebars->27->1511"
16269 ]
16270 },
16271 {
@@ -16270,8 +16282,8 @@
16282 "ru": "Управление пользователями",
16283 "zh-chs": "管理用戶",
16284 "xloc": [
16273 - "default.handlebars->27->1508",
16274 - "default.handlebars->27->605"
16285 + "default.handlebars->27->1510",
16286 + "default.handlebars->27->607"
16287 ]
16288 },
16289 {
@@ -16375,7 +16387,7 @@
16387 "ru": "Управление с помощью программного агента",
16388 "zh-chs": "使用軟件代理進行管理",
16389 "xloc": [
16378 - "default.handlebars->27->1135"
16390 + "default.handlebars->27->1137"
16391 ]
16392 },
16393 {
@@ -16393,7 +16405,7 @@
16405 "zh-chs": "使用軟件代理進行管理",
16406 "xloc": [
16407 "default-mobile.handlebars->9->379",
16396 - "default.handlebars->27->1163"
16408 + "default.handlebars->27->1165"
16409 ]
16410 },
16411 {
@@ -16410,7 +16422,7 @@
16422 "ru": "Менеджер",
16423 "zh-chs": "經理",
16424 "xloc": [
16413 - "default.handlebars->27->1441"
16425 + "default.handlebars->27->1443"
16426 ]
16427 },
16428 {
@@ -16461,7 +16473,7 @@
16473 "ru": "Маори",
16474 "zh-chs": "毛利人",
16475 "xloc": [
16464 - "default.handlebars->27->1014"
16476 + "default.handlebars->27->1016"
16477 ]
16478 },
16479 {
@@ -16496,7 +16508,7 @@
16508 "ru": "Маратхи",
16509 "zh-chs": "馬拉地語",
16510 "xloc": [
16499 - "default.handlebars->27->1015"
16511 + "default.handlebars->27->1017"
16512 ]
16513 },
16514 {
@@ -16513,7 +16525,7 @@
16525 "ru": "Достигнуто максимальное число сессий",
16526 "zh-chs": "達到的會話數上限",
16527 "xloc": [
16516 - "default.handlebars->27->1747"
16528 + "default.handlebars->27->1749"
16529 ]
16530 },
16531 {
@@ -16567,7 +16579,7 @@
16579 "ru": "Мегабайт",
16580 "zh-chs": "兆字節",
16581 "xloc": [
16570 - "default.handlebars->27->1773"
16582 + "default.handlebars->27->1775"
16583 ]
16584 },
16585 {
@@ -16585,8 +16597,8 @@
16597 "zh-chs": "記憶",
16598 "xloc": [
16599 "default-mobile.handlebars->9->370",
16588 - "default.handlebars->27->1764",
16589 - "default.handlebars->27->852",
16600 + "default.handlebars->27->1766",
16601 + "default.handlebars->27->854",
16602 "default.handlebars->container->column_l->p40->3->1->p40type->3"
16603 ]
16604 },
@@ -16614,8 +16626,8 @@
16626 "default.handlebars->27->356",
16627 "default.handlebars->27->485",
16628 "default.handlebars->27->529",
16617 - "default.handlebars->27->804",
16618 - "default.handlebars->27->811"
16629 + "default.handlebars->27->806",
16630 + "default.handlebars->27->813"
16631 ]
16632 },
16633 {
@@ -16633,7 +16645,7 @@
16645 "zh-chs": "網格代理控制台",
16646 "xloc": [
16647 "default-mobile.handlebars->9->406",
16636 - "default.handlebars->27->1289"
16648 + "default.handlebars->27->1291"
16649 ]
16650 },
16651 {
@@ -16705,8 +16717,8 @@
16717 "ru": "MeshAction (.txt)",
16718 "zh-chs": "MeshAction(.txt)",
16719 "xloc": [
16708 - "default.handlebars->27->685",
16709 - "default.handlebars->27->687"
16720 + "default.handlebars->27->687",
16721 + "default.handlebars->27->689"
16722 ]
16723 },
16724 {
@@ -16723,7 +16735,7 @@
16735 "ru": "Трафик MeshAgent",
16736 "zh-chs": "MeshAgent流量",
16737 "xloc": [
16726 - "default.handlebars->27->1785"
16738 + "default.handlebars->27->1787"
16739 ]
16740 },
16741 {
@@ -16740,7 +16752,7 @@
16752 "ru": "Обновление MeshAgent",
16753 "zh-chs": "MeshAgent更新",
16754 "xloc": [
16743 - "default.handlebars->27->1786"
16755 + "default.handlebars->27->1788"
16756 ]
16757 },
16758 {
@@ -16774,7 +16786,7 @@
16786 "ru": "Ошибки MeshCentral",
16787 "zh-chs": "網格中心錯誤",
16788 "xloc": [
16777 - "default.handlebars->27->1156"
16789 + "default.handlebars->27->1158"
16790 ]
16791 },
16792 {
@@ -16791,7 +16803,7 @@
16803 "ru": "MeshCentral Router ",
16804 "zh-chs": "MeshCentral路由器",
16805 "xloc": [
16794 - "default.handlebars->27->673"
16806 + "default.handlebars->27->675"
16807 ]
16808 },
16809 {
@@ -16808,7 +16820,7 @@
16820 "ru": "MeshCentral Router это инструмент Windows для сопоставления портов TCP. Например, через этот сервер можно установить подключение по RDP к удаленному устройству.",
16821 "zh-chs": "MeshCentral Router是Windows工具,用於TCP端口映射。例如,您可以通過該服務器將RDP放入遠程設備。",
16822 "xloc": [
16811 - "default.handlebars->27->669"
16823 + "default.handlebars->27->671"
16824 ]
16825 },
16826 {
@@ -16843,7 +16855,7 @@
16855 "ru": "Соединения сервера MeshCentral",
16856 "zh-chs": "MeshCentral服務器對等",
16857 "xloc": [
16846 - "default.handlebars->27->1784"
16858 + "default.handlebars->27->1786"
16859 ]
16860 },
16861 {
@@ -16878,7 +16890,7 @@
16890 "zh-chs": "MeshCentral版本",
16891 "xloc": [
16892 "default.handlebars->27->101",
16881 - "default.handlebars->27->1152",
16893 + "default.handlebars->27->1154",
16894 "default.handlebars->27->99"
16895 ]
16896 },
@@ -16898,7 +16910,7 @@
16910 "xloc": [
16911 "default.handlebars->27->202",
16912 "default.handlebars->27->557",
16901 - "default.handlebars->27->683"
16913 + "default.handlebars->27->685"
16914 ]
16915 },
16916 {
@@ -16915,7 +16927,7 @@
16927 "ru": "MeshCmd (Linux ARM, 32bit)",
16928 "zh-chs": "MeshCmd(Linux ARM,32位)",
16929 "xloc": [
16918 - "default.handlebars->27->694"
16930 + "default.handlebars->27->696"
16931 ]
16932 },
16933 {
@@ -16932,7 +16944,7 @@
16944 "ru": "MeshCmd (Linux x86, 32bit)",
16945 "zh-chs": "MeshCmd(Linux x86,32bit)",
16946 "xloc": [
16935 - "default.handlebars->27->691"
16947 + "default.handlebars->27->693"
16948 ]
16949 },
16950 {
@@ -16949,7 +16961,7 @@
16961 "ru": "MeshCmd (Linux x86, 64bit)",
16962 "zh-chs": "MeshCmd(Linux x86,64bit)",
16963 "xloc": [
16952 - "default.handlebars->27->692"
16964 + "default.handlebars->27->694"
16965 ]
16966 },
16967 {
@@ -16966,7 +16978,7 @@
16978 "ru": "MeshCmd (MacOS, 64bit)",
16979 "zh-chs": "MeshCmd(MacOS,64位)",
16980 "xloc": [
16969 - "default.handlebars->27->693"
16981 + "default.handlebars->27->695"
16982 ]
16983 },
16984 {
@@ -16983,7 +16995,7 @@
16995 "ru": "MeshCmd (приложение Win32)",
16996 "zh-chs": "MeshCmd(Win32可執行文件)",
16997 "xloc": [
16986 - "default.handlebars->27->689"
16998 + "default.handlebars->27->691"
16999 ]
17000 },
17001 {
@@ -17000,7 +17012,7 @@
17012 "ru": "MeshCmd (приложение Win64)",
17013 "zh-chs": "MeshCmd(Win64可執行文件)",
17014 "xloc": [
17003 - "default.handlebars->27->690"
17015 + "default.handlebars->27->692"
17016 ]
17017 },
17018 {
@@ -17017,7 +17029,7 @@
17029 "ru": "MeshCmd это утилита с командной строкой, которая позволяет выполнить множество операций. Файл с командами может быть опционально скачан и отредактирован для указания информации о сервере и учетных данных.",
17030 "zh-chs": "MeshCmd是執行許多不同操作的命令行工具。可以選擇下載和編輯操作文件以提供服務器信息和憑據。",
17031 "xloc": [
17020 - "default.handlebars->27->680"
17032 + "default.handlebars->27->682"
17033 ]
17034 },
17035 {
@@ -17090,7 +17102,7 @@
17102 "xloc": [
17103 "default.handlebars->27->313",
17104 "default.handlebars->27->546",
17093 - "default.handlebars->27->649"
17105 + "default.handlebars->27->651"
17106 ]
17107 },
17108 {
@@ -17107,7 +17119,7 @@
17119 "ru": "Диспетчер сообщения",
17120 "zh-chs": "郵件調度程序",
17121 "xloc": [
17110 - "default.handlebars->27->1782"
17122 + "default.handlebars->27->1784"
17123 ]
17124 },
17125 {
@@ -17205,7 +17217,7 @@
17217 "zh-chs": "模型",
17218 "xloc": [
17219 "default-mobile.handlebars->9->371",
17208 - "default.handlebars->27->853"
17220 + "default.handlebars->27->855"
17221 ]
17222 },
17223 {
@@ -17239,7 +17251,7 @@
17251 "ru": "Молдавский",
17252 "zh-chs": "摩爾達維亞人",
17253 "xloc": [
17242 - "default.handlebars->27->1016"
17254 + "default.handlebars->27->1018"
17255 ]
17256 },
17257 {
@@ -17256,7 +17268,7 @@
17268 "ru": "Еще",
17269 "zh-chs": "更多",
17270 "xloc": [
17259 - "default.handlebars->27->1810"
17271 + "default.handlebars->27->1812"
17272 ]
17273 },
17274 {
@@ -17274,7 +17286,7 @@
17286 "zh-chs": "母板",
17287 "xloc": [
17288 "default-mobile.handlebars->9->366",
17277 - "default.handlebars->27->848"
17289 + "default.handlebars->27->850"
17290 ]
17291 },
17292 {
@@ -17332,7 +17344,7 @@
17344 "en": "Multiplexor",
17345 "nl": "Multiplexor",
17346 "xloc": [
17335 - "default.handlebars->27->1725"
17347 + "default.handlebars->27->1727"
17348 ]
17349 },
17350 {
@@ -17447,7 +17459,7 @@
17459 "ru": "Консоль моего сервера",
17460 "zh-chs": "我的服務器控制台",
17461 "xloc": [
17450 - "default.handlebars->27->859"
17462 + "default.handlebars->27->861"
17463 ]
17464 },
17465 {
@@ -17575,8 +17587,8 @@
17587 "ru": "Мой ключ",
17588 "zh-chs": "我的鑰匙",
17589 "xloc": [
17578 - "default.handlebars->27->891",
17579 - "default.handlebars->27->894"
17590 + "default.handlebars->27->893",
17591 + "default.handlebars->27->896"
17592 ]
17593 },
17594 {
@@ -17600,20 +17612,20 @@
17612 "default-mobile.handlebars->9->393",
17613 "default-mobile.handlebars->9->97",
17614 "default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea3->deskarea3x->DeskTools->5->1->1",
17603 - "default.handlebars->27->1133",
17604 - "default.handlebars->27->1164",
17605 - "default.handlebars->27->1247",
17606 - "default.handlebars->27->1423",
17607 - "default.handlebars->27->1516",
17608 - "default.handlebars->27->1532",
17609 - "default.handlebars->27->1539",
17610 - "default.handlebars->27->1572",
17611 - "default.handlebars->27->1591",
17615 + "default.handlebars->27->1135",
17616 + "default.handlebars->27->1166",
17617 + "default.handlebars->27->1249",
17618 + "default.handlebars->27->1425",
17619 + "default.handlebars->27->1518",
17620 + "default.handlebars->27->1534",
17621 + "default.handlebars->27->1541",
17622 + "default.handlebars->27->1574",
17623 + "default.handlebars->27->1593",
17624 "default.handlebars->27->473",
17613 - "default.handlebars->27->727",
17625 + "default.handlebars->27->729",

This file is too large to show in full.

views/default.handlebars
+18 -2
@@ -2195,13 +2195,19 @@
2195 var newWindow = window.open(rdpurl, '_blank');
2196 newWindow.opener = null;
2197 }
2198 - }
2199 - if (message.tag == 'novnc') {
2198 + } else if (message.tag == 'novnc') {
2199 var vncurl = window.location.origin + domainUrl + 'novnc/vnc.html?ws=wss%3A%2F%2F' + window.location.host + '%2Fmeshrelay.ashx%3Fauth%3D' + message.cookie + '&show_dot=1';
2200 var node = getNodeFromId(message.nodeid);
2201 if (node != null) { vncurl += '&name=' + encodeURIComponentEx(node.name); }
2202 var newWindow = window.open(vncurl, 'mcnovnc/' + message.nodeid);
2203 newWindow.opener = null;
2204 + } else if (message.tag == 'mstsc') {
2205 + //var rdpurl = window.location.origin + domainUrl + 'mstsc/index.html?ws=wss%3A%2F%2F' + window.location.host + '%2Fmeshrelay.ashx%3Fauth%3D' + message.cookie;
2206 + var rdpurl = window.location.origin + domainUrl + 'mstsc/index.html?ws=' + message.cookie;
2207 + var node = getNodeFromId(message.nodeid);
2208 + if (node != null) { rdpurl += '&name=' + encodeURIComponentEx(node.name); }
2209 + var newWindow = window.open(rdpurl, 'mcmstsc/' + message.nodeid);
2210 + newWindow.opener = null;
2211 }
2212 break;
2213 }
@@ -5367,6 +5373,11 @@
5373 x += '<a href=# cmenu=rfbPortContextMenu id=rfbLink onclick=p10rfb("' + node._id + '") title="' + "Launch noVNC session to this device" + '.">' + "noVNC" + '</a>&nbsp;';
5374 }
5375
5376 + // MSTSC.js link
5377 + if (((connectivity & 1) != 0) && (node.agent) && ((meshrights & 8) != 0) && ((features & 0x40000000) == 0)) {
5378 + x += '<a href=# cmenu=rfbPortContextMenu id=mstscLink onclick=p10mstsc("' + node._id + '") title="' + "Launch RDP session to this device" + '.">' + "MSTSC" + '</a>&nbsp;';
5379 + }
5380 +
5381 // MQTT options
5382 if ((meshrights == 0xFFFFFFFF) && (features & 0x00400000)) { x += '<a href=# onclick=p10showMqttLoginDialog("' + node._id + '") title="' + "Get MQTT login credentials for this device." + '">' + "MQTT Login" + '</a>&nbsp;'; }
5383 x += '</div><br>'
@@ -5880,6 +5891,11 @@
5891 meshserver.send({ action: 'getcookie', nodeid: nodeid, tcpport: port, tag: 'novnc' });
5892 }
5893
5894 + function p10mstsc(nodeid, port) {
5895 + if (port == null) { if (currentNode.rdpport != null) { port = currentNode.rdpport; } else { port = 3389; } }
5896 + meshserver.send({ action: 'getcookie', nodeid: nodeid, tcpport: port, tag: 'mstsc' });
5897 + }
5898 +
5899 // Show current location
5900 var d2map = null;
5901 function p10showNodeLocationDialog() {
webserver.js
+10
@@ -2157,6 +2157,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
2157 if (domain.sessionrecording != null) { features += 0x08000000; } // Server recordings enabled
2158 if (domain.urlswitching === false) { features += 0x10000000; } // Disables the URL switching feature
2159 if (domain.novnc === false) { features += 0x20000000; } // Disables noVNC
2160 + if (domain.mstsc !== true) { features += 0x40000000; } // Disables MSTSC.js
2161
2162 // Create a authentication cookie
2163 const authCookie = obj.parent.encodeCookie({ userid: user._id, domainid: domain.id, ip: req.clientIp }, obj.parent.loginCookieEncryptionKey);
@@ -4342,6 +4343,15 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4343 obj.app.get(url + 'pluginHandler.js', obj.handlePluginJS);
4344 }
4345
4346 + // Setup MSTSC.js if needed
4347 + if (domain.mstsc === true) {
4348 + obj.app.ws(url + 'mstsc/relay.ashx', function (ws, req) {
4349 + PerformWSSessionAuth(ws, req, false, function (ws1, req1, domain, user) {
4350 + require('./mstsc.js').CreateMstscRelay(obj, obj.db, ws1, req1, obj.args, domain, user);
4351 + });
4352 + });
4353 + }
4354 +
4355 // Setup auth strategies using passport if needed
4356 if (typeof domain.authstrategies == 'object') {
4357 const passport = domain.passport = require('passport');