diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..28bb8df --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# MacOSX Finder ***** +.DS_Store + +# Webstorm ********** +.idea + +# Grunt dep ********* +node_modules +package-lock.json \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..933b3a3 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,165 @@ +module.exports = function(grunt) { + + // Project configuration. + grunt.initConfig({ +// minify js + uglify: { + options: { + //sourceMap: true, + compress: true, + comments: false + }, + main_thread: { + files: { + 'build/temp/gui.min.js': [ + // THESE MUST BE IN CORRECT ORDER.... ADD NEW FILES HERE + 'src/gui_easy_settings.js', + 'src/gui_easy_settings_config_table.js', + 'src/gui_easy_default_settings.js', + 'src/gui_easy_helper.js', + 'src/gui_easy_curly.js', + 'src/gui_easy_curly_unit.js', + 'src/gui_easy_curly_page.js', + 'src/gui_easy_curly_icons.js', + 'src/gui_easy_curly_forms.js', + 'src/gui_easy_scrubber.js', + 'src/gui_easy_popper.js', + 'src/gui_easy_popper_rules.js', + 'src/gui_easy_pitcher.js', + 'src/gui_easy_butler.js', + 'src/gui_easy_tender.js', + 'src/gui_easy_ini.js' + ], + 'build/temp/forms.min.js': [ + 'src/forms/gui_easy_forms.js', + 'src/forms/gui_easy_forms_p*.js', + 'src/forms/gui_easy_forms_c*.js', + 'src/forms/gui_easy_forms_n*.js' + ], + 'build/temp/dash.min.js': [ + 'src/dash/gui_easy_dash.js', + 'src/dash/gui_easy_dash_d*.js' + ] + } + } + }, +// minify css + cssmin: { + options: { + mergeIntoShorthands: false, + roundingPrecision: -1 + }, + target: { + files: {'build/temp/gui.min.css': ['src/gui_easy.css']} + } + }, +// make one file of them all + processhtml: { + main: { + files: {'build/temp/index.min.html': ['index.html']} + } + }, +// clean the release folder + clean: { + temp: { + src: ['build/temp'] + }, + version: { + src: ['build/<%= version %>'] + } + }, +// zip source to temp folder + gzip the gui html single file + compress: { + source: { + options: { + archive: 'build/temp/src-<%= version %>.zip' + }, + files: [ + { + flatten: false, + src: ['src/*','src/forms/*','src/dash/*', 'index.html','Gruntfile.js','package.json'], + dest: '/', + filter: 'isFile' + } + ] + }, + main: { + options: { + mode: 'gzip', + level: 9 //default is 1, max is 9 + }, + files: [{ + expand: true, + src: ['build/temp/index.min.html'], + dest: '.', + ext: '.htm.gz' + }] + }, + mini: { + options: { + mode: 'gzip', + level: 9 + }, + files: [{ + expand: false, + src: ['src/index-minimal.html'], + dest: 'build/temp/mini/index.htm.gz' + }] + } + }, +// rename the temp folder + rename: { + temp: { + files: [ + { + src: ['build/temp'], + dest: 'build/<%= version %>' + } + ] + } + } +}); + + // Load the plugin(s) + grunt.loadNpmTasks('grunt-contrib-uglify-es'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-rename'); + grunt.loadNpmTasks('grunt-contrib-compress'); + grunt.loadNpmTasks('grunt-processhtml'); + + // build gui easy task + grunt.registerTask('buildGuiEasy', 'Will build the project', + function () { + let settings = grunt.file.read('src/gui_easy_settings.js'); + settings = settings.match(/--GRUNT-START--([\s\S]*?)\/\/--GRUNT-END--/)[1]; + let guiEasy = "{" + settings + "}"; + guiEasy = guiEasy.replace(/'/g,"\""); + guiEasy = JSON.parse(guiEasy); + let version; + if (guiEasy.development === true && guiEasy.releaseCandidate > 0) { + version = guiEasy.major + '.' + guiEasy.minor + '.rc' + guiEasy.releaseCandidate + '.' + guiEasy.minimal; + } else if (guiEasy.development === true) { + version = guiEasy.major + '.' + guiEasy.minor + '.nightly.' + guiEasy.minimal; + } else { + version = guiEasy.major + '.' + guiEasy.minor + '.' + guiEasy.minimal; + } + grunt.log.ok(version); + // add version as a property for the grunt ini loop + grunt.config("version", version); + grunt.task.run( + 'clean', + 'uglify', + 'cssmin', + 'processhtml', + 'compress', + 'rename' + ) + }); + + // the 'default' task can be run just by typing "grunt" on the command line + grunt.registerTask('default', [ + 'buildGuiEasy' + ]); + +}; \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..a24e763 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1 @@ +(c) Copyright 2019 Grovkillen AB, all rights reserved. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f85346c --- /dev/null +++ b/README.md @@ -0,0 +1,364 @@ +# GUI Easy + +This is the front end of the [ESP Easy](https://github.com/letscontrolit/ESPEasy) firmware. +As of version 2.1.0 of the firmware GUI Easy is the frontend that you will download in order +to get a graphical user interface, by default the units are only accessed using a JSON based +API. We are completely independent code wise which makes it ideal to use even if no +internet is available, all you need to have is within the gzipped file. + +## Getting Started + +If you want to manually download and install the front end you should head over to the +[build](/build) directory and find a release you want to use. The builds marked with +**nightly** and **rcN** are not to be used in production, only as tests. Inside the +[build](/build)/**version** folder you will find the following files: + +* gui.min.css +* gui.min.js +* index.htm.gz ← **This is what you're looking for** +* index.min.html +* src-````.zip +* mini/index.htm.gz + +Of these five files the actual GUI Easy "engine" is compiled into the **index.htm.gz** file. +The minified css, js, and html files are the backbone of this gz:ed file. The src-````.zip +is the source code of the project as it was at the time of compile. In the directory **mini** +you will find the minimal interface used as default fallback GUI. + +### Compile Yourself + +If you plan on contributing to the project you need to be able to compile stuff yourself in +order to bug test as close as release conditions as possible. What you need to do: + +1. Install [Node.js](https://nodejs.org/en/download/), this will include [npm](https://www.npmjs.com/get-npm) which is what we use +to compile the project. +2. Install [Grunt.js](https://gruntjs.com/) (use the command line once ``npm`` is installed) +3. Install Grunt dependencies ([package.json](/package.json), run ``npm install``) + +Install Grunt using your command line interface, and thanks to npm it's this easy: + +``` +npm install -g grunt-cli +``` + +The compile is then done using your command line once again, make sure you're in the same +directory as the **Gruntfile.js** (this is the root of the project). Run the compile script +using this command: + +``` +grunt +``` + +The script will output something like this: + +``` +Running "buildGuiEasy" task +>> 0.0.nightly.1 + +Running "clean:temp" (clean) task +>> 1 path cleaned. + +Running "clean:version" (clean) task +>> 0 paths cleaned. + +Running "uglify:main_thread" (uglify) task +>> 1 file created 227.5 kB → 136.67 kB + +Running "cssmin:target" (cssmin) task +>> 1 file created. 100.84 kB → 86.81 kB + +Running "processhtml:main" (processhtml) task + +Running "compress:source" (compress) task +>> Compressed 1 file + +Running "compress:main" (compress) task +>> Compressed 1 file + +Running "compress:mini" (compress) task +>> Compressed 1 file + +Running "rename:temp" (rename) task +Renaming Directory build/temp -> build/0.0.nightly.1 + +Done. +``` + +Congrats, you just compiled your build from source! + +### Source Code Ideology + +As you will find out the source code is composed by several individual JavaScript files. +You need to understand that source code and release build code are two vastly different +types of code. The source code base needs to be easy to overlook and "full of comments", +whereas the release build should be as small as possible. This is why we use Grunt to +compile the source into build code. + +We use a SPA (single page application) approach for our GUI. The idea of a SPA is that +the browser will never need to jump to new pages, they are all loaded from the root of +the web server. The data from the unit, which is constantly updating, is the only thing +that is needed to be fetch - not the html elements. This way we save a lot of computing +operations of the tiny micro processor which the web server is run by. + +#### Targeted Web Browsers + +We cannot allow us to have backwards compatibility with old web technology (as in IE11 +and earlier), newer browsers are always up to date which makes it easier to create a stable +GUI. + +#### index.html + +The **index.html** is the skeleton of the entire project. We will put all our dynamic +html elements into this skeleton, thus creating the complete interface. Lets break the +file down, leaving out the generic html syntax and only focusing on what makes this +project a bit different compared to other projects. + +``` + + + + + + +... + + + +``` + +The comments ```` and ```` ending with +```` are very important for the compile script. These lines tell +the script that the files in-between the opening and closing comments should be +made into one, minified, file and copied to the temp folder. If new ``.js`` files are +created they need to be added to the ``Gruntfile.js`` file as well! + +After the head we have the body, this is where we put all the visible elements. To +make the build up of the interface as easy as possible we have created a simple markdown +syntax based on opening and closing curly brackets `{{..}}`. There's three major ``div`` +elements which you should be aware of: + +##### view-got-box-shadows [class] + +This ``div`` is only used to give the page a shadow in the top and bottom of the view, +the idea is to get a feeling that the page scrolls beneath the border. + +##### modal-container [id] + +This ``div`` is used to throw modal messages, menus, and the boot screen. Since we want +something to be displayed on the screen until the entire page is ready to be displayed +we need to put static html here. This is where the loading animation comes in. + +###### fallback-loading-animation [id] + +If the boot sequence isn't successful we still want to see something on the screen. +So we put five dots that pulses, this would be the equivalent of Windows' ``blue screen +of death`` or Amiga's ``guru meditation``. In other words, not good. But still a necessity. + +###### modal-loading-screen [id] & boot sequence + +Here we put the boot sequence information, the boot (and post boot) are made up of the +following hocus pocus: + +* Helper +* Curly +* Scrubber +* Popper +* Pitcher +* Butler +* Tender +* Snitch + +These guys are what's making the SPA run smoothly. They can be divided into four groups: + +* All around (Helper) +* Builders (Curly, Scrubber, Popper, Pitcher) +* Sprinters (Butler, Snitch) +* Runner (Tender) + +We like to think of this bunch as the [Snap, Crackle and Pop](https://en.wikipedia.org/wiki/Snap,_Crackle_and_Pop) +mascots of the cereal Rice Krispies. Fun, hardworking, dudes that makes our day a bit +brighter by their simple existence. + +The _all around_ ``Helper`` is used by all the other guys, it doesn't initiate anything +on its own. It only acts on other's request. + +_Builders_ are the ones working during the boot. ``Curly`` turn all the ``{{..}}`` into static +html code, some curlies got curlies inside them, so Curly will run as many times as needed +to get all the code converted. ``Scrubber`` got a pretty easy job, it makes some of the +static html code ready for the next guy in line by adding classes and tweaking some elements +etc. ``Popper``, on the other hand, is constantly aware by creating events and functions +that will create html on-the-fly when these events are fired. Right after that ``Pitcher`` +enters the scene and start fetching data from the unit, this guy's only a one time +sprinter and will create the data object and populate the html page with initial values. + +_Sprinters_ will get and push data from and to the internet. ``Butler`` get (crude) +location of the client's IP address together with language etc. ``Snitch`` is the guy telling our server +that a new unit has been installed, together with the closest city name, only used for our +internal statistics. We respect the individuals integrity and only use this to know the +fragmentation of the installations. This way we get a better understanding if we need to have full +backwards compatibility etc. etc. + +Finally we have the _runner_, currently only one is existing, ``Tender``. The idea is that +these will continuously get data to and from the unit(s). + +###### {{NAVBAR}} [curly] + +The top navbar which contains the tabs. We have two "right" navbar elements, one for full +view and one for mobile view. The "right" navbar will be on the second row if the screen +isn't big enough to have the "left" and "right" side-by-side. + +###### {{WAVE}} [curly] + +The wave is one of our elements we can use to notify our users about stuff, it's mainly used +to display single words together with a color. As an example, if the user click "save" the wave +element will cover the entire view with the text "save" in the "middle" and the color will +be set to "success" (green), more on colors later. The message will only last for a second or +so and then go away. + +##### page-container [id] + +Inside this container we have multiple sub-containers with the class _container_, these +containers corresponds to a tab with the exact same name. This will make the Popper display +the correct container if a tab is clicked. + +##### {{NOTIFIER-TOP}} [curly] + +The top notifier is used to notify the user about states and errors. It can display short +sentences together with a color. The user can click to close this notifier and you can +also have it automatically close by setting a countdown timer. + +##### {{MENU-ACTION}} [curly] + +Sticky action button in lower right corner. It floats over all elements but never goes out of +view. This menu will only host shortcuts to modal menus and settings save, cancel etc. + +##### {{DRAWER-THEME}} [curly] **Patreon feature!** + +A drawer is a menu that resides at the bottom and is accessed by clicking on the tab. The +theme drawer hosts all the settings related to the look and feel of the interface. + +##### footer [class] + +This is where we have the information that always is displayed. The logo together with sponsors +are placed here. + +#### CSS Variables + +``` +--scale-size: 16; +--row-size: 20; +--overflow-tab-text-size: 24; +--max-width-page-size: 1400px; +--state-of-navbar-toggle: fixed; +--button-radius-size: 1; +--main-bg-color: 52,146,226; +--main-inverted-color: 47,66,82; +--main-sunny-color: 255,209,0; +--main-info-color: 255,143,18; +--main-warning-color: 239,72,61; +--main-success-color: 0,174,65; +--main-font-color: 255,255,255; +--default-font-family: "Segoe UI",Calibri,Arial; +``` + +### dataset [syntax] + +By setting different datasets for click etc. the Popper will automatically create events +for these elements. Please refer to the source code on all different ways of doing this. + +### TODO: [syntax] + +By commenting using the `TODO:` syntax it's easier to find where to start digging. + +### Editor + +Any text editor will do but officially we use [WebStorm](https://www.jetbrains.com/webstorm/) by JetBrains. + +## Version Schema + +We use the following version schema (and is set in the [gui_easy_settings.js](/src/gui_easy_settings.js) file): + +``X.Y.Z`` + +X = major version number: a big jump in features or refactoring of code. This is always +set manually when an official new release is deployed. + +Y = minor version number: any new features or updates will render at least a minor bump. +This is always set manually when an official new release is deployed. + +Z = minimal version number: any change in source code will be followed by a bump in +the minimal version number. This is always set automatically each night by our robot. +Official releases will always reset this number back to zero and at only very rare +occasions (critical bug fix etc.) be part of a official release version. + +Apart from these three levels we also have the ``nightly`` and ``rc`` tags. These +are set if the release is made by the robot. The tag is injected into the version name +between the ``Y`` and ``Z``. + +The full version name exemplified: + +``0.0.nighlty.1`` + +``1.2.rc1.112`` + +``2.3.0`` + +When the Gruntfile.js file is executed it will look into the source and parse the version +data. This is made possible by the opening ``//--GRUNT-START--`` and closing ``//--GRUNT-END--`` +tags. Please observe that the ``,`` after the closing tag need to be on the line below +the tag for the script to function correctly. + +## CSS Framework + +The entire CSS framework can be used for any other web site or project but currently we haven't +created a demo site with code examples. This might change in the future if other uses of +this framework is gaining interest. The same goes for JavaScript components which are currently +very ESP Easy specific. + +## Queen Bee & Drones + +By default a unit that have the ``index.htm.gz`` file on-board will act as the "Queen Bee". +The Queen is hosting the web interface and all other units that is stored in the Queen's node +list will be referred to as "Drones", units that will only be reached using API. A Queen +and the following Drones form a "Swarm" of units. This means that by simply browsing to +a Queen you can jump to all the Drones in that Swarm without the need of loading the html +code more than once. This makes surfing the Swarm a breeze, for you and the units. + +## Dash + +We use something we call ``dash``'s to create small widgets which can be either populated +with data or used for human interaction (buttons, sliders etc.). They can use ``curly`` or +``html`` syntax and reside in a square element on the custom dashboard. + +## Forms + +The ``controllers``, ``plugins``, and ``notification`` setup pages are defined by their +corresponding page. These can, similar to dash's, use either html or curly syntax. + +## Sponsorship + +We are happy for any means of funding you may want to send our way. Please use one of these +channels: + +* [Ko-Fi](https://ko-fi.com/GrovkillenTDer): one time (public) +* [PayPal](https://www.paypal.me/espeasy): one time (anonymous) +* [Patreon](https://www.patreon.com/GrovkillenTDer): reoccurring (monthly, extra features, public) + +## Authors + +* **Jimmy "Grovkillen" Westberg** - *Initial work* - +[Github](https://github.com/Grovkillen), +[Dribbble](https://grovkillen.dribbble.com) + +Full list of [contributors](https://github.com/letscontrolit/GUIEasy/contributors) +who participated in this project. + +## License + +Please refer to [LICENSE.md](LICENSE.md) file for details. + +## Acknowledgments + +* All icons are sponsored by [ICONS8](https://icons8.com/) +* Location lookup using [ipapi.co](https://ipapi.co/) +* Inspiration for the terminal look of the Drones come from ``Terminal.css`` found [here](https://terminalcss.xyz/) \ No newline at end of file diff --git a/build/0.0.nightly.1/dash.min.js b/build/0.0.nightly.1/dash.min.js new file mode 100644 index 0000000..08ab23d --- /dev/null +++ b/build/0.0.nightly.1/dash.min.js @@ -0,0 +1 @@ +guiEasy.dash=function(s){return guiEasy.dash["D"+("000"+s).slice(-3)]},guiEasy.dash.D001="\nAdd HTML or CURLY here...\n"; \ No newline at end of file diff --git a/build/0.0.nightly.1/forms.min.js b/build/0.0.nightly.1/forms.min.js new file mode 100644 index 0000000..e79e7e1 --- /dev/null +++ b/build/0.0.nightly.1/forms.min.js @@ -0,0 +1 @@ +guiEasy.forms=function(r,s){return guiEasy.forms[r](s)},guiEasy.forms.regEx=function(r){guiEasy.syntax.curlyLC++;const s=/(?:{{)([^}]{1,256})(?:}})/g;let n,a=[];for(;n=s.exec(r);)a.push([n[1],n[0]]);for(let r=0;rdiv:not(.area-title){display:none}div.area>div.area-title{margin-bottom:.2px;border-bottom:none}div.area:not(.hide-contents)>div.area-title{margin-bottom:3px;border-bottom:2px solid rgba(var(--main-inverted-color),.15)}div.area>div.column{padding:0 3px}div.column{flex:1}div.row{display:none}div.row:not(:empty){display:flex;flex-flow:row wrap;justify-content:flex-start;margin-bottom:3px}div.row:last-child{margin-bottom:8px}div.row>span{margin:4px 3px 5px 4px}button#modal-title-button-close::after{content:''}button.countdown#modal-title-button-close::after{height:calc(1.15 * var(--default-height-size,21pt));position:absolute;top:50%;right:50%;border-top:solid calc(.1 * var(--default-height-size,20)) red;animation-name:countdown;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear}div.top-notifier{background-color:var(--main-info-color-rgba,#ff0);cursor:pointer;padding-top:4px;padding-bottom:calc(.5 * var(--default-height-size,21pt));box-shadow:0 10px 10px -10px rgba(var(--main-inverted-color),.5);z-index:899;position:absolute;top:0;left:0;width:100%}div.top-notifier::before{background:inherit;top:0;left:0;width:100%;content:"";height:calc(.15 * var(--default-height-size,21pt));position:fixed}div#countdown-bar div.top-notifier{padding-top:0}div.top-notifier::after{position:absolute;right:8px;content:'\00d7'}div.top-notifier.no-click::after{content:''}div.top-notifier:hover::after{color:#000}div.top-notifier:empty{display:none}div.top-notifier>div#countdown-bar{background:var(--main-font-color-rgba,#fff);height:4px;width:0;transition:all 1s linear}div.bottom-drawer{transition:height .1s ease-in-out}div.bottom-drawer{color:var(--main-bg-color-rgba);z-index:799;position:fixed;width:100%;max-width:var(--max-width-page-size,1200px);bottom:0;filter:drop-shadow(0 -6px 6px rgba(var(--main-inverted-color), .15)) drop-shadow(0 -6px 12px rgba(var(--main-inverted-color), .75))}div.bottom-drawer.is-inactive{height:calc(1.42 * var(--default-height-size,20));filter:none;pointer-events:none}div.bottom-drawer.is-inactive>div.bottom-tab{pointer-events:all}div.bottom-drawer.is-full-size{height:calc(1.42 * var(--default-height-size,20) + 90vh)}div.bottom-drawer.is-half-size{height:calc(1.42 * var(--default-height-size,20) + 50vh)}div.bottom-drawer.is-quarter-size{height:calc(1.42 * var(--default-height-size,20) + 25vh)}div.bottom-drawer.is-small-size{height:calc(1.42 * var(--default-height-size,20) + 10vh)}div.bottom-drawer::before{content:'\a0';position:absolute;pointer-events:none;top:0;left:0;z-index:929;margin-top:calc(1.42 * var(--default-height-size,20));width:calc(99.5% - .3 * var(--default-height-size,20)/ var(--button-radius-size,2));box-shadow:inset 0 30px 25px -20px rgba(var(--main-inverted-color),1)}div.bottom-tab{display:flex;background-color:var(--main-inverted-color-rgba);padding:2px 8px 6px;width:auto;position:absolute;top:4px;cursor:pointer;border-top-left-radius:calc(.25 * var(--default-height-size,20)/ var(--button-radius-size,2));border-top-right-radius:calc(.25 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.bottom-tab>svg{height:calc(1.2 * var(--default-height-size,20))}div.bottom-tab path{fill:var(--main-bg-color-rgba,#00f)}div.bottom-tab::after{content:'\a0\25bc'}div.bottom-drawer.is-inactive>div.bottom-tab::after{content:'\a0\25b2'}div.bottom-container::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px 5px rgba(var(--main-font-color),.25);background:0 0;border-top:solid calc(.55 * var(--default-height-size,20)/ var(--button-radius-size,2)) transparent;border-bottom:solid calc(.55 * var(--default-height-size,20)/ var(--button-radius-size,2)) transparent}div.bottom-container{scrollbar-color:rgba(var(--main-font-color),.25) transparent;scrollbar-width:thin;margin-top:calc(1.45 * var(--default-height-size,20));background-color:var(--main-inverted-color-rgba);position:relative;height:100%;overflow-y:scroll;overflow-x:hidden;padding-top:calc(.5 * var(--default-height-size,20));padding-left:2px;padding-right:2px;border-top-right-radius:calc(.55 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.bottom-container::after{content:'\a0';position:absolute;width:100%;height:calc(3 * var(--default-height-size,20))}div.bottom-container>div.area{margin-left:6px;margin-right:6px;padding:calc(.45 * var(--default-height-size,20) + 1px);border:2px solid rgba(var(--main-bg-color),.5);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.bottom-container>div.area>div.area-title{margin:calc(-.55 * var(--default-height-size,20) + 1px);width:calc(100% + .95 * var(--default-height-size,20)/ var(--button-radius-size,2) + 1px);border-radius:calc(.92 * var(--default-height-size,20)/ var(--button-radius-size,2));background:rgba(var(--main-bg-color),.4)}div.bottom-container>div.area>div.area-title:not(.hide-contents){margin-bottom:calc(.45 * var(--default-height-size,20) + 1px);border-radius:calc(.92 * var(--default-height-size,20)/ var(--button-radius-size,2)) calc(.92 * var(--default-height-size,20)/ var(--button-radius-size,2)) 0 0;border-bottom:2px solid rgba(var(--main-bg-color),.15)}div.footer{position:relative;float:left;clear:both;left:50%;transform:translateX(-50%);margin-top:calc(1 * var(--default-height-size,20) + 10px);margin-bottom:calc(1 * var(--default-height-size,20) + 10px)}div.menu~div.footer{margin-top:calc(-2.5 * var(--default-height-size,20) + 13px)}div.alt-popup{z-index:999;position:absolute;width:calc(.7 * var(--default-height-size,20));top:0;right:3px;color:var(--main-inverted-color-rgba);background:var(--main-font-color-rgba,#fff);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));font-size:calc(.6 * var(--default-font-size,19pt))}.got-tooltip{cursor:help;text-decoration:none;position:relative}.got-tooltip::after{content:'\2a';margin-left:3px;position:relative;font-weight:400;font-size:calc(.7 * var(--default-font-size,19pt))}label.got-tooltip::after{margin-left:-1px;margin-top:8px}.hidden-tooltip.got-tooltip::after{content:''}div.tooltip{pointer-events:none;font-weight:400;text-indent:0;border:2px solid rgba(var(--main-bg-color),.5);border-radius:calc(.25 * var(--default-height-size,20)/ var(--button-radius-size,2));padding:5px 5px 5px 5px;z-index:100;color:var(--main-font-color-rgba,#fff);background:rgba(var(--main-inverted-color),.9);top:calc(1.35 * var(--default-height-size,20));position:absolute;text-decoration:none;transform:translateX(-50%);left:50%;opacity:0;white-space:nowrap}label>div.got-tooltip{width:0}label>div.got-tooltip>div.tooltip{left:calc(7 * var(--default-height-size,20));position:absolute}div.tooltip::after{content:" ";position:absolute;top:-14px;left:50%;margin-left:-6px;border-width:6px;border-style:solid;border-color:transparent transparent rgba(var(--main-bg-color),.5) transparent}.got-tooltip:hover{color:rgba(var(--main-font-color),.5)}.got-tooltip:hover>div.tooltip{pointer-events:all;transition:opacity .1s linear;opacity:1}@media (hover:none){#icon-button-list .tooltip,button.file-action{opacity:1}}body{background-color:var(--main-bg-color-rgba,#00f);color:var(--main-font-color-rgba,#fff);font-family:var(--default-font-family, '"Segoe UI", Calibri, Arial');font-size:calc(1 * var(--default-font-size,19pt));text-align:center;max-width:var(--max-width-page-size,none);min-width:var(--min-width-page-size,420px);margin:auto}a:-webkit-any-link{text-decoration:none;color:var(--main-font-color-rgba,#fff)}a:visited{color:var(--main-font-color-rgba,#fff)}span{margin:calc(.1 * var(--default-height-size,20));position:relative;top:calc(.05 * var(--default-height-size,20) * 1px)}img{border-style:none}div.modal-table,div[id=node-list]>table{width:100%}table,td,th{border-collapse:collapse;border-spacing:1px;border:2px solid rgba(var(--main-inverted-color),.5);width:-moz-available}th{background:rgba(var(--main-inverted-color),.4)}th.header{font-size:calc(.75 * var(--default-font-size,19pt))}td.value-row.device{word-wrap:break-word}div.controller-row.flex,div.device-row.flex,div.notification-row.flex,div.value-row.flex{display:flex;justify-content:space-between}div.controller-row.title,div.device-row.title{color:rgba(var(--main-font-color),.5)}div.controller-row.is-hidden+hr,div.controller-row.title:empty,div.controller-row:empty~hr,div.device-row.is-hidden+hr,div.device-row.title:empty,div.device-row:empty~hr,div.notification-row.is-hidden+hr,div.notification-row.title:empty,div.notification-row:empty~hr,div.value-digits:empty,div.value-name:empty,div.value-row.is-hidden+hr,div.value-row:empty~hr{display:none}div.value-name.classic{margin:4px}div.value-digits.classic{margin:2px;padding-left:2px;padding-right:2px;border-radius:calc(.25 * var(--default-height-size,20)/ var(--button-radius-size,2));border:2px solid rgba(var(--main-inverted-color),.2);background-color:var(--main-success-color-rgba,green)}div.value-row.not-enabled>div.value-digits.classic{color:rgba(var(--main-font-color),.5);background-color:var(--main-inverted-color-rgba,grey)}div.controller-row.title::after,div.device-row.title::after,div.notification-row.title::after,div.value-name::after{content:":";color:rgba(var(--main-font-color),.5)}div.controller-row.title:empty::after,div.device-row.title:empty::after,div.notification-row.title:empty::after,div.value-name:empty::after{content:""}tr:nth-child(odd){background:rgba(var(--main-inverted-color),.2)}div.modal-table th{background:rgba(var(--main-font-color),.4)}div.modal-table table,div.modal-table td,div.modal-table th{border:2px solid rgba(var(--main-font-color),.5)}div.modal-table tr:nth-child(odd){background:rgba(var(--main-font-color),.25)}div.modal-table tr:nth-child(even){background:rgba(var(--main-font-color),.15)}div.message hr{background:rgba(var(--main-font-color),.5)}hr{width:100%;height:2px;background:rgba(var(--main-inverted-color),.5);border:none}div.bottom-container hr{background:rgba(var(--main-bg-color),.5)}div.value-row>hr,td>hr{width:calc(100% + 2px);margin:0 0 0 -1px}nav{z-index:100;width:calc(100% - 8px);max-width:calc(var(--max-width-page-size,none) - 8px);overflow:hidden;padding:14px 4px 4px;background-color:var(--main-bg-color-rgba,#00f);top:0;position:var(--state-of-navbar-toggle,fixed);box-shadow:0 10px 10px -10px rgba(var(--main-inverted-color),.5);border-bottom:2px solid rgba(var(--main-inverted-color),.5)}ul.nav{display:flex;padding:0;margin:auto;list-style:none}ul.nav-small-screen{list-style:none;position:absolute;top:calc(.4 * var(--default-height-size,20) + 20px);padding-inline-start:4px}li.nav{position:relative}li.nav-middle-area{z-index:5;margin-top:4px;margin-left:auto;margin-right:auto}div.nav{transition:all .3s;cursor:pointer;padding:2px 5px calc(1.4 * var(--default-height-size,20) + 20px);background:var(--main-bg-color-rgba,#00f);overflow:hidden;margin-right:3px;margin-left:3px;border:2px solid rgba(var(--main-inverted-color),.5);border-radius:calc(.5 * var(--default-height-size,20)/ var(--button-radius-size,2)) calc(.5 * var(--default-height-size,20)/ var(--button-radius-size,2)) calc(0 * var(--default-height-size,20)/ var(--button-radius-size,2)) calc(0 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.nav-group{display:flex}div.nav-selected{box-shadow:inset 0 calc(1.4 * var(--default-height-size,20) + 20px) calc(1.4 * var(--default-height-size,20) + 20px) rgba(var(--main-inverted-color),.75)}div.nav{display:flex}div.nav.icon>div.tab-text,div.nav.text>div.tab-icon{display:none}div.nav.text>div.tab-text{display:block}div.bottom-tab>svg,div.nav.icon>div.tab-icon{display:block}div.bottom-tab>svg,div.nav.text>div.tab-icon{margin-right:4px}div.tab-icon>svg{width:calc(1 * var(--default-height-size,20));transform:translateY(calc(.1 * var(--default-height-size,20)))}progress{width:100%;height:calc(1.5 * var(--default-height-size,20));background:var(--main-font-color-rgba,#fff);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));padding:calc(.2 * var(--default-height-size,20)) calc(.2 * var(--default-height-size,20)) calc(.2 * var(--default-height-size,20))}progress[value]::-webkit-progress-value{background-color:var(--main-success-color-rgba);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2))}progress[value]::-webkit-progress-bar{background-color:rgba(var(--main-bg-color),.5);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2))}progress.is-small{height:calc(.8 * var(--default-height-size,20) + 2px)}progress[value].main-info::-webkit-progress-value{background-color:var(--main-info-color-rgba)}progress[value].main-warning::-webkit-progress-value{background-color:var(--main-warning-color-rgba)}progress[value].main-sunny::-webkit-progress-value{background-color:var(--main-sunny-color-rgba)}progress[value].main-inverted::-webkit-progress-value{background-color:var(--main-inverted-color-rgba)}button,input,input[type=range],label,progress,select,textarea{font-family:var(--default-font-family, '"Segoe UI",Calibri,Arial');border:2px solid var(--main-bg-color-rgba,#00f);cursor:pointer;display:flex}button{background:var(--main-bg-color-rgba,#00f);color:var(--main-font-color-rgba,#fff);font-size:calc(1.1 * var(--default-font-size,19pt));display:inline-block;padding:0 calc(.3 * var(--default-height-size,20)) calc(.1 * var(--default-height-size,20));border:2px solid rgba(var(--main-font-color),.75);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.row>button{margin-right:4px;margin-bottom:4px}div.menu{position:sticky;bottom:8px;padding:30px;float:right;z-index:19999;overflow:visible;display:flex;flex-flow:column-reverse;height:calc(2 * var(--default-height-size,20) + 3px)}button>svg{transform:translateY(4px)}button.menu-action>svg.action>path{fill:rgba(var(--main-font-color),.5)}button.menu-action.open>svg.action>path{fill:rgba(var(--main-font-color),.9)}div.icon-button{display:flex;flex-flow:column-reverse}button.dash-button,button.icon-button,div.icon-button>button{content:'';margin-top:8px;position:relative;height:calc(2.5 * var(--default-height-size,20) + 3px);width:calc(2.5 * var(--default-height-size,20) + 3px);border:2px solid rgba(var(--main-inverted-color),.2);border-radius:calc(2.5 * var(--default-height-size,20)/ var(--button-radius-size,2));box-shadow:0 3px 6px rgba(var(--main-inverted-color),.25),0 3px 6px rgba(var(--main-inverted-color),.35);z-index:750;transition:all 250ms}button.dash-button{z-index:50}div.icon-button.closed>button:not(.icon-button){transform:rotateY(90deg);overflow:hidden;opacity:0}button.icon-button.is-inactive:hover{background:rgba(var(--main-inverted-color),.5)}button.menu-action:not(.is-inactive){margin-top:calc(1px * (25 - 10 / var(--button-radius-size,1)));transform:rotate(45deg)}div.closed{pointer-events:none}.icon-button>button.got-tooltip{overflow:visible;cursor:pointer}.icon-button div.tooltip>div.text{float:right;border:2px solid var(--main-inverted-color-rgba);background-color:var(--main-inverted-color-rgba);padding:4px 6px 6px;border-radius:calc(.25 * var(--default-height-size,20)/ var(--button-radius-size,2))}.icon-button button.got-tooltip::after{display:none}.icon-button button.got-tooltip>div.tooltip{transform:translateY(-60%) translateX(-135%);width:calc(5 * var(--default-height-size,20) + 3px);border:none;background:0 0}.icon-button button.got-tooltip>div.tooltip::after{right:-6px;left:unset;top:37%;border-color:transparent transparent transparent var(--main-inverted-color-rgba)}button.got-badge::after{transform:translateX(calc(.4 * var(--default-height-size,20))) translateY(calc(-.7 * var(--default-height-size,20)));content:attr(data-badge-value);position:absolute;z-index:751;background:var(--main-inverted-color-rgba,grey);color:rgba(var(--main-font-color),.7);border-radius:calc(.95 * var(--default-height-size,20)/ var(--button-radius-size,2));min-width:calc(.5 * var(--default-height-size,20) + 3px);padding:0 3px 2px;font-size:calc(.7 * var(--default-font-size,19pt));transition:all 250ms ease-in}button.menu-action:not(.is-inactive)::after{margin-top:calc(1px * (-27 - 10 / var(--button-radius-size,1)));margin-left:calc(1px * (27 - 10 / var(--button-radius-size,1)));transform:rotate(-45deg)}button.got-badge[data-badge-value=""]:after{display:none}button.badge-color-sunny.got-badge:after{background:var(--main-sunny-color-rgba,#ff0)}button.badge-color-info.got-badge:after{background:var(--main-info-color-rgba,orange)}button.badge-color-warning.got-badge:after{background:var(--main-warning-color-rgba,red)}button.badge-color-success.got-badge:after{background:var(--main-success-color-rgba,green)}button.badge-color-font.got-badge:after{background:var(--main-font-color-rgba,#fff);color:rgba(var(--main-inverted-color),.7)}div.group-container{margin-top:calc(1 * var(--default-height-size,20) + 3px)}div.group-container>hr{margin-top:3px;margin-bottom:3px}div.box-container{display:flex;justify-content:center;flex-direction:row;flex-wrap:wrap}div.dash-box{display:block;margin:6px}div.dash-text{margin-top:3px}button.help-link{content:'';position:relative;font-size:calc(1.2 * var(--default-font-size,19pt));font-weight:700;height:calc(1 * var(--default-height-size,20) + 3px);width:calc(1 * var(--default-height-size,20) + 3px);background:var(--main-info-color-rgba,orange);color:rgba(var(--main-inverted-color),.7);border:2px solid rgba(var(--main-inverted-color),.2)}button.help-link::before{content:'?';position:absolute;top:50%;right:50%;transform:translateX(50%) translateY(-53%)}button.main-bg{background:var(--main-bg-color-rgba,#00f);color:var(--main-font-color-rgba,#fff);border:2px solid rgba(var(--main-inverted-color),.2)}button.main-font{background:var(--main-font-color-rgba,#fff);color:var(--main-bg-color-rgba,#00f);border:2px solid rgba(var(--main-inverted-color),.2)}button.main-inverted{background:rgba(var(--main-inverted-color),.3);color:var(--main-font-color-rgba,#fff);border:2px solid rgba(var(--main-inverted-color),.2)}div.bottom-container button.main-inverted,div.modal button.main-inverted{border-color:rgba(var(--main-bg-color),.2)}button.main-warning{background:var(--main-warning-color-rgba,red);color:var(--main-font-color-rgba,#fff);border:2px solid rgba(var(--main-inverted-color),.2)}button.main-info{background:var(--main-info-color-rgba,orange);color:var(--main-font-color-rgba,#fff);border:2px solid rgba(var(--main-inverted-color),.2)}button.main-success{background:var(--main-success-color-rgba,green);color:var(--main-font-color-rgba,#fff);border:2px solid rgba(var(--main-inverted-color),.2)}button.main-sunny{background:var(--main-sunny-color-rgba,#ff0);color:var(--main-font-color-rgba,#fff);border:2px solid rgba(var(--main-inverted-color),.2)}button.is-inactive{background:rgba(var(--main-inverted-color),.1);color:rgba(var(--main-font-color),.2);border:2px solid rgba(var(--main-inverted-color),.1)}button.is-auto-size{margin:auto}button.icon-button.pending-save:hover,button.pending-save{color:red;background:rgba(var(--main-success-color),.95)}td>button:last-child{margin:2px 2px 1px 2px}td>button:first-child{margin:1px 2px 2px 2px}.modal-table button.file-action{height:calc(1.45 * var(--default-height-size,20) + 3px);width:calc(1.45 * var(--default-height-size,20) + 3px);margin-left:calc(-1.45 * var(--default-height-size,20) + 3px)}div.area-title>button{border-color:rgba(var(--main-inverted-color),.25);color:var(--main-font-color-rgba,#fff);position:absolute;height:calc(1.45 * var(--default-height-size,20) + 3px);width:calc(1.45 * var(--default-height-size,20) + 3px);font-size:calc(.9 * var(--default-font-size,19pt));right:0;top:0}div.area-title>button.left{left:0}div.area-title>button>svg{transform:translateY(3px)}div.modal{position:fixed;z-index:9999;left:0;top:0;width:calc(100% + 1px);height:100%;overflow:auto;background-color:rgba(0,0,0,.8)}div.modal.is-black{background-color:rgba(0,0,0,1);color:rgba(0,0,0,1)}div.modal.is-black>div.spinner-box{display:flex;height:95%;width:99%}div.modal.is-black>div.message,div.modal.is-black~div.page-contents{display:none}div.modal>div.message{position:absolute;top:35%;left:50%;transform:translate(-50%,-35%);min-width:400px;max-height:80vh;border-radius:calc(.25 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.modal div.area,div.modal div.area-title{border-radius:inherit}div.row[id^=modal-]{max-height:60vh;overflow-scrolling:auto;overflow-x:hidden}div.row[id^=modal-]:after,div.row[id^=modal-]:before{content:".";display:block;height:0;overflow:hidden}div.row[id^=modal-]:after{clear:both}div.spinner-box:not(.is-hidden)~div.loading-screen{display:none}div.modal>div.loading-screen{color:var(--main-font-color-rgba,#fff);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:80vw}div.loading-log{color:var(--main-font-color-rgba,#fff);min-height:40vh;margin-top:10px;font-size:calc(.75 * var(--default-font-size,19pt))}div.loading-log>.loading-is-done{animation:fadeGone 3s ease-in forwards}div.row[id*=modal-buttons]{justify-content:space-evenly;margin:unset}div.row[id*=modal-buttons]>button{margin-top:3px}div.message input.range{width:100%}div.message>div.area{background:rgba(var(--main-inverted-color),.5)}div.message>div.area.main-sunny{background:var(--main-sunny-color-rgba,#ff0)}div.message>div.area.main-success{background:var(--main-success-color-rgba,green)}div.message>div.area.main-info{background:var(--main-info-color-rgba,orange)}div.message>div.area.main-warning{background:var(--main-warning-color-rgba,red)}div.wave-background{pointer-events:none;z-index:10000;top:0;left:0;width:100%;height:100%;position:fixed;opacity:.9;transition:all .2s ease-in-out}div.wave-background.is-inactive{opacity:0}div.wave-text{font-size:calc(2 * var(--default-font-size,19pt));position:absolute;top:40%;left:50%;transform:translate(-50%,-50%)}div.wave-text>svg{height:calc(4 * var(--default-height-size,20))}div.weblog{width:calc(100% - 14px);min-height:70vh;max-height:70vh;text-align:left;font-size:calc(.8 * var(--default-font-size,19pt));overflow-y:scroll;display:block;margin:2px 4px 4px;padding:1px;border-radius:calc(.2 * var(--default-height-size,20)/ var(--button-radius-size,2));border:2px solid rgba(var(--main-inverted-color),.35);background:rgba(0,0 ,0 ,.55)}div.weblog::-webkit-scrollbar,textarea::-webkit-scrollbar{width:12px}div.weblog::-webkit-scrollbar-thumb,textarea::-webkit-scrollbar-thumb{max-height:5%;border-radius:calc(.2 * var(--default-height-size,20)/ var(--button-radius-size,2));background:rgba(var(--main-bg-color),.5)}div.tag{display:inline-block;padding:0 6px 2px 6px;font-size:calc(.6 * var(--default-font-size,19pt));border:2px solid var(--main-bg-color-rgba,#00f);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));background:var(--main-inverted-color-rgba);color:var(--main-bg-color-rgba,#00f)}div.tag.with-close{cursor:pointer;padding-right:5px;background:var(--main-font-color-rgba,#fff);color:var(--main-bg-color-rgba,#00f)}div.tag.with-close::after{content:"\a0\00d7";font-weight:bolder}div.tag.with-close:hover::after{color:rgba(var(--main-inverted-color),.9)}progress,textarea{cursor:auto}input:checked+label{background:var(--main-inverted-color-rgba)}div.modal input[type=checkbox]:checked+label:hover{background:rgba(var(--main-font-color),.1)}div.modal input[type=checkbox]+label:hover{background:rgba(var(--main-font-color),.9)}div.modal input[type=checkbox]:checked+label:active,div.modal input[type=checkbox]:checked+label:focus,div.modal input[type=checkbox]:checked+label:hover{border-color:rgba(var(--main-bg-color),.5)}div.modal input[type=checkbox]+label:active,div.modal input[type=checkbox]+label:focus{border-color:var(--main-bg-color-rgba)}input[type=checkbox],input[type=color],input[type=file],input[type=radio]{display:none;background:0 0}input[type=range]{-webkit-appearance:none;margin:.025em;width:calc(6.4 * var(--default-height-size,20));height:calc(1 * var(--default-height-size,20));background:var(--main-font-color-rgba,#fff);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));padding:calc(.2 * var(--default-height-size,20)) calc(.2 * var(--default-height-size,20)) calc(.2 * var(--default-height-size,20))}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;padding:calc(.5 * var(--default-height-size,20));border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));background:var(--main-bg-color-rgba,#00f);box-shadow:-1px 0 0 2px var(--main-font-color-rgba),-2px 0 0 2px var(--main-font-color-rgba),-3px 0 0 0 var(--main-inverted-color-rgba),-4px 0 0 0 var(--main-inverted-color-rgba),-5px 0 0 0 var(--main-inverted-color-rgba),-6px 0 0 0 var(--main-inverted-color-rgba),-7px 0 0 0 var(--main-inverted-color-rgba),-8px 0 0 0 var(--main-inverted-color-rgba),-9px 0 0 0 var(--main-inverted-color-rgba),-10px 0 0 0 var(--main-inverted-color-rgba),-11px 0 0 0 var(--main-inverted-color-rgba),-12px 0 0 0 var(--main-inverted-color-rgba),-13px 0 0 0 var(--main-inverted-color-rgba),-14px 0 0 0 var(--main-inverted-color-rgba),-15px 0 0 0 var(--main-inverted-color-rgba),-16px 0 0 0 var(--main-inverted-color-rgba),-17px 0 0 0 var(--main-inverted-color-rgba),-18px 0 0 0 var(--main-inverted-color-rgba),-19px 0 0 0 var(--main-inverted-color-rgba),-20px 0 0 0 var(--main-inverted-color-rgba),-21px 0 0 0 var(--main-inverted-color-rgba),-22px 0 0 0 var(--main-inverted-color-rgba),-23px 0 0 0 var(--main-inverted-color-rgba),-24px 0 0 0 var(--main-inverted-color-rgba),-25px 0 0 0 var(--main-inverted-color-rgba),-26px 0 0 0 var(--main-inverted-color-rgba),-27px 0 0 0 var(--main-inverted-color-rgba),-28px 0 0 0 var(--main-inverted-color-rgba),-29px 0 0 0 var(--main-inverted-color-rgba),-30px 0 0 0 var(--main-inverted-color-rgba),-31px 0 0 0 var(--main-inverted-color-rgba),-32px 0 0 0 var(--main-inverted-color-rgba),-33px 0 0 0 var(--main-inverted-color-rgba),-34px 0 0 0 var(--main-inverted-color-rgba),-35px 0 0 0 var(--main-inverted-color-rgba),-36px 0 0 0 var(--main-inverted-color-rgba),-37px 0 0 0 var(--main-inverted-color-rgba),-38px 0 0 0 var(--main-inverted-color-rgba),-39px 0 0 0 var(--main-inverted-color-rgba),-40px 0 0 0 var(--main-inverted-color-rgba),-41px 0 0 0 var(--main-inverted-color-rgba),-42px 0 0 0 var(--main-inverted-color-rgba),-43px 0 0 0 var(--main-inverted-color-rgba),-44px 0 0 0 var(--main-inverted-color-rgba),-45px 0 0 0 var(--main-inverted-color-rgba),-46px 0 0 0 var(--main-inverted-color-rgba),-47px 0 0 0 var(--main-inverted-color-rgba),-48px 0 0 0 var(--main-inverted-color-rgba),-49px 0 0 0 var(--main-inverted-color-rgba),-50px 0 0 0 var(--main-inverted-color-rgba),-51px 0 0 0 var(--main-inverted-color-rgba),-52px 0 0 0 var(--main-inverted-color-rgba),-53px 0 0 0 var(--main-inverted-color-rgba),-54px 0 0 0 var(--main-inverted-color-rgba),-55px 0 0 0 var(--main-inverted-color-rgba),-56px 0 0 0 var(--main-inverted-color-rgba),-57px 0 0 0 var(--main-inverted-color-rgba),-58px 0 0 0 var(--main-inverted-color-rgba),-59px 0 0 0 var(--main-inverted-color-rgba),-60px 0 0 0 var(--main-inverted-color-rgba),-61px 0 0 0 var(--main-inverted-color-rgba),-62px 0 0 0 var(--main-inverted-color-rgba),-63px 0 0 0 var(--main-inverted-color-rgba),-64px 0 0 0 var(--main-inverted-color-rgba),-65px 0 0 0 var(--main-inverted-color-rgba),-66px 0 0 0 var(--main-inverted-color-rgba),-67px 0 0 0 var(--main-inverted-color-rgba),-68px 0 0 0 var(--main-inverted-color-rgba),-69px 0 0 0 var(--main-inverted-color-rgba),-70px 0 0 0 var(--main-inverted-color-rgba),-71px 0 0 0 var(--main-inverted-color-rgba),-72px 0 0 0 var(--main-inverted-color-rgba),-73px 0 0 0 var(--main-inverted-color-rgba),-74px 0 0 0 var(--main-inverted-color-rgba),-75px 0 0 0 var(--main-inverted-color-rgba),-76px 0 0 0 var(--main-inverted-color-rgba),-77px 0 0 0 var(--main-inverted-color-rgba),-78px 0 0 0 var(--main-inverted-color-rgba),-79px 0 0 0 var(--main-inverted-color-rgba),-80px 0 0 0 var(--main-inverted-color-rgba),-81px 0 0 0 var(--main-inverted-color-rgba),-82px 0 0 0 var(--main-inverted-color-rgba),-83px 0 0 0 var(--main-inverted-color-rgba),-84px 0 0 0 var(--main-inverted-color-rgba),-85px 0 0 0 var(--main-inverted-color-rgba),-86px 0 0 0 var(--main-inverted-color-rgba),-87px 0 0 0 var(--main-inverted-color-rgba),-88px 0 0 0 var(--main-inverted-color-rgba),-89px 0 0 0 var(--main-inverted-color-rgba),-90px 0 0 0 var(--main-inverted-color-rgba),-91px 0 0 0 var(--main-inverted-color-rgba),-92px 0 0 0 var(--main-inverted-color-rgba),-93px 0 0 0 var(--main-inverted-color-rgba),-94px 0 0 0 var(--main-inverted-color-rgba),-95px 0 0 0 var(--main-inverted-color-rgba),-96px 0 0 0 var(--main-inverted-color-rgba),-97px 0 0 0 var(--main-inverted-color-rgba),-98px 0 0 0 var(--main-inverted-color-rgba),-99px 0 0 0 var(--main-inverted-color-rgba),-100px 0 0 0 var(--main-inverted-color-rgba),-101px 0 0 0 var(--main-inverted-color-rgba),-102px 0 0 0 var(--main-inverted-color-rgba),-103px 0 0 0 var(--main-inverted-color-rgba),-104px 0 0 0 var(--main-inverted-color-rgba),-105px 0 0 0 var(--main-inverted-color-rgba),-106px 0 0 0 var(--main-inverted-color-rgba),-107px 0 0 0 var(--main-inverted-color-rgba),-108px 0 0 0 var(--main-inverted-color-rgba),-109px 0 0 0 var(--main-inverted-color-rgba),-110px 0 0 0 var(--main-inverted-color-rgba),-111px 0 0 0 var(--main-inverted-color-rgba),-112px 0 0 0 var(--main-inverted-color-rgba),-113px 0 0 0 var(--main-inverted-color-rgba),-114px 0 0 0 var(--main-inverted-color-rgba),-115px 0 0 0 var(--main-inverted-color-rgba),-116px 0 0 0 var(--main-inverted-color-rgba),-117px 0 0 0 var(--main-inverted-color-rgba),-118px 0 0 0 var(--main-inverted-color-rgba),-119px 0 0 0 var(--main-inverted-color-rgba),-120px 0 0 0 var(--main-inverted-color-rgba),-121px 0 0 0 var(--main-inverted-color-rgba),-122px 0 0 0 var(--main-inverted-color-rgba),-123px 0 0 0 var(--main-inverted-color-rgba),-124px 0 0 0 var(--main-inverted-color-rgba),-125px 0 0 0 var(--main-inverted-color-rgba),-126px 0 0 0 var(--main-inverted-color-rgba),-127px 0 0 0 var(--main-inverted-color-rgba),-128px 0 0 0 var(--main-inverted-color-rgba),-129px 0 0 0 var(--main-inverted-color-rgba),-130px 0 0 0 var(--main-inverted-color-rgba),-131px 0 0 0 var(--main-inverted-color-rgba),-132px 0 0 0 var(--main-inverted-color-rgba),-133px 0 0 0 var(--main-inverted-color-rgba),-134px 0 0 0 var(--main-inverted-color-rgba),-135px 0 0 0 var(--main-inverted-color-rgba),-136px 0 0 0 var(--main-inverted-color-rgba),-137px 0 0 0 var(--main-inverted-color-rgba),-138px 0 0 0 var(--main-inverted-color-rgba),-139px 0 0 0 var(--main-inverted-color-rgba),-140px 0 0 0 var(--main-inverted-color-rgba),-141px 0 0 0 var(--main-inverted-color-rgba),-142px 0 0 0 var(--main-inverted-color-rgba),-143px 0 0 0 var(--main-inverted-color-rgba),-144px 0 0 0 var(--main-inverted-color-rgba),-145px 0 0 0 var(--main-inverted-color-rgba),-146px 0 0 0 var(--main-inverted-color-rgba),-147px 0 0 0 var(--main-inverted-color-rgba),-148px 0 0 0 var(--main-inverted-color-rgba),-149px 0 0 0 var(--main-inverted-color-rgba),-150px 0 0 0 var(--main-inverted-color-rgba),-151px 0 0 0 var(--main-inverted-color-rgba),-152px 0 0 0 var(--main-inverted-color-rgba),-153px 0 0 0 var(--main-inverted-color-rgba),-154px 0 0 0 var(--main-inverted-color-rgba),-155px 0 0 0 var(--main-inverted-color-rgba),-156px 0 0 0 var(--main-inverted-color-rgba),-157px 0 0 0 var(--main-inverted-color-rgba),-158px 0 0 0 var(--main-inverted-color-rgba),-159px 0 0 0 var(--main-inverted-color-rgba),-160px 0 0 0 var(--main-inverted-color-rgba),-161px 0 0 0 var(--main-inverted-color-rgba),-162px 0 0 0 var(--main-inverted-color-rgba),-163px 0 0 0 var(--main-inverted-color-rgba),-164px 0 0 0 var(--main-inverted-color-rgba),-165px 0 0 0 var(--main-inverted-color-rgba),-166px 0 0 0 var(--main-inverted-color-rgba),-167px 0 0 0 var(--main-inverted-color-rgba),-168px 0 0 0 var(--main-inverted-color-rgba),-169px 0 0 0 var(--main-inverted-color-rgba),-170px 0 0 0 var(--main-inverted-color-rgba),-171px 0 0 0 var(--main-inverted-color-rgba),-172px 0 0 0 var(--main-inverted-color-rgba),-173px 0 0 0 var(--main-inverted-color-rgba),-174px 0 0 0 var(--main-inverted-color-rgba),-175px 0 0 0 var(--main-inverted-color-rgba),-176px 0 0 0 var(--main-inverted-color-rgba),-177px 0 0 0 var(--main-inverted-color-rgba),-178px 0 0 0 var(--main-inverted-color-rgba),-179px 0 0 0 var(--main-inverted-color-rgba),-180px 0 0 0 var(--main-inverted-color-rgba),-181px 0 0 0 var(--main-inverted-color-rgba),-182px 0 0 0 var(--main-inverted-color-rgba),-183px 0 0 0 var(--main-inverted-color-rgba),-184px 0 0 0 var(--main-inverted-color-rgba),-185px 0 0 0 var(--main-inverted-color-rgba),-186px 0 0 0 var(--main-inverted-color-rgba),-187px 0 0 0 var(--main-inverted-color-rgba),-188px 0 0 0 var(--main-inverted-color-rgba),-189px 0 0 0 var(--main-inverted-color-rgba),-190px 0 0 0 var(--main-inverted-color-rgba),-191px 0 0 0 var(--main-inverted-color-rgba),-192px 0 0 0 var(--main-inverted-color-rgba),-193px 0 0 0 var(--main-inverted-color-rgba),-194px 0 0 0 var(--main-inverted-color-rgba),-195px 0 0 0 var(--main-inverted-color-rgba),-196px 0 0 0 var(--main-inverted-color-rgba),-197px 0 0 0 var(--main-inverted-color-rgba),-198px 0 0 0 var(--main-inverted-color-rgba),-199px 0 0 0 var(--main-inverted-color-rgba),-200px 0 0 0 var(--main-inverted-color-rgba),-201px 0 0 0 var(--main-inverted-color-rgba),-202px 0 0 0 var(--main-inverted-color-rgba),-203px 0 0 0 var(--main-inverted-color-rgba),-204px 0 0 0 var(--main-inverted-color-rgba),-205px 0 0 0 var(--main-inverted-color-rgba),-206px 0 0 0 var(--main-inverted-color-rgba),-207px 0 0 0 var(--main-inverted-color-rgba),-208px 0 0 0 var(--main-inverted-color-rgba),-209px 0 0 0 var(--main-inverted-color-rgba),-210px 0 0 0 var(--main-inverted-color-rgba),-211px 0 0 0 var(--main-inverted-color-rgba),-212px 0 0 0 var(--main-inverted-color-rgba),-213px 0 0 0 var(--main-inverted-color-rgba),-214px 0 0 0 var(--main-inverted-color-rgba),-215px 0 0 0 var(--main-inverted-color-rgba),-216px 0 0 0 var(--main-inverted-color-rgba),-217px 0 0 0 var(--main-inverted-color-rgba),-218px 0 0 0 var(--main-inverted-color-rgba),-219px 0 0 0 var(--main-inverted-color-rgba),-220px 0 0 0 var(--main-inverted-color-rgba),-221px 0 0 0 var(--main-inverted-color-rgba),-222px 0 0 0 var(--main-inverted-color-rgba),-223px 0 0 0 var(--main-inverted-color-rgba),-224px 0 0 0 var(--main-inverted-color-rgba),-225px 0 0 0 var(--main-inverted-color-rgba),-226px 0 0 0 var(--main-inverted-color-rgba),-227px 0 0 0 var(--main-inverted-color-rgba),-228px 0 0 0 var(--main-inverted-color-rgba),-229px 0 0 0 var(--main-inverted-color-rgba),-230px 0 0 0 var(--main-inverted-color-rgba),-231px 0 0 0 var(--main-inverted-color-rgba),-232px 0 0 0 var(--main-inverted-color-rgba),-233px 0 0 0 var(--main-inverted-color-rgba),-234px 0 0 0 var(--main-inverted-color-rgba),-235px 0 0 0 var(--main-inverted-color-rgba),-236px 0 0 0 var(--main-inverted-color-rgba),-237px 0 0 0 var(--main-inverted-color-rgba),-238px 0 0 0 var(--main-inverted-color-rgba),-239px 0 0 0 var(--main-inverted-color-rgba),-240px 0 0 0 var(--main-inverted-color-rgba),-241px 0 0 0 var(--main-inverted-color-rgba),-242px 0 0 0 var(--main-inverted-color-rgba),-243px 0 0 0 var(--main-inverted-color-rgba),-244px 0 0 0 var(--main-inverted-color-rgba),-245px 0 0 0 var(--main-inverted-color-rgba),-246px 0 0 0 var(--main-inverted-color-rgba),-247px 0 0 0 var(--main-inverted-color-rgba),-248px 0 0 0 var(--main-inverted-color-rgba),-249px 0 0 0 var(--main-inverted-color-rgba),-250px 0 0 0 var(--main-inverted-color-rgba),-251px 0 0 0 var(--main-inverted-color-rgba),-252px 0 0 0 var(--main-inverted-color-rgba),-253px 0 0 0 var(--main-inverted-color-rgba),-254px 0 0 0 var(--main-inverted-color-rgba),-255px 0 0 0 var(--main-inverted-color-rgba),-256px 0 0 0 var(--main-inverted-color-rgba),-257px 0 0 0 var(--main-inverted-color-rgba),-258px 0 0 0 var(--main-inverted-color-rgba),-259px 0 0 0 var(--main-inverted-color-rgba),-260px 0 0 0 var(--main-inverted-color-rgba),-261px 0 0 0 var(--main-inverted-color-rgba),-262px 0 0 0 var(--main-inverted-color-rgba),-263px 0 0 0 var(--main-inverted-color-rgba),-264px 0 0 0 var(--main-inverted-color-rgba),-265px 0 0 0 var(--main-inverted-color-rgba),-266px 0 0 0 var(--main-inverted-color-rgba),-267px 0 0 0 var(--main-inverted-color-rgba),-268px 0 0 0 var(--main-inverted-color-rgba),-269px 0 0 0 var(--main-inverted-color-rgba),-270px 0 0 0 var(--main-inverted-color-rgba),-271px 0 0 0 var(--main-inverted-color-rgba),-272px 0 0 0 var(--main-inverted-color-rgba),-273px 0 0 0 var(--main-inverted-color-rgba),-274px 0 0 0 var(--main-inverted-color-rgba),-275px 0 0 0 var(--main-inverted-color-rgba),-276px 0 0 0 var(--main-inverted-color-rgba),-277px 0 0 0 var(--main-inverted-color-rgba),-278px 0 0 0 var(--main-inverted-color-rgba),-279px 0 0 0 var(--main-inverted-color-rgba),-280px 0 0 0 var(--main-inverted-color-rgba),-281px 0 0 0 var(--main-inverted-color-rgba),-282px 0 0 0 var(--main-inverted-color-rgba),-283px 0 0 0 var(--main-inverted-color-rgba),-284px 0 0 0 var(--main-inverted-color-rgba),-285px 0 0 0 var(--main-inverted-color-rgba),-286px 0 0 0 var(--main-inverted-color-rgba),-287px 0 0 0 var(--main-inverted-color-rgba),-288px 0 0 0 var(--main-inverted-color-rgba),-289px 0 0 0 var(--main-inverted-color-rgba),-290px 0 0 0 var(--main-inverted-color-rgba),-291px 0 0 0 var(--main-inverted-color-rgba),-292px 0 0 0 var(--main-inverted-color-rgba),-293px 0 0 0 var(--main-inverted-color-rgba),-294px 0 0 0 var(--main-inverted-color-rgba),-295px 0 0 0 var(--main-inverted-color-rgba),-296px 0 0 0 var(--main-inverted-color-rgba),-297px 0 0 0 var(--main-inverted-color-rgba),-298px 0 0 0 var(--main-inverted-color-rgba),-299px 0 0 0 var(--main-inverted-color-rgba),-300px 0 0 0 var(--main-inverted-color-rgba),-301px 0 0 0 var(--main-inverted-color-rgba),-302px 0 0 0 var(--main-inverted-color-rgba),-303px 0 0 0 var(--main-inverted-color-rgba),-304px 0 0 0 var(--main-inverted-color-rgba),-305px 0 0 0 var(--main-inverted-color-rgba),-306px 0 0 0 var(--main-inverted-color-rgba),-307px 0 0 0 var(--main-inverted-color-rgba),-308px 0 0 0 var(--main-inverted-color-rgba),-309px 0 0 0 var(--main-inverted-color-rgba),-310px 0 0 0 var(--main-inverted-color-rgba),-311px 0 0 0 var(--main-inverted-color-rgba),-312px 0 0 0 var(--main-inverted-color-rgba),-313px 0 0 0 var(--main-inverted-color-rgba),-314px 0 0 0 var(--main-inverted-color-rgba),-315px 0 0 0 var(--main-inverted-color-rgba),-316px 0 0 0 var(--main-inverted-color-rgba),-317px 0 0 0 var(--main-inverted-color-rgba),-318px 0 0 0 var(--main-inverted-color-rgba),-319px 0 0 0 var(--main-inverted-color-rgba),-320px 0 0 0 var(--main-inverted-color-rgba),-321px 0 0 0 var(--main-inverted-color-rgba),-322px 0 0 0 var(--main-inverted-color-rgba),-323px 0 0 0 var(--main-inverted-color-rgba),-324px 0 0 0 var(--main-inverted-color-rgba),-325px 0 0 0 var(--main-inverted-color-rgba),-326px 0 0 0 var(--main-inverted-color-rgba),-327px 0 0 0 var(--main-inverted-color-rgba),-328px 0 0 0 var(--main-inverted-color-rgba),-329px 0 0 0 var(--main-inverted-color-rgba),-330px 0 0 0 var(--main-inverted-color-rgba),-331px 0 0 0 var(--main-inverted-color-rgba),-332px 0 0 0 var(--main-inverted-color-rgba),-333px 0 0 0 var(--main-inverted-color-rgba),-334px 0 0 0 var(--main-inverted-color-rgba),-335px 0 0 0 var(--main-inverted-color-rgba),-336px 0 0 0 var(--main-inverted-color-rgba),-337px 0 0 0 var(--main-inverted-color-rgba),-338px 0 0 0 var(--main-inverted-color-rgba),-339px 0 0 0 var(--main-inverted-color-rgba),-340px 0 0 0 var(--main-inverted-color-rgba),-341px 0 0 0 var(--main-inverted-color-rgba),-342px 0 0 0 var(--main-inverted-color-rgba),-343px 0 0 0 var(--main-inverted-color-rgba),-344px 0 0 0 var(--main-inverted-color-rgba),-345px 0 0 0 var(--main-inverted-color-rgba),-346px 0 0 0 var(--main-inverted-color-rgba),-347px 0 0 0 var(--main-inverted-color-rgba),-348px 0 0 0 var(--main-inverted-color-rgba),-349px 0 0 0 var(--main-inverted-color-rgba),-350px 0 0 0 var(--main-inverted-color-rgba),-351px 0 0 0 var(--main-inverted-color-rgba),-352px 0 0 0 var(--main-inverted-color-rgba),-353px 0 0 0 var(--main-inverted-color-rgba),-354px 0 0 0 var(--main-inverted-color-rgba),-355px 0 0 0 var(--main-inverted-color-rgba),-356px 0 0 0 var(--main-inverted-color-rgba),-357px 0 0 0 var(--main-inverted-color-rgba),-358px 0 0 0 var(--main-inverted-color-rgba),-359px 0 0 0 var(--main-inverted-color-rgba),-360px 0 0 0 var(--main-inverted-color-rgba),-361px 0 0 0 var(--main-inverted-color-rgba),-362px 0 0 0 var(--main-inverted-color-rgba),-363px 0 0 0 var(--main-inverted-color-rgba),-364px 0 0 0 var(--main-inverted-color-rgba),-365px 0 0 0 var(--main-inverted-color-rgba),-366px 0 0 0 var(--main-inverted-color-rgba),-367px 0 0 0 var(--main-inverted-color-rgba),-368px 0 0 0 var(--main-inverted-color-rgba),-369px 0 0 0 var(--main-inverted-color-rgba),-370px 0 0 0 var(--main-inverted-color-rgba),-371px 0 0 0 var(--main-inverted-color-rgba),-372px 0 0 0 var(--main-inverted-color-rgba),-373px 0 0 0 var(--main-inverted-color-rgba),-374px 0 0 0 var(--main-inverted-color-rgba),-375px 0 0 0 var(--main-inverted-color-rgba),-376px 0 0 0 var(--main-inverted-color-rgba),-377px 0 0 0 var(--main-inverted-color-rgba),-378px 0 0 0 var(--main-inverted-color-rgba),-379px 0 0 0 var(--main-inverted-color-rgba),-380px 0 0 0 var(--main-inverted-color-rgba),-381px 0 0 0 var(--main-inverted-color-rgba),-382px 0 0 0 var(--main-inverted-color-rgba),-383px 0 0 0 var(--main-inverted-color-rgba),-384px 0 0 0 var(--main-inverted-color-rgba),-385px 0 0 0 var(--main-inverted-color-rgba),-386px 0 0 0 var(--main-inverted-color-rgba),-387px 0 0 0 var(--main-inverted-color-rgba),-388px 0 0 0 var(--main-inverted-color-rgba),-389px 0 0 0 var(--main-inverted-color-rgba),-390px 0 0 0 var(--main-inverted-color-rgba),-391px 0 0 0 var(--main-inverted-color-rgba),-392px 0 0 0 var(--main-inverted-color-rgba),-393px 0 0 0 var(--main-inverted-color-rgba),-394px 0 0 0 var(--main-inverted-color-rgba),-395px 0 0 0 var(--main-inverted-color-rgba),-396px 0 0 0 var(--main-inverted-color-rgba),-397px 0 0 0 var(--main-inverted-color-rgba),-398px 0 0 0 var(--main-inverted-color-rgba),-399px 0 0 0 var(--main-inverted-color-rgba),-400px 0 0 0 var(--main-inverted-color-rgba),-401px 0 0 0 var(--main-inverted-color-rgba),-402px 0 0 0 var(--main-inverted-color-rgba),-403px 0 0 0 var(--main-inverted-color-rgba),-404px 0 0 0 var(--main-inverted-color-rgba),-405px 0 0 0 var(--main-inverted-color-rgba),-406px 0 0 0 var(--main-inverted-color-rgba),-407px 0 0 0 var(--main-inverted-color-rgba),-408px 0 0 0 var(--main-inverted-color-rgba),-409px 0 0 0 var(--main-inverted-color-rgba),-410px 0 0 0 var(--main-inverted-color-rgba),-411px 0 0 0 var(--main-inverted-color-rgba),-412px 0 0 0 var(--main-inverted-color-rgba),-413px 0 0 0 var(--main-inverted-color-rgba),-414px 0 0 0 var(--main-inverted-color-rgba),-415px 0 0 0 var(--main-inverted-color-rgba),-416px 0 0 0 var(--main-inverted-color-rgba),-417px 0 0 0 var(--main-inverted-color-rgba),-418px 0 0 0 var(--main-inverted-color-rgba),-419px 0 0 0 var(--main-inverted-color-rgba),-420px 0 0 0 var(--main-inverted-color-rgba),-421px 0 0 0 var(--main-inverted-color-rgba),-422px 0 0 0 var(--main-inverted-color-rgba),-423px 0 0 0 var(--main-inverted-color-rgba),-424px 0 0 0 var(--main-inverted-color-rgba),-425px 0 0 0 var(--main-inverted-color-rgba),-426px 0 0 0 var(--main-inverted-color-rgba),-427px 0 0 0 var(--main-inverted-color-rgba),-428px 0 0 0 var(--main-inverted-color-rgba),-429px 0 0 0 var(--main-inverted-color-rgba),-430px 0 0 0 var(--main-inverted-color-rgba),-431px 0 0 0 var(--main-inverted-color-rgba),-432px 0 0 0 var(--main-inverted-color-rgba),-433px 0 0 0 var(--main-inverted-color-rgba),-434px 0 0 0 var(--main-inverted-color-rgba),-435px 0 0 0 var(--main-inverted-color-rgba),-436px 0 0 0 var(--main-inverted-color-rgba),-437px 0 0 0 var(--main-inverted-color-rgba),-438px 0 0 0 var(--main-inverted-color-rgba),-439px 0 0 0 var(--main-inverted-color-rgba),-440px 0 0 0 var(--main-inverted-color-rgba),-441px 0 0 0 var(--main-inverted-color-rgba),-442px 0 0 0 var(--main-inverted-color-rgba),-443px 0 0 0 var(--main-inverted-color-rgba),-444px 0 0 0 var(--main-inverted-color-rgba),-445px 0 0 0 var(--main-inverted-color-rgba),-446px 0 0 0 var(--main-inverted-color-rgba),-447px 0 0 0 var(--main-inverted-color-rgba),-448px 0 0 0 var(--main-inverted-color-rgba),-449px 0 0 0 var(--main-inverted-color-rgba),-450px 0 0 0 var(--main-inverted-color-rgba),-451px 0 0 0 var(--main-inverted-color-rgba),-452px 0 0 0 var(--main-inverted-color-rgba),-453px 0 0 0 var(--main-inverted-color-rgba),-454px 0 0 0 var(--main-inverted-color-rgba),-455px 0 0 0 var(--main-inverted-color-rgba),-456px 0 0 0 var(--main-inverted-color-rgba),-457px 0 0 0 var(--main-inverted-color-rgba),-458px 0 0 0 var(--main-inverted-color-rgba),-459px 0 0 0 var(--main-inverted-color-rgba),-460px 0 0 0 var(--main-inverted-color-rgba),-461px 0 0 0 var(--main-inverted-color-rgba),-462px 0 0 0 var(--main-inverted-color-rgba),-463px 0 0 0 var(--main-inverted-color-rgba),-464px 0 0 0 var(--main-inverted-color-rgba),-465px 0 0 0 var(--main-inverted-color-rgba),-466px 0 0 0 var(--main-inverted-color-rgba),-467px 0 0 0 var(--main-inverted-color-rgba),-468px 0 0 0 var(--main-inverted-color-rgba),-469px 0 0 0 var(--main-inverted-color-rgba),-470px 0 0 0 var(--main-inverted-color-rgba),-471px 0 0 0 var(--main-inverted-color-rgba),-472px 0 0 0 var(--main-inverted-color-rgba),-473px 0 0 0 var(--main-inverted-color-rgba),-474px 0 0 0 var(--main-inverted-color-rgba),-475px 0 0 0 var(--main-inverted-color-rgba),-476px 0 0 0 var(--main-inverted-color-rgba),-477px 0 0 0 var(--main-inverted-color-rgba),-478px 0 0 0 var(--main-inverted-color-rgba),-479px 0 0 0 var(--main-inverted-color-rgba),-480px 0 0 0 var(--main-inverted-color-rgba),-481px 0 0 0 var(--main-inverted-color-rgba),-482px 0 0 0 var(--main-inverted-color-rgba),-483px 0 0 0 var(--main-inverted-color-rgba),-484px 0 0 0 var(--main-inverted-color-rgba),-485px 0 0 0 var(--main-inverted-color-rgba),-486px 0 0 0 var(--main-inverted-color-rgba),-487px 0 0 0 var(--main-inverted-color-rgba),-488px 0 0 0 var(--main-inverted-color-rgba),-489px 0 0 0 var(--main-inverted-color-rgba),-490px 0 0 0 var(--main-inverted-color-rgba),-491px 0 0 0 var(--main-inverted-color-rgba),-492px 0 0 0 var(--main-inverted-color-rgba),-493px 0 0 0 var(--main-inverted-color-rgba),-494px 0 0 0 var(--main-inverted-color-rgba),-495px 0 0 0 var(--main-inverted-color-rgba),-496px 0 0 0 var(--main-inverted-color-rgba),-497px 0 0 0 var(--main-inverted-color-rgba),-498px 0 0 0 var(--main-inverted-color-rgba),-499px 0 0 0 var(--main-inverted-color-rgba),-500px 0 0 0 var(--main-inverted-color-rgba),-501px 0 0 0 var(--main-inverted-color-rgba),-502px 0 0 0 var(--main-inverted-color-rgba),-503px 0 0 0 var(--main-inverted-color-rgba),-504px 0 0 0 var(--main-inverted-color-rgba),-505px 0 0 0 var(--main-inverted-color-rgba),-506px 0 0 0 var(--main-inverted-color-rgba),-507px 0 0 0 var(--main-inverted-color-rgba),-508px 0 0 0 var(--main-inverted-color-rgba),-509px 0 0 0 var(--main-inverted-color-rgba),-510px 0 0 0 var(--main-inverted-color-rgba),-511px 0 0 0 var(--main-inverted-color-rgba),-512px 0 0 0 var(--main-inverted-color-rgba),-513px 0 0 0 var(--main-inverted-color-rgba),-514px 0 0 0 var(--main-inverted-color-rgba),-515px 0 0 0 var(--main-inverted-color-rgba),-516px 0 0 0 var(--main-inverted-color-rgba),-517px 0 0 0 var(--main-inverted-color-rgba),-518px 0 0 0 var(--main-inverted-color-rgba),-519px 0 0 0 var(--main-inverted-color-rgba),-520px 0 0 0 var(--main-inverted-color-rgba),-521px 0 0 0 var(--main-inverted-color-rgba),-522px 0 0 0 var(--main-inverted-color-rgba),-523px 0 0 0 var(--main-inverted-color-rgba),-524px 0 0 0 var(--main-inverted-color-rgba),-525px 0 0 0 var(--main-inverted-color-rgba),-526px 0 0 0 var(--main-inverted-color-rgba),-527px 0 0 0 var(--main-inverted-color-rgba),-528px 0 0 0 var(--main-inverted-color-rgba),-529px 0 0 0 var(--main-inverted-color-rgba),-530px 0 0 0 var(--main-inverted-color-rgba),-531px 0 0 0 var(--main-inverted-color-rgba),-532px 0 0 0 var(--main-inverted-color-rgba),-533px 0 0 0 var(--main-inverted-color-rgba),-534px 0 0 0 var(--main-inverted-color-rgba),-535px 0 0 0 var(--main-inverted-color-rgba),-536px 0 0 0 var(--main-inverted-color-rgba),-537px 0 0 0 var(--main-inverted-color-rgba),-538px 0 0 0 var(--main-inverted-color-rgba),-539px 0 0 0 var(--main-inverted-color-rgba),-540px 0 0 0 var(--main-inverted-color-rgba),-541px 0 0 0 var(--main-inverted-color-rgba),-542px 0 0 0 var(--main-inverted-color-rgba),-543px 0 0 0 var(--main-inverted-color-rgba),-544px 0 0 0 var(--main-inverted-color-rgba),-545px 0 0 0 var(--main-inverted-color-rgba),-546px 0 0 0 var(--main-inverted-color-rgba),-547px 0 0 0 var(--main-inverted-color-rgba),-548px 0 0 0 var(--main-inverted-color-rgba),-549px 0 0 0 var(--main-inverted-color-rgba),-550px 0 0 0 var(--main-inverted-color-rgba),-551px 0 0 0 var(--main-inverted-color-rgba),-552px 0 0 0 var(--main-inverted-color-rgba),-553px 0 0 0 var(--main-inverted-color-rgba),-554px 0 0 0 var(--main-inverted-color-rgba),-555px 0 0 0 var(--main-inverted-color-rgba),-556px 0 0 0 var(--main-inverted-color-rgba),-557px 0 0 0 var(--main-inverted-color-rgba),-558px 0 0 0 var(--main-inverted-color-rgba),-559px 0 0 0 var(--main-inverted-color-rgba),-560px 0 0 0 var(--main-inverted-color-rgba),-561px 0 0 0 var(--main-inverted-color-rgba),-562px 0 0 0 var(--main-inverted-color-rgba),-563px 0 0 0 var(--main-inverted-color-rgba),-564px 0 0 0 var(--main-inverted-color-rgba),-565px 0 0 0 var(--main-inverted-color-rgba),-566px 0 0 0 var(--main-inverted-color-rgba),-567px 0 0 0 var(--main-inverted-color-rgba),-568px 0 0 0 var(--main-inverted-color-rgba),-569px 0 0 0 var(--main-inverted-color-rgba),-570px 0 0 0 var(--main-inverted-color-rgba),-571px 0 0 0 var(--main-inverted-color-rgba),-572px 0 0 0 var(--main-inverted-color-rgba),-573px 0 0 0 var(--main-inverted-color-rgba),-574px 0 0 0 var(--main-inverted-color-rgba),-575px 0 0 0 var(--main-inverted-color-rgba),-576px 0 0 0 var(--main-inverted-color-rgba),-577px 0 0 0 var(--main-inverted-color-rgba),-578px 0 0 0 var(--main-inverted-color-rgba),-579px 0 0 0 var(--main-inverted-color-rgba),-580px 0 0 0 var(--main-inverted-color-rgba),-581px 0 0 0 var(--main-inverted-color-rgba),-582px 0 0 0 var(--main-inverted-color-rgba),-583px 0 0 0 var(--main-inverted-color-rgba),-584px 0 0 0 var(--main-inverted-color-rgba),-585px 0 0 0 var(--main-inverted-color-rgba),-586px 0 0 0 var(--main-inverted-color-rgba),-587px 0 0 0 var(--main-inverted-color-rgba),-588px 0 0 0 var(--main-inverted-color-rgba),-589px 0 0 0 var(--main-inverted-color-rgba),-590px 0 0 0 var(--main-inverted-color-rgba),-591px 0 0 0 var(--main-inverted-color-rgba),-592px 0 0 0 var(--main-inverted-color-rgba),-593px 0 0 0 var(--main-inverted-color-rgba),-594px 0 0 0 var(--main-inverted-color-rgba),-595px 0 0 0 var(--main-inverted-color-rgba),-596px 0 0 0 var(--main-inverted-color-rgba),-597px 0 0 0 var(--main-inverted-color-rgba),-598px 0 0 0 var(--main-inverted-color-rgba),-599px 0 0 0 var(--main-inverted-color-rgba),-600px 0 0 0 var(--main-inverted-color-rgba),-601px 0 0 0 var(--main-inverted-color-rgba),-602px 0 0 0 var(--main-inverted-color-rgba),-603px 0 0 0 var(--main-inverted-color-rgba),-604px 0 0 0 var(--main-inverted-color-rgba),-605px 0 0 0 var(--main-inverted-color-rgba),-606px 0 0 0 var(--main-inverted-color-rgba),-607px 0 0 0 var(--main-inverted-color-rgba),-608px 0 0 0 var(--main-inverted-color-rgba),-609px 0 0 0 var(--main-inverted-color-rgba),-610px 0 0 0 var(--main-inverted-color-rgba),-611px 0 0 0 var(--main-inverted-color-rgba),-612px 0 0 0 var(--main-inverted-color-rgba),-613px 0 0 0 var(--main-inverted-color-rgba),-614px 0 0 0 var(--main-inverted-color-rgba),-615px 0 0 0 var(--main-inverted-color-rgba),-616px 0 0 0 var(--main-inverted-color-rgba),-617px 0 0 0 var(--main-inverted-color-rgba),-618px 0 0 0 var(--main-inverted-color-rgba),-619px 0 0 0 var(--main-inverted-color-rgba),-620px 0 0 0 var(--main-inverted-color-rgba),-621px 0 0 0 var(--main-inverted-color-rgba),-622px 0 0 0 var(--main-inverted-color-rgba),-623px 0 0 0 var(--main-inverted-color-rgba),-624px 0 0 0 var(--main-inverted-color-rgba),-625px 0 0 0 var(--main-inverted-color-rgba),-626px 0 0 0 var(--main-inverted-color-rgba),-627px 0 0 0 var(--main-inverted-color-rgba),-628px 0 0 0 var(--main-inverted-color-rgba),-629px 0 0 0 var(--main-inverted-color-rgba),-630px 0 0 0 var(--main-inverted-color-rgba),-631px 0 0 0 var(--main-inverted-color-rgba),-632px 0 0 0 var(--main-inverted-color-rgba),-633px 0 0 0 var(--main-inverted-color-rgba),-634px 0 0 0 var(--main-inverted-color-rgba),-635px 0 0 0 var(--main-inverted-color-rgba),-636px 0 0 0 var(--main-inverted-color-rgba),-637px 0 0 0 var(--main-inverted-color-rgba),-638px 0 0 0 var(--main-inverted-color-rgba),-639px 0 0 0 var(--main-inverted-color-rgba),-640px 0 0 0 var(--main-inverted-color-rgba),-641px 0 0 0 var(--main-inverted-color-rgba),-642px 0 0 0 var(--main-inverted-color-rgba),-643px 0 0 0 var(--main-inverted-color-rgba),-644px 0 0 0 var(--main-inverted-color-rgba),-645px 0 0 0 var(--main-inverted-color-rgba),-646px 0 0 0 var(--main-inverted-color-rgba),-647px 0 0 0 var(--main-inverted-color-rgba),-648px 0 0 0 var(--main-inverted-color-rgba),-649px 0 0 0 var(--main-inverted-color-rgba),-650px 0 0 0 var(--main-inverted-color-rgba),-651px 0 0 0 var(--main-inverted-color-rgba),-652px 0 0 0 var(--main-inverted-color-rgba),-653px 0 0 0 var(--main-inverted-color-rgba),-654px 0 0 0 var(--main-inverted-color-rgba),-655px 0 0 0 var(--main-inverted-color-rgba),-656px 0 0 0 var(--main-inverted-color-rgba),-657px 0 0 0 var(--main-inverted-color-rgba),-658px 0 0 0 var(--main-inverted-color-rgba),-659px 0 0 0 var(--main-inverted-color-rgba),-660px 0 0 0 var(--main-inverted-color-rgba),-661px 0 0 0 var(--main-inverted-color-rgba),-662px 0 0 0 var(--main-inverted-color-rgba),-663px 0 0 0 var(--main-inverted-color-rgba),-664px 0 0 0 var(--main-inverted-color-rgba),-665px 0 0 0 var(--main-inverted-color-rgba),-666px 0 0 0 var(--main-inverted-color-rgba),-667px 0 0 0 var(--main-inverted-color-rgba),-668px 0 0 0 var(--main-inverted-color-rgba),-669px 0 0 0 var(--main-inverted-color-rgba),-670px 0 0 0 var(--main-inverted-color-rgba),-671px 0 0 0 var(--main-inverted-color-rgba),-672px 0 0 0 var(--main-inverted-color-rgba),-673px 0 0 0 var(--main-inverted-color-rgba),-674px 0 0 0 var(--main-inverted-color-rgba),-675px 0 0 0 var(--main-inverted-color-rgba),-676px 0 0 0 var(--main-inverted-color-rgba),-677px 0 0 0 var(--main-inverted-color-rgba),-678px 0 0 0 var(--main-inverted-color-rgba),-679px 0 0 0 var(--main-inverted-color-rgba),-680px 0 0 0 var(--main-inverted-color-rgba),-681px 0 0 0 var(--main-inverted-color-rgba),-682px 0 0 0 var(--main-inverted-color-rgba),-683px 0 0 0 var(--main-inverted-color-rgba),-684px 0 0 0 var(--main-inverted-color-rgba),-685px 0 0 0 var(--main-inverted-color-rgba),-686px 0 0 0 var(--main-inverted-color-rgba),-687px 0 0 0 var(--main-inverted-color-rgba),-688px 0 0 0 var(--main-inverted-color-rgba),-689px 0 0 0 var(--main-inverted-color-rgba),-690px 0 0 0 var(--main-inverted-color-rgba),-691px 0 0 0 var(--main-inverted-color-rgba),-692px 0 0 0 var(--main-inverted-color-rgba),-693px 0 0 0 var(--main-inverted-color-rgba),-694px 0 0 0 var(--main-inverted-color-rgba),-695px 0 0 0 var(--main-inverted-color-rgba),-696px 0 0 0 var(--main-inverted-color-rgba),-697px 0 0 0 var(--main-inverted-color-rgba),-698px 0 0 0 var(--main-inverted-color-rgba),-699px 0 0 0 var(--main-inverted-color-rgba),-700px 0 0 0 var(--main-inverted-color-rgba),-701px 0 0 0 var(--main-inverted-color-rgba),-702px 0 0 0 var(--main-inverted-color-rgba),-703px 0 0 0 var(--main-inverted-color-rgba),-704px 0 0 0 var(--main-inverted-color-rgba),-705px 0 0 0 var(--main-inverted-color-rgba),-706px 0 0 0 var(--main-inverted-color-rgba),-707px 0 0 0 var(--main-inverted-color-rgba),-708px 0 0 0 var(--main-inverted-color-rgba),-709px 0 0 0 var(--main-inverted-color-rgba),-710px 0 0 0 var(--main-inverted-color-rgba),-711px 0 0 0 var(--main-inverted-color-rgba),-712px 0 0 0 var(--main-inverted-color-rgba),-713px 0 0 0 var(--main-inverted-color-rgba),-714px 0 0 0 var(--main-inverted-color-rgba),-715px 0 0 0 var(--main-inverted-color-rgba),-716px 0 0 0 var(--main-inverted-color-rgba),-717px 0 0 0 var(--main-inverted-color-rgba),-718px 0 0 0 var(--main-inverted-color-rgba),-719px 0 0 0 var(--main-inverted-color-rgba),-720px 0 0 0 var(--main-inverted-color-rgba),-721px 0 0 0 var(--main-inverted-color-rgba),-722px 0 0 0 var(--main-inverted-color-rgba),-723px 0 0 0 var(--main-inverted-color-rgba),-724px 0 0 0 var(--main-inverted-color-rgba),-725px 0 0 0 var(--main-inverted-color-rgba),-726px 0 0 0 var(--main-inverted-color-rgba),-727px 0 0 0 var(--main-inverted-color-rgba),-728px 0 0 0 var(--main-inverted-color-rgba),-729px 0 0 0 var(--main-inverted-color-rgba),-730px 0 0 0 var(--main-inverted-color-rgba),-731px 0 0 0 var(--main-inverted-color-rgba),-732px 0 0 0 var(--main-inverted-color-rgba),-733px 0 0 0 var(--main-inverted-color-rgba),-734px 0 0 0 var(--main-inverted-color-rgba),-735px 0 0 0 var(--main-inverted-color-rgba),-736px 0 0 0 var(--main-inverted-color-rgba),-737px 0 0 0 var(--main-inverted-color-rgba),-738px 0 0 0 var(--main-inverted-color-rgba),-739px 0 0 0 var(--main-inverted-color-rgba),-740px 0 0 0 var(--main-inverted-color-rgba),-741px 0 0 0 var(--main-inverted-color-rgba),-742px 0 0 0 var(--main-inverted-color-rgba),-743px 0 0 0 var(--main-inverted-color-rgba),-744px 0 0 0 var(--main-inverted-color-rgba),-745px 0 0 0 var(--main-inverted-color-rgba),-746px 0 0 0 var(--main-inverted-color-rgba),-747px 0 0 0 var(--main-inverted-color-rgba),-748px 0 0 0 var(--main-inverted-color-rgba),-749px 0 0 0 var(--main-inverted-color-rgba),-750px 0 0 0 var(--main-inverted-color-rgba),-751px 0 0 0 var(--main-inverted-color-rgba),-752px 0 0 0 var(--main-inverted-color-rgba),-753px 0 0 0 var(--main-inverted-color-rgba),-754px 0 0 0 var(--main-inverted-color-rgba),-755px 0 0 0 var(--main-inverted-color-rgba),-756px 0 0 0 var(--main-inverted-color-rgba),-757px 0 0 0 var(--main-inverted-color-rgba),-758px 0 0 0 var(--main-inverted-color-rgba),-759px 0 0 0 var(--main-inverted-color-rgba),-760px 0 0 0 var(--main-inverted-color-rgba),-761px 0 0 0 var(--main-inverted-color-rgba),-762px 0 0 0 var(--main-inverted-color-rgba),-763px 0 0 0 var(--main-inverted-color-rgba),-764px 0 0 0 var(--main-inverted-color-rgba),-765px 0 0 0 var(--main-inverted-color-rgba),-766px 0 0 0 var(--main-inverted-color-rgba),-767px 0 0 0 var(--main-inverted-color-rgba),-768px 0 0 0 var(--main-inverted-color-rgba),-769px 0 0 0 var(--main-inverted-color-rgba),-770px 0 0 0 var(--main-inverted-color-rgba),-771px 0 0 0 var(--main-inverted-color-rgba),-772px 0 0 0 var(--main-inverted-color-rgba),-773px 0 0 0 var(--main-inverted-color-rgba),-774px 0 0 0 var(--main-inverted-color-rgba),-775px 0 0 0 var(--main-inverted-color-rgba),-776px 0 0 0 var(--main-inverted-color-rgba),-777px 0 0 0 var(--main-inverted-color-rgba),-778px 0 0 0 var(--main-inverted-color-rgba),-779px 0 0 0 var(--main-inverted-color-rgba),-780px 0 0 0 var(--main-inverted-color-rgba),-781px 0 0 0 var(--main-inverted-color-rgba),-782px 0 0 0 var(--main-inverted-color-rgba),-783px 0 0 0 var(--main-inverted-color-rgba),-784px 0 0 0 var(--main-inverted-color-rgba),-785px 0 0 0 var(--main-inverted-color-rgba),-786px 0 0 0 var(--main-inverted-color-rgba),-787px 0 0 0 var(--main-inverted-color-rgba),-788px 0 0 0 var(--main-inverted-color-rgba),-789px 0 0 0 var(--main-inverted-color-rgba),-790px 0 0 0 var(--main-inverted-color-rgba),-791px 0 0 0 var(--main-inverted-color-rgba),-792px 0 0 0 var(--main-inverted-color-rgba),-793px 0 0 0 var(--main-inverted-color-rgba),-794px 0 0 0 var(--main-inverted-color-rgba),-795px 0 0 0 var(--main-inverted-color-rgba),-796px 0 0 0 var(--main-inverted-color-rgba),-797px 0 0 0 var(--main-inverted-color-rgba),-798px 0 0 0 var(--main-inverted-color-rgba),-799px 0 0 0 var(--main-inverted-color-rgba),-800px 0 0 0 var(--main-inverted-color-rgba),-801px 0 0 0 var(--main-inverted-color-rgba),-802px 0 0 0 var(--main-inverted-color-rgba),-803px 0 0 0 var(--main-inverted-color-rgba),-804px 0 0 0 var(--main-inverted-color-rgba),-805px 0 0 0 var(--main-inverted-color-rgba),-806px 0 0 0 var(--main-inverted-color-rgba),-807px 0 0 0 var(--main-inverted-color-rgba),-808px 0 0 0 var(--main-inverted-color-rgba),-809px 0 0 0 var(--main-inverted-color-rgba),-810px 0 0 0 var(--main-inverted-color-rgba),-811px 0 0 0 var(--main-inverted-color-rgba),-812px 0 0 0 var(--main-inverted-color-rgba),-813px 0 0 0 var(--main-inverted-color-rgba),-814px 0 0 0 var(--main-inverted-color-rgba),-815px 0 0 0 var(--main-inverted-color-rgba),-816px 0 0 0 var(--main-inverted-color-rgba),-817px 0 0 0 var(--main-inverted-color-rgba),-818px 0 0 0 var(--main-inverted-color-rgba),-819px 0 0 0 var(--main-inverted-color-rgba),-820px 0 0 0 var(--main-inverted-color-rgba),-821px 0 0 0 var(--main-inverted-color-rgba),-822px 0 0 0 var(--main-inverted-color-rgba),-823px 0 0 0 var(--main-inverted-color-rgba),-824px 0 0 0 var(--main-inverted-color-rgba),-825px 0 0 0 var(--main-inverted-color-rgba),-826px 0 0 0 var(--main-inverted-color-rgba),-827px 0 0 0 var(--main-inverted-color-rgba),-828px 0 0 0 var(--main-inverted-color-rgba),-829px 0 0 0 var(--main-inverted-color-rgba),-830px 0 0 0 var(--main-inverted-color-rgba),-831px 0 0 0 var(--main-inverted-color-rgba),-832px 0 0 0 var(--main-inverted-color-rgba),-833px 0 0 0 var(--main-inverted-color-rgba),-834px 0 0 0 var(--main-inverted-color-rgba),-835px 0 0 0 var(--main-inverted-color-rgba),-836px 0 0 0 var(--main-inverted-color-rgba),-837px 0 0 0 var(--main-inverted-color-rgba),-838px 0 0 0 var(--main-inverted-color-rgba),-839px 0 0 0 var(--main-inverted-color-rgba),-840px 0 0 0 var(--main-inverted-color-rgba),-841px 0 0 0 var(--main-inverted-color-rgba),-842px 0 0 0 var(--main-inverted-color-rgba),-843px 0 0 0 var(--main-inverted-color-rgba),-844px 0 0 0 var(--main-inverted-color-rgba),-845px 0 0 0 var(--main-inverted-color-rgba),-846px 0 0 0 var(--main-inverted-color-rgba),-847px 0 0 0 var(--main-inverted-color-rgba),-848px 0 0 0 var(--main-inverted-color-rgba),-849px 0 0 0 var(--main-inverted-color-rgba),-850px 0 0 0 var(--main-inverted-color-rgba)}input[type=range]::-webkit-slider-thumb:active{background:rgba(var(--main-bg-color),.7)}input[type=range]::-webkit-slider-runnable-track{overflow:hidden;display:flex;background:var(--main-font-color-rgba,#fff);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2))}textarea{width:calc(100% - 8px);min-width:calc(100% - 8px);min-height:calc(8 * var(--default-height-size,20));resize:none;font-size:calc(.9 * var(--default-font-size,19pt));background:var(--main-font-color-rgba,#fff);color:var(--main-bg-color-rgba,#00f);border-radius:calc(.2 * var(--default-height-size,20)/ var(--button-radius-size,2))}textarea.huge-textarea{min-height:calc(25 * var(--default-height-size,20));max-height:calc(75 * var(--default-height-size,20))}textarea.big-textarea{min-height:calc(10 * var(--default-height-size,20));max-height:calc(30 * var(--default-height-size,20))}textarea.normal-textarea{min-height:calc(5 * var(--default-height-size,20));max-height:calc(15 * var(--default-height-size,20))}textarea#modal-input-textarea{overflow-wrap:unset;resize:none;white-space:nowrap}div.editor{z-index:0;margin-left:2px;margin-right:2px;height:calc(25 * var(--default-height-size,20));font-size:calc(.9 * var(--default-font-size,19pt));font-family:"Lucida Console",Monaco,monospace;position:relative;background:rgba(var(--main-inverted-color),.9);border-radius:calc(.2 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.editor>textarea{z-index:10;position:absolute;height:100%;width:100%;box-sizing:border-box;background:0 0;color:transparent;overflow-wrap:unset;resize:none;white-space:nowrap}div.editor-container{overflow:hidden;position:relative;height:100%;width:100%;box-sizing:border-box}div.editor-container>div{position:absolute;overflow:inherit;height:100%;width:100%;padding:4px;box-sizing:border-box;display:flex;flex-direction:column;border-radius:calc(.2 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.editor-input{z-index:2}div.editor-syntax{z-index:6}div.editor-selection{z-index:8}div.editor-caret::after{content:"|";color:red}div.syntax-element{color:var(--main-font-color-rgba,#fff);display:flex;height:calc(1.06555555555555 * var(--default-font-size,19pt) + .75pt + 3 * (10 / var(--scale-size)));min-height:calc(1.06555555555555 * var(--default-font-size,19pt) + .75pt + 3 * (10 / var(--scale-size)));max-height:calc(1.06555555555555 * var(--default-font-size,19pt) + .75pt + 3 * (10 / var(--scale-size)))}div.syntax-is-arithmetic,div.syntax-is-number,div.syntax-is-parentheses{color:var(--main-success-color-rgba,green)}div.syntax-is-command{color:var(--main-warning-color-rgba,red)}div.syntax-is-event,div.syntax-is-variable{color:var(--main-info-color-rgba,orange)}div.syntax-is-logic{color:rgba(var(--main-font-color),.7)}div.syntax-is-block{color:rgba(var(--main-success-color),.7)}div.syntax-is-comment{color:rgba(var(--main-font-color),.35)}div.syntax-is-statement{color:rgba(var(--main-sunny-color),.7)}div.syntax-is-comma{color:rgba(var(--main-font-color),.5)}div.syntax-row{display:flex;flex-direction:row;height:calc(1.06555555555555 * var(--default-font-size,19pt) + .75pt + 3 * (10 / var(--scale-size)));min-height:calc(1.06555555555555 * var(--default-font-size,19pt) + .75pt + 3 * (10 / var(--scale-size)));max-height:calc(1.06555555555555 * var(--default-font-size,19pt) + .75pt + 3 * (10 / var(--scale-size)))}div.syntax-row:nth-child(even){background:rgba(0,0,0,.1)}select{width:100%;margin-bottom:calc(-1 * var(--default-height-size,20));color:var(--main-bg-color-rgba,#00f);background-color:var(--main-font-color-rgba,#fff);height:calc(1.6 * var(--default-height-size,20));font-size:calc(1 * var(--default-font-size,19pt));text-indent:calc(.3 * var(--default-height-size,20) + 4px);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));-webkit-appearance:none}label{margin-right:4px}label.range{border:none}label.select{position:relative;pointer-events:none;top:calc(-.175 * var(--default-height-size,20) - 2px);left:calc(100% - 1.4 * var(--default-height-size,20));border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));border:2px solid var(--main-font-color-rgba,#fff);background:var(--main-bg-color-rgba,#00f)}label.select{position:relative;pointer-events:none;top:calc(-.26 * var(--default-height-size,20) - 2px);left:calc(100% - 1.37 * var(--default-height-size,20) - 1px);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));border:2px solid var(--main-font-color-rgba,#fff);background:var(--main-bg-color-rgba,#00f);width:calc(1 * var(--default-height-size,20) - 2px);height:calc(1 * var(--default-height-size,20) - 2px)}div.radio{margin-top:2px;border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));background:var(--main-font-color-rgba,#fff);border:2px solid var(--main-bg-color-rgba,#00f)}label.radio{margin:calc(.2 * var(--default-height-size,20));font-size:calc(1 * var(--default-font-size,19pt));align-items:center;text-indent:calc(1 * var(--default-height-size,20) + 10px);color:var(--main-font-color-rgba,#fff);border-radius:calc(.8 * var(--default-height-size,20)/ var(--button-radius-size,2));width:calc(.8 * var(--default-height-size,20));height:calc(.8 * var(--default-height-size,20))}input:checked+label.radio{background:var(--main-bg-color-rgba,#00f)}label.radio:active,select:hover~label.select{background:rgba(var(--main-bg-color),.5)}label.file{display:block;text-align:center;background:var(--main-inverted-color-rgba);border-radius:calc(var(--default-height-size,20)/ var(--button-radius-size,2));font-size:calc(.8 * var(--default-font-size,19pt));color:rgba(var(--main-bg-color),.8);padding:calc(.4 * var(--default-height-size,20)) calc(.5 * var(--default-height-size,20)) calc(.5 * var(--default-height-size,20));word-break:break-all}label.modal-upload{width:100%;margin:unset;color:rgba(var(--main-font-color),.8);border-color:rgba(var(--main-font-color),.8);border-radius:calc(var(--default-height-size,20)/ var(--button-radius-size,2)/ 3)}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number],input[type=password],input[type=search],input[type=text]{cursor:text;width:100%;font-size:calc(1.1 * var(--default-font-size,19pt));text-align:center;color:var(--main-bg-color-rgba,#00f);-moz-appearance:textfield;position:relative;height:calc(1.35 * var(--default-height-size,20));background:var(--main-font-color-rgba,#fff);border-radius:calc(.2 * var(--default-height-size,20)/ var(--button-radius-size,2))}input[type=number]{width:calc(3 * var(--default-height-size,20))}input[type=search]{padding-left:4px;text-align:left;font-size:calc(.9 * var(--default-font-size,19pt))}input[type=password],input[type=text]{padding-left:4px;text-align:left;width:100%}input[type=search]::placeholder{color:rgba(var(--main-bg-color),.6)}input[type=search]::-webkit-search-cancel-button{display:none}label.search-icon{color:var(--main-bg-color-rgba);position:relative;top:calc(-.1 * var(--default-height-size,20) - 6px);left:calc(100% - 1.05 * var(--default-height-size,20) - 4px);margin-top:calc(-1.025 * var(--default-height-size,20) + 6px);margin-left:3px;width:calc(.6 * var(--default-height-size,20));height:calc(.6 * var(--default-height-size,20));border:solid calc(.1 * var(--default-height-size,20) + 1px) var(--main-bg-color-rgba);border-radius:calc(var(--default-height-size,20)/ var(--button-radius-size,2));-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}label.search-icon::before{content:'';position:absolute;top:calc(.65 * var(--default-height-size,20));left:calc(.23 * var(--default-height-size,20));height:calc(.3 * var(--default-height-size,20));width:calc(.1 * var(--default-height-size,20) + 1px);background-color:var(--main-bg-color-rgba)}label.number{text-indent:5px;border:none;margin-top:3px}label.color{text-indent:calc(3 * var(--default-height-size,20) + 8px);white-space:nowrap;position:relative;width:calc(3 * var(--default-height-size,20));height:calc(1.2 * var(--default-height-size,20));background:var(--main-font-color-rgba,#fff);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2))}label.color::after{content:'';position:absolute;top:calc(.2 * var(--default-height-size,20));left:calc(.2 * var(--default-height-size,20));width:calc(100% - calc(.4 * var(--default-height-size,20)));height:calc(.8 * var(--default-height-size,20));border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2))}div.text-main-bg{color:var(--main-bg-color-rgba,#00f)}div.text-main-font{color:var(--main-font-color-rgba,#fff)}div.text-main-inverted{color:var(--main-inverted-color-rgba)}div.text-main-warning{color:var(--main-warning-color-rgba,red)}div.text-main-info{color:var(--main-info-color-rgba,orange)}div.text-main-success{color:var(--main-success-color-rgba,green)}div.text-main-sunny{color:var(--main-sunny-color-rgba,#ff0)}div.text-main-bg-inverted{color:rgba(var(--main-bg-color),.25)}div.main-bg,label.main-bg,label.main-bg::after{background:var(--main-bg-color-rgba,#00f)}div.main-font,label.main-font,label.main-font::after{background:var(--main-font-color-rgba,#fff)}div.main-inverted,label.main-inverted::after,label.main-inveted{background:var(--main-inverted-color-rgba)}div.main-warning,label.main-warning,label.main-warning::after{background:var(--main-warning-color-rgba,red)}div.main-info,label.main-info,label.main-info::after{background:var(--main-info-color-rgba,orange)}div.main-success,label.main-success,label.main-success::after{background:var(--main-success-color-rgba,green)}div.main-sunny,label.main-sunny,label.main-sunny::after{background:var(--main-sunny-color-rgba,#ff0)}div.main-bg-inverted,label.main-bg-inverted,label.main-bg-inverted::after{background:rgba(var(--main-bg-color),.25)}div.entry>div{display:inline}div.entry>div.timestamp{color:rgba(var(--main-font-color),.5)}div.entry>div.main-info{color:var(--main-info-color-rgba);background:0 0}div.entry>div.main-sunny{color:var(--main-sunny-color-rgba);background:0 0}div.entry>div.main-warning{color:var(--main-warning-color-rgba);background:0 0}div.entry>div.main-success{color:var(--main-success-color-rgba);background:0 0}label.checkbox{position:relative;white-space:nowrap;text-indent:calc(3 * var(--default-height-size,20) + 8px);font-size:calc(1 * var(--default-font-size,19pt));width:calc(3 * var(--default-height-size,20));height:calc(1.2 * var(--default-height-size,20));background:var(--main-font-color-rgba,#fff);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2))}label.checkbox::after{content:'';position:absolute;top:calc(.2 * var(--default-height-size,20));left:calc(.2 * var(--default-height-size,20));width:calc(.8 * var(--default-height-size,20));height:calc(.8 * var(--default-height-size,20));background:var(--main-bg-color-rgba,#00f);border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));transition:.3s}input:checked+label.checkbox::after{left:calc(100% - calc(.2 * var(--default-height-size,20)));transform:translateX(-100%)}label.checkbox:active::after{width:calc(2 * var(--default-height-size,20))}#modal-input-upload-storage-free{margin-bottom:5px;margin-left:auto;height:calc(.42 * var(--default-height-size,20));color:var(--main-inverted-color-rgba);background-color:var(--main-font-color-rgba)}#modal-input-upload-storage-occupied{position:absolute;height:calc(.42 * var(--default-height-size,20));color:var(--main-font-color-rgba);background-color:rgba(var(--main-success-color),.75)}div.nav:hover,div.radio:hover,div.tag.with-close:hover,input[type=number]:hover,input[type=password]:hover,input[type=range]:hover,input[type=search]:hover,input[type=text]:hover,label.checkbox:hover,label.color:hover,label.radio:hover,label:hover.select,select:hover,select:hover~label.select,textarea:not(.editor):active,textarea:not(.editor):hover{border:2px solid var(--main-inverted-color-rgba)}div.nav:disabled,div.radio:disabled,div.tag.with-close:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=range]:disabled,input[type=search]:disabled,input[type=text]:disabled,label.checkbox:disabled,label.color:disabled,label.radio:disabled,label:disabled.select,select:disabled,select:disabled~label.select,textarea:not(.editor):disabled{color:rgba(var(--main-font-color),.5);background-color:rgba(var(--main-inverted-color),.5);border:2px solid rgba(var(--main-inverted-color),.5);cursor:not-allowed}div.tag.with-close:focus,input[type=number]:focus,input[type=password]:focus,input[type=range]:focus,input[type=search]:focus,input[type=text]:focus,label.checkbox:focus,label.color:focus,label.radio:focus,select:focus,select:focus~label.select,textarea:not(.editor):focus{border:2px solid var(--main-inverted-color-rgba)}div.row[id*=modal-buttons]>button:active,div.row[id*=modal-buttons]>button:focus,div.row[id*=modal-buttons]>button:hover{box-shadow:0 0 3px 3px var(--main-bg-color-rgba)}div.bottom-container button.main-inverted:hover,div.modal button.main-inverted:hover{border-color:rgba(var(--main-bg-color),.9)}div.bottom-container button.main-inverted:active,div.bottom-container button.main-inverted:focus,div.modal button.main-inverted:active,div.modal button.main-inverted:focus{border-color:rgba(var(--main-bg-color),.5);background:rgba(var(--main-bg-color),.3)}button:focus,button:hover,div.icon-button>button:focus,div.icon-button>button:hover{box-shadow:0 0 3px 3px var(--main-inverted-color-rgba);border-color:rgba(var(--main-inverted-color),.75)}button:focus.main-inverted,button:hover.main-inverted,label.file:focus,label.file:hover{box-shadow:0 0 3px 3px var(--main-inverted-color-rgba);border-color:rgba(var(--main-font-color),.5)}div.area-title>button:focus,div.area-title>button:hover{border-color:var(--main-inverted-color-rgba);box-shadow:inset 0 0 3px 3px var(--main-inverted-color-rgba)}.tag.with-close:active,button:active,div.area-title>button:active,input:active,label:not(.number):active,select:active,textarea:active{box-shadow:none!important}div.tag:focus.with-close>span,div.tag:hover.with-close>span{color:var(--main-inverted-color-rgba)}div.bottom-drawer.is-inactive>.bottom-tab:focus::after,div.bottom-drawer.is-inactive>.bottom-tab:hover::after,div.bottom-tab:focus::after,div.bottom-tab:hover::after{color:rgba(var(--main-font-color),.75)}div.bottom-container .tag.with-close:focus,div.bottom-container .tag.with-close:hover,div.bottom-container button:focus,div.bottom-container button:hover,div.bottom-container input:focus,div.bottom-container input:hover,div.bottom-container label:not(.number):focus,div.bottom-container label:not(.number):hover,div.bottom-container select:focus,div.bottom-container select:hover,div.bottom-container textarea:focus,div.bottom-container textarea:hover{box-shadow:0 0 3px 3px var(--main-bg-color-rgba)}label.modal-upload:focus,label.modal-upload:hover{color:rgba(var(--main-font-color),.9);border-color:rgba(var(--main-font-color),.3)}button.file-action{float:right;opacity:0}button.file-action>svg{transform:translateY(1px)}td:hover>button.file-action{opacity:1}div.modal-table tr.is-inactive,tr.is-inactive button{text-decoration:line-through}tr.is-inactive:hover button.file-action{opacity:0}div.spinner-box{width:100%;display:flex;justify-content:center;align-items:center;background-color:transparent;margin:4px}div.spinner-container{width:calc(8 * var(--default-height-size,20));display:flex;justify-content:space-between;align-items:center}div.spinner-object{opacity:.25;width:calc(.5 * var(--default-height-size,20));height:calc(.5 * var(--default-height-size,20));border-radius:calc(1 * var(--default-height-size,20)/ var(--button-radius-size,2));background-color:var(--main-font-color-rgba,#fff)}div.spinner-object-1{animation:pulse 2s ease 0s infinite alternate}div.spinner-object-2{animation:pulse 2s ease .5s infinite alternate}div.spinner-object-3{animation:pulse 2s ease 1s infinite alternate}div.spinner-object-4{animation:pulse 2s ease 1.5s infinite alternate}div.spinner-object-5{animation:pulse 2s ease 2s infinite alternate}svg.gauge>text{fill:var(--main-font-color-rgba,#fff)}svg.gauge>text.value{font-size:calc(2.3 * var(--default-font-size,19pt))}svg.gauge>text.text{font-size:calc(1.5 * var(--default-font-size,19pt))}svg.gauge{margin:3px;height:calc(5 * var(--default-height-size,20))}svg.gauge>circle{stroke:rgba(var(--main-font-color),.75);fill:rgba(var(--main-inverted-color),.75);stroke-width:calc(.55 * var(--default-font-size,19pt) + 8px);transform-origin:-1 calc(5/2 * var(--default-height-size,20));transform:rotate(270deg)}svg.gauge>circle.value{stroke-dasharray:574.5;stroke-dashoffset:574.5;transition:all .5s ease-out}svg.gauge.main-success>circle{stroke:rgba(var(--main-success-color),1)}svg.gauge.main-info>circle{stroke:rgba(var(--main-info-color),1)}svg.gauge.main-warning>circle{stroke:rgba(var(--main-warning-color),1)}input.main-bg{background:var(--main-bg-color-rgba,#00f)}input.main-success{background:var(--main-success-color-rgba,green)}input.main-warning{background:var(--main-warning-color-rgba,red)}input.main-info{background:var(--main-info-color-rgba,#ff0)}input.main-inverted{background:var(--main-inverted-color-rgba)}input.main-font{background:var(--main-font-color-rgba,#fff)}div.tab-icon,div.tab-text,svg{pointer-events:none}path.line-path{stroke-width:9.96280003;stroke-linecap:round}path.main-bg.line-path,svg.main-bg>path{stroke:var(--main-bg-color-rgba,#00f)}path.main-font.line-path,svg.main-font>path{stroke:var(--main-font-color-rgba,#fff)}path.main-inverted.line-path,svg.main-inverted>path{stroke:var(--main-inverted-color-rgba)}path.main-warning.line-path,svg.main-warning>path{stroke:var(--main-warning-color-rgba,red)}path.main-info.line-path,svg.main-info>path{stroke:var(--main-info-color-rgba,orange)}path.main-sunny.line-path,svg.main-sunny>path{stroke:var(--main-sunny-color-rgba,#ff0)}path.main-success.line-path,svg.main-success>path{stroke:var(--main-success-color-rgba,green)}path.fill-main-bg{fill:var(--main-bg-color-rgba,#00f)}path.fill-main-font{fill:var(--main-font-color-rgba,#fff)}path.fill-main-inverted{fill:var(--main-inverted-color-rgba)}path.fill-main-warning{fill:var(--main-warning-color-rgba,red)}path.fill-main-info{fill:var(--main-info-color-rgba,orange)}path.fill-main-sunny{fill:var(--main-sunny-color-rgba,#ff0)}path.fill-main-success{fill:var(--main-success-color-rgba,green)}svg.inline-icon{display:inline-block;width:calc(1 * var(--default-height-size,20))}svg.inline-icon.wifi{fill:rgba(var(--main-font-color),.5)}svg.level-1>rect[name=level-1],svg.level-2>rect[name=level-1],svg.level-2>rect[name=level-2],svg.level-3>rect[name=level-1],svg.level-3>rect[name=level-2],svg.level-3>rect[name=level-3],svg.level-4>rect[name=level-1],svg.level-4>rect[name=level-2],svg.level-4>rect[name=level-3],svg.level-4>rect[name=level-4],svg.level-5>rect[name=level-1],svg.level-5>rect[name=level-2],svg.level-5>rect[name=level-3],svg.level-5>rect[name=level-4],svg.level-5>rect[name=level-5],svg[signal=level-1]>rect[name=level-1],svg[signal=level-2]>rect[name=level-1],svg[signal=level-2]>rect[name=level-2],svg[signal=level-3]>rect[name=level-1],svg[signal=level-3]>rect[name=level-2],svg[signal=level-3]>rect[name=level-3],svg[signal=level-4]>rect[name=level-1],svg[signal=level-4]>rect[name=level-2],svg[signal=level-4]>rect[name=level-3],svg[signal=level-4]>rect[name=level-4],svg[signal=level-5]>rect[name=level-1],svg[signal=level-5]>rect[name=level-2],svg[signal=level-5]>rect[name=level-3],svg[signal=level-5]>rect[name=level-4],svg[signal=level-5]>rect[name=level-5]{fill:var(--main-font-color-rgba,#fff)}div[data-json-path],tspan[data-json-path]{display:contents}body.got-wallpaper>div.view-got-box-shadows{box-shadow:inset 0 15px 10px -10px rgba(var(--main-bg-color),.25),inset 0 -15px 10px -10px rgba(var(--main-bg-color),.25)}body.got-wallpaper div.nav{background-color:rgba(var(--main-bg-color),.8)}body.got-wallpaper div.area-title>button{background-color:rgba(var(--main-bg-color),.05)}body.got-wallpaper div.modal div.area-title>button{background-color:rgba(var(--main-bg-color),.75)}body.got-wallpaper div.is-inactive>div.bottom-tab{opacity:.4}body.got-wallpaper::after{content:"";opacity:.75;top:0;left:0;bottom:0;right:0;min-width:100vw;min-height:100vh;overflow:hidden;position:fixed;z-index:-1}div.got-wallpaper::after{content:"";opacity:.75;min-width:100vw;min-height:100vh;overflow:hidden;position:absolute;top:0;left:0}.logo-big{width:calc(5 * var(--default-height-size,20))}.logo-normal{width:calc(3 * var(--default-height-size,20))}.logo-little{width:calc(1.5 * var(--default-height-size,20))}.logo-tiny{width:calc(.75 * var(--default-height-size,20))}.logo-animation{--animation-duration:1500ms}.logo-animation>svg>path{animation:logoAnimation ease-out;animation-duration:calc(var(--animation-duration)/ 5)}.logo-animation>svg>path[name=logo-line0]{animation-delay:0s}.logo-animation>svg>path[name=logo-line1]{animation-delay:calc(1 * var(--animation-duration)/ 5)}.logo-animation>svg>path[name=logo-line2]{animation-delay:calc(2 * var(--animation-duration)/ 5)}.logo-animation>svg>path[name=logo-line3]{animation-delay:calc(3 * var(--animation-duration)/ 5)}.logo-animation>svg>path[name=logo-dot]{animation-delay:calc(4 * var(--animation-duration)/ 5)}.text-big{font-size:calc(1.5 * var(--default-font-size,19pt));font-weight:700;margin:20px 0 10px 0}.text-little,.tooltip{font-size:calc(.75 * var(--default-font-size,19pt))}.text-tiny{font-size:calc(.5 * var(--default-font-size,19pt))}.text-mini{font-size:calc(.35 * var(--default-font-size,19pt))}.is-monotext{font-family:"Lucida Console",Monaco,monospace}.is-dashed{border-style:dashed}.is-center{text-align:center;margin:auto}.is-left{text-align:left;left:0}.is-right{text-align:right;right:0}.is-hidden,div.is-hidden,div.silentStartup{display:none!important}.got-margin{margin:20px 0 20px 0}@media (min-width:1000px){#nav-right-small-screen{display:none}#nav-right-big-screen{display:flex}nav{height:calc(1.5 * var(--default-height-size,20))}div.page-contents{margin-top:calc(2.2 * var(--default-height-size,20) + 20px)}div.area{flex-direction:row}}@media (max-width:999px){#nav-right-small-screen{display:flex}#nav-right-big-screen{display:none}#nav-unit-name{margin-top:calc(1 * var(--default-height-size,20))}nav{height:calc(2.4 * var(--default-height-size,20) + 20px)}div.page-contents{margin-top:calc(3.8 * var(--default-height-size,20) + 20px)}div.area{flex-direction:column}}@media (min-width:550px){.nav-middle-area{display:flex}}@media (max-width:549px){.nav-middle-area{display:none}div.icon>.tab-text{max-width:calc(2.25px * var(--overflow-tab-text-size,24));text-overflow:ellipsis;white-space:nowrap;overflow:hidden}}@keyframes pulse{from{opacity:.25;transform:scale(1)}to{opacity:1;transform:scale(1.25)}}@keyframes fadeGone{0%{opacity:1;height:inherit}50%{opacity:1;height:inherit}99%{opacity:0;height:inherit}100%{opacity:0;height:0}}@keyframes countdown{from{border-color:rgba(var(--main-font-color),.75);width:2px;transform:translateX(50%) translateY(-50%) rotate(0)}to{border-color:rgba(var(--main-font-color),1);width:4px;transform:translateX(50%) translateY(-50%) rotate(360deg)}}@keyframes logoAnimation{0%{opacity:1}100%{opacity:0}} \ No newline at end of file diff --git a/build/0.0.nightly.1/gui.min.js b/build/0.0.nightly.1/gui.min.js new file mode 100644 index 0000000..7bf6087 --- /dev/null +++ b/build/0.0.nightly.1/gui.min.js @@ -0,0 +1 @@ +const guiEasy={logLevel:0,name:"GUI Easy",version:{major:0,minor:0,minimal:1,development:!0,releaseCandidate:0,full:function(){let e=guiEasy.version;return!0===e.development&&e.releaseCandidate>0?e.major+"."+e.minor+".rc"+e.releaseCandidate+"."+e.minimal:!0===e.development?e.major+"."+e.minor+".nightly."+e.minimal:e.major+"."+e.minor+"."+e.minimal}},geekName:function(){return guiEasy.name.replace(" ","-").toLowerCase()},geekNameFull:function(){return guiEasy.geekName()+"-"+guiEasy.version.full()},current:{},fetchSettings:{maxToKeep:5,minToKeep:1,intervalGUIupdater:1e3,intervalTimeKeeper:700,maxToKeepMs:function(){return 6e4/guiEasy.intervalGUIupdater}},nodes:[],startup:[{id:"curly",logText:"HTML build up"},{id:"scrubber",logText:"HTML scrubbing"},{id:"popper",logText:"Adding event handlers"},{id:"pitcher",logText:"Getting data from unit plus setting up user preferences"}],silentStartup:[{id:"butler",logText:"Fetching stuff from internet"},{id:"tender",logText:"The relay runner is being triggered"}],endpoints:{defaultTTL:function(){return 6e4},get:[{endpoint:"json",ttl_fallback:2e3},{endpoint:"buildinfo",ttl_fallback:99999999},{endpoint:"logjson"},{endpoint:"sysinfo_json"},{endpoint:"node_list_json"},{endpoint:"filelist_json"},{endpoint:"i2cscanner_json"},{endpoint:"pinstates_json"},{endpoint:"timingstats_json",ttl_fallback:999999},{endpoint:"wifiscanner_json"}],post:[{endpoint:"factoryreset_json"},{endpoint:"upload_json"}]},fetchingWait:"Fetching not yet completed, please wait...",maxTasks:function(e="ESP82XX"){return"ESP82XX"===e?12:"ESP32"===e?48:void 0},maxValuesPerTask:function(e="ESP82XX"){return"ESP82XX"===e?4:"ESP32"===e?8:void 0},maxNotification:function(e="ESP82XX"){return"ESP82XX"===e?3:"ESP32"===e?3:void 0},maxController:function(e="ESP82XX"){return"ESP82XX"===e?3:"ESP32"===e?3:void 0},maxPluginConfigVar:function(e="ESP82XX"){return"ESP82XX"===e?8:"ESP32"===e?8:void 0},maxPluginConfigFloatVar:function(e="ESP82XX"){return"ESP82XX"===e?4:"ESP32"===e?4:void 0},maxPluginConfigLongVar:function(e="ESP82XX"){return"ESP82XX"===e?4:"ESP32"===e?4:void 0},maxPluginExtraConfigVar:function(e="ESP82XX"){return"ESP82XX"===e?16:"ESP32"===e?16:void 0},maxFormulaLength:function(e="ESP82XX"){return"ESP82XX"===e?40:"ESP32"===e?40:void 0},timelist:{week:[{text:"Last",value:0,disabled:!1,note:""},{text:"1st",value:1,disabled:!1,note:""},{text:"2nd",value:2,disabled:!1,note:""},{text:"3rd",value:3,disabled:!1,note:""},{text:"4th",value:4,disabled:!1,note:""}],day:[{text:"Monday",value:1,disabled:!1,note:""},{text:"Tuesday",value:2,disabled:!1,note:""},{text:"Wednesday",value:3,disabled:!1,note:""},{text:"Thursday",value:4,disabled:!1,note:""},{text:"Friday",value:5,disabled:!1,note:""},{text:"Saturday",value:6,disabled:!1,note:""},{text:"Sunday",value:7,disabled:!1,note:""}],month:[{text:"January",value:1,disabled:!1,note:""},{text:"February",value:2,disabled:!1,note:""},{text:"Mars",value:3,disabled:!1,note:""},{text:"April",value:4,disabled:!1,note:""},{text:"May",value:5,disabled:!1,note:""},{text:"June",value:6,disabled:!1,note:""},{text:"July",value:7,disabled:!1,note:""},{text:"August",value:8,disabled:!1,note:""},{text:"September",value:9,disabled:!1,note:""},{text:"October",value:10,disabled:!1,note:""},{text:"November",value:11,disabled:!1,note:""},{text:"December",value:12,disabled:!1,note:""}]},gpiolist:function(e="ESP82XX"){return"ESP82XX"===e?[{text:"- None -",value:-1,disabled:!1,note:""},{text:"GPIO 0 (D3)",value:0,disabled:!1,note:"⚠"},{text:"GPIO 1 (D10)",value:1,disabled:!0,note:"Tx0"},{text:"GPIO 2 (D4)",value:2,disabled:!1,note:"⚠"},{text:"GPIO 3 (D9)",value:3,disabled:!0,note:"Rx0"},{text:"GPIO 4 (D2)",value:4,disabled:!1,note:""},{text:"GPIO 5 (D1)",value:5,disabled:!1,note:""},{text:"GPIO 9 (D11)",value:9,disabled:!1,note:"⚠"},{text:"GPIO 10 (D10)",value:10,disabled:!1,note:"⚠"},{text:"GPIO 12 (D12)",value:12,disabled:!1,note:""},{text:"GPIO 13 (D13)",value:13,disabled:!1,note:""},{text:"GPIO 14 (D14)",value:14,disabled:!1,note:""},{text:"GPIO 15 (D15)",value:15,disabled:!1,note:"⚠"},{text:"GPIO 16 (D16)",value:16,disabled:!1,note:""}]:"ESP32"===e?null:void 0},tabs:{left:["main","config","hardware","devices"],right:["controllers","notification","tools","rules"]},guiStats:{pageSize:0,bootTime:0,eventCalls:0,eventCallsTotal:0},syntax:{curlyLC:0,curly:["fetching","input","table","goto","button","version","devicetable","controllertable","notificationtable","setup","notifier","drawer","navbar","unit","unitname","modal","menu","wave","page","logo","icon"]},configDat:{}};guiEasy.configDat.configDatParseConfig=[{prop:"status.PID",type:"int32"},{prop:"status.version",type:"int32"},{prop:"status.build",type:"int16"},{prop:"config.IP.ip",type:"bytes",length:4},{prop:"config.IP.gw",type:"bytes",length:4},{prop:"config.IP.subnet",type:"bytes",length:4},{prop:"config.IP.dns",type:"bytes",length:4},{prop:"config.experimental.ip_octet",type:"byte"},{prop:"config.general.unitnr",type:"byte"},{prop:"config.general.unitname",type:"string",length:26},{prop:"config.ntp.host",type:"string",length:64},{prop:"config.sleep.sleeptime",type:"int32"},{prop:"hardware.i2c.sda",type:"byte"},{prop:"hardware.i2c.scl",type:"byte"},{prop:"hardware.led.gpio",type:"byte"},{prop:"Pin_sd_cs",type:"byte"},{prop:"hardware.gpio",type:"bytes",length:17},{prop:"config.log.syslog_ip",type:"bytes",length:4},{prop:"config.espnetwork.port",type:"int32"},{prop:"config.log.syslog_level",type:"byte"},{prop:"config.log.serial_level",type:"byte"},{prop:"config.log.web_level",type:"byte"},{prop:"config.log.sd_level",type:"byte"},{prop:"config.serial.baudrate",type:"int32"},{prop:"config.mqtt.interval",type:"int32"},{prop:"config.sleep.awaketime",type:"byte"},{prop:"CustomCSS",type:"byte"},{prop:"config.dst.enabled",type:"byte"},{prop:"config.experimental.WDI2CAddress",type:"byte"},{prop:"config.rules.enabled",type:"byte"},{prop:"config.serial.enabled",type:"byte"},{prop:"config.ssdp.enabled",type:"byte"},{prop:"config.ntp.enabled",type:"byte"},{prop:"config.experimental.WireClockStretchLimit",type:"int32"},{prop:"GlobalSync",type:"byte"},{prop:"config.experimental.ConnectionFailuresThreshold",type:"int32"},{prop:"TimeZone",type:"int16",signed:!0},{prop:"config.mqtt.retain_flag",type:"byte"},{prop:"hardware.spi.enabled",type:"byte"},[...Array(guiEasy.maxController())].map((e,t)=>({prop:`controllers[${t}].protocol`,type:"byte"})),[...Array(guiEasy.maxNotification())].map((e,t)=>({prop:`notifications[${t}].type`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].device`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].OLD_TaskDeviceID`,type:"int32"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].gpio1`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].gpio2`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].gpio3`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].gpio4`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].pin1pullup`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].configs`,type:"ints",length:guiEasy.maxPluginConfigVar()})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].pin1inversed`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].configs_float`,type:"floats",length:guiEasy.maxPluginConfigFloatVar()})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].configs_long`,type:"longs",length:guiEasy.maxPluginConfigLongVar()})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].OLD_senddata`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].global_sync`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].data_feed`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].interval`,type:"int32"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].enabled`,type:"byte"})),[...Array(guiEasy.maxController())].map((e,t)=>({prop:`controllers[${t}].enabled`,type:"byte"})),[...Array(guiEasy.maxNotification())].map((e,t)=>({prop:`notifications[${t}].enabled`,type:"byte"})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].TaskDeviceID`,type:"longs",length:guiEasy.maxController()})),[...Array(guiEasy.maxTasks())].map((e,t)=>({prop:`tasks[${t}].TaskDeviceSendData`,type:"bytes",length:guiEasy.maxController()})),{prop:"hardware.led.inverse",type:"byte"},{prop:"config.sleep.sleeponfailiure",type:"byte"},{prop:"UseValueLogger",type:"byte"},{prop:"ArduinoOTAEnable",type:"byte"},{prop:"config.dst.start",type:"int16"},{prop:"config.dst.end",type:"int16"},{prop:"UseRTOSMultitasking",type:"byte"},{prop:"hardware.reset.pin",type:"byte"},{prop:"config.log.syslog_facility",type:"byte"},{prop:"StructSize",type:"int32"},{prop:"config.mqtt.useunitname",type:"byte"},{prop:"config.location.lat",type:"float"},{prop:"config.location.long",type:"float"},{prop:"config._emptyBit",type:"bit"},{prop:"config.general.appendunitno",type:"bit"},{prop:"config.mqtt.changeclientidrecon",type:"bit"},{prop:"config.rules.oldengine",type:"bit"},{prop:"config.wifi.forcebgmode",type:"bit"},{prop:"config.wifi.restartconnlost",type:"bit"},{prop:"config.power.ecomode",type:"bit"},{prop:"config.wifi.nosleep",type:"bit"},{prop:"config.rules.tolerantargs",type:"bit"},{prop:"config.rules.SendToHTTPack",type:"bit"},{prop:"config.wifi.gratuitousARP",type:"bit"},{prop:"config._bits2",type:"byte"},{prop:"config._bits3",type:"byte"},{prop:"ResetFactoryDefaultPreference",type:"int32"}].flat(),guiEasy.configDat.taskSettings=[{prop:"index",type:"byte"},{prop:"name",type:"string",length:guiEasy.maxFormulaLength()+1},[...Array(guiEasy.maxValuesPerTask())].map((e,t)=>({prop:`values[${t}].formula`,type:"string",length:guiEasy.maxFormulaLength()+1})),[...Array(guiEasy.maxValuesPerTask())].map((e,t)=>({prop:`values[${t}].name`,type:"string",length:guiEasy.maxFormulaLength()+1})),{prop:"value_names",type:"string",length:guiEasy.maxFormulaLength()+1},{prop:"plugin_config_long",type:"longs",length:guiEasy.maxPluginExtraConfigVar()},{prop:"decimals",type:"bytes",length:guiEasy.maxValuesPerTask()},{prop:"plugin_config",type:"ints",length:guiEasy.maxPluginExtraConfigVar()}].flat(),guiEasy.configDat.controllerSettings=[{prop:"dns",type:"byte"},{prop:"IP",type:"bytes",length:4},{prop:"port",type:"int32"},{prop:"hostname",type:"string",length:65},{prop:"publish",type:"string",length:129},{prop:"subscribe",type:"string",length:129},{prop:"MQTT_lwt_topic",type:"string",length:129},{prop:"lwt_message_connect",type:"string",length:129},{prop:"lwt_message_disconnect",type:"string",length:129},{prop:"minimal_time_between",type:"int32"},{prop:"max_queue_depth",type:"int32"},{prop:"max_retry",type:"int32"},{prop:"delete_oldest",type:"byte"},{prop:"client_timeout",type:"int32"},{prop:"must_check_reply",type:"byte"}],guiEasy.configDat.notificationSettings=[{prop:"server",type:"string",length:65},{prop:"port",type:"int16"},{prop:"domain",type:"string",length:65},{prop:"sender",type:"string",length:65},{prop:"receiver",type:"string",length:65},{prop:"subject",type:"string",length:129},{prop:"body",type:"string",length:513},{prop:"pin1",type:"byte"},{prop:"pin2",type:"byte"},{prop:"user",type:"string",length:49},{prop:"pass",type:"string",length:33}],guiEasy.configDat.securitySettings=[{prop:"WifiSSID",type:"string",length:32},{prop:"WifiKey",type:"string",length:64},{prop:"WifiSSID2",type:"string",length:32},{prop:"WifiKey2",type:"string",length:64},{prop:"WifiAPKey",type:"string",length:64},[...Array(guiEasy.maxController())].map((e,t)=>({prop:`controllers[${t}].user`,type:"string",length:26})),[...Array(guiEasy.maxController())].map((e,t)=>({prop:`controllers[${t}].password`,type:"string",length:64})),{prop:"password",type:"string",length:26},{prop:"AllowedIPrangeLow",type:"bytes",length:4},{prop:"AllowedIPrangeHigh",type:"bytes",length:4},{prop:"IPblockLevel",type:"byte"},{prop:"ProgmemMd5",type:"bytes",length:16},{prop:"md5",type:"bytes",length:16}].flat();const set=(e,t,n)=>{let a=t.replace(/\[/g,".").replace(/]/g,"").split(".");if(a.length>1)for(let t=0;t>this.bitbytepos++&1;this.bitbyte=n?this.bitbyte|1<0&&document.getSelection().getRangeAt(0);t.select(),document.execCommand("copy"),document.body.removeChild(t),n&&(document.getSelection().removeAllRanges(),document.getSelection().addRange(n));let a={type:"clipboard",str:e};guiEasy.popper.tryCallEvent(a)},swapKey2Value:function(e){let t={};for(let n in e)t[e[n]]=n;return t},rgb2hex:function(e){e=e.split(",");let t="#";for(let n=0;n")),e},capitalWord:function(e){let t=["ok","gpio","led","ssid","spi","wpa","ap","ip","esp","dns","id","i2c","sda","scl","ntp","dst","gui","json","mqtt","p2p","rssi","bssid","dhcp","cpu","ram","sta","gw","l/r","http","udp"],n=e.toLowerCase().split(" ");for(let e=0;ee.json()).then(l=>{e[t].live[n]=l,e[t].live[n].timestamp=Date.now(),void 0!==l.TTL||(e[t].live[n].TTL=a),"logjson"===n&&void 0!==l.Log.TTL&&(e[t].live[n].TTL=l.Log.TTL),e[t].live[n].TTL_fallback=a;let i=Date.now()+e[t].live[n].TTL;e[t].scheduler.push([i,n]),e[t].scheduler.sort(),e[t].stats.lastRun=Date.now(),e[t].stats[n].run=Date.now()-s,e[t].stats[n].timestamp=Date.now(),e[t].stats.error=0}).catch(a=>{console.error("Error fetching ("+n+"): ",a),e[t].stats.error++;let l=Date.now()+e[t].stats[n].TTL_fallback;e[t].scheduler.push([l,n]),e[t].scheduler.sort(),e[t].stats.lastRun=Date.now(),e[t].stats[n].run=Date.now()-s,e[t].stats[n].timestamp=Date.now(),guiEasy.fetchCount.error++}),guiEasy.fetchCount.current++,guiEasy.fetchCount.current===guiEasy.fetchCount.max&&(guiEasy.current.live=t)},fetchConfigDat:function(e,t,n=!0){let a=Date.now(),s=["config.dat","notification.dat","security.dat"],l="http://"+e[t].ip+"/"+s[0]+"?callback="+a,i="http://"+e[t].ip+"/"+s[1]+"?callback="+a,o="http://"+e[t].ip+"/"+s[2]+"?callback="+a;fetch(l).then(e=>e.arrayBuffer()).then(async s=>{let l=helpEasy.parseConfigDat,r=guiEasy.configDat;const d=l(s,r.configDatParseConfig);[...Array(guiEasy.maxTasks())].map((e,t)=>{e=helpEasy.parseConfigDat,d.tasks[t].settings=e(s,r.taskSettings,4096+2048*t),d.tasks[t].extra=e(s,r.taskSettings,5120+2048*t)}),[...Array(guiEasy.maxController())].map((e,t)=>{e=helpEasy.parseConfigDat,d.controllers[t].settings=e(s,r.controllerSettings,27648+2048*t),d.controllers[t].extra=e(s,r.controllerSettings,28672+2048*t)});const u=await fetch(i).then(e=>e.arrayBuffer());[...Array(guiEasy.maxNotification())].map((e,t)=>{e=helpEasy.parseConfigDat,d.notifications[t].settings=e(u,r.notificationSettings,1024*t)});const p=await fetch(o).then(e=>e.arrayBuffer());d.security=[...Array(1)].map((e,t)=>(0,helpEasy.parseConfigDat)(p,r.securitySettings,1024*t)),e[t].settings=Object.assign({},d),e[t].settings.timestamp=a,!0===n&&(e[t].settingsBrowser=Object.assign({},d),e[t].settingsBrowser.timestamp=a),guiEasy.current.config=t,e[t].stats.lastRun=Date.now(),void 0===e[t].stats.configDat&&(e[t].stats.configDat={}),e[t].stats.configDat.run=Date.now()-a,e[t].stats.configDat.timestamp=a})},parseConfigDat:function(e,t,n){const a=new DataParser(e);n&&(a.offset=n);const s={};return t.map(e=>{const t=e.length?e.length:e.signed;set(s,e.prop,a[e.type](t,e.signed))}),s},getCurrentIndex:function(e=""){let t=document.querySelectorAll("[data-current-index]")[0];return"online"===e?"true"===t.dataset.currentOnline:parseInt(t.dataset.currentIndex)},setCurrentIndex:function(e){let t=document.querySelectorAll("[data-current-index]")[0];t.dataset.currentIndex=e,t.dataset.currentOnline="true"},setCurrentOnline:function(e){let t=document.querySelectorAll("[data-current-index]")[0];t.dataset.currentOnline="online"===e?"true":"false"},scheduleFetch:function(e,t,n){if(void 0===e[t].stats&&(e[t].stats={error:0}),void 0===n){let n=guiEasy.endpoints.get;guiEasy.fetchCount={max:0,current:0,error:0},e[t].live={},e[t].history={},e[t].scheduler=[];for(let a=0;aguiEasy.endpoints.defaultTTL()){e[t].stats[s]={TTL_fallback:guiEasy.endpoints.defaultTTL(),run:-1,timestamp:Date.now()};let n=Date.now()+a*guiEasy.fetchSettings.intervalTimeKeeper+2e3;e[t].scheduler.push([n,s]),e[t].scheduler.sort()}else{e[t].stats[s]={TTL_fallback:n[a].ttl_fallback,run:-1,timestamp:Date.now()},e[t].scheduler.push([0,s]),e[t].scheduler.sort();let l=guiEasy.fetchCount.max*guiEasy.fetchSettings.intervalTimeKeeper;setTimeout(function(){helpEasy.getDataFromNode(e,t,s,n[a].ttl_fallback)},l),guiEasy.fetchCount.max++}}}else{let a=guiEasy.fetchSettings,s=e[t].stats[n].TTL_fallback;helpEasy.getDataFromNode(e,t,n,s);let l=Object.assign({},e[t].live[n]);l.fetched=Date.now(),void 0===e[t].history[n]&&(e[t].history[n]=[]),e[t].history[n].push(l),e[t].history[n].length>a.maxToKeep*a.maxToKeepMs-1&&e[t].history[n].shift()}},getGuiInFields:function(){void 0===guiEasy.jsonPathsIN&&(guiEasy.jsonPathsIN=[]);let e=guiEasy.jsonPathsIN,t=document.querySelectorAll("[data-json-path]");for(let n=0;n"+a+"";for(let e=0;e"+s[e]+"":n+=s[e],e!==s.length-1?n+="
":n+="";for(let e=0;e":n+="";for(let e=0;e",n+=helpEasy.rssiToSVG(i[e]),e!==i.length-1?n+="
"+i[e]+" dBm

":n+="
"+i[e]+" dBm
";a="",s=[],l=[],i=[]}n+="\n \n
"+e.length+" separate APs found
\n
Fetched: "+helpEasy.epochToHHMMSS(e.timestamp)+"
\n
Scheduled: "+helpEasy.epochToHHMMSS(e.timestamp+e.TTL)+"
\n \n ",set(guiEasy.nodes[t],"modal.table.wifi",n)},filelist:function(e,t){let n=["notification.dat","config.dat","security.dat"],a=guiEasy.nodes[helpEasy.getCurrentIndex()].deleteFile;guiEasy.nodes[helpEasy.getCurrentIndex()].deleteFile=null;let s='\n ",set(guiEasy.nodes[t],"modal.table.files",s)},timingstatsList:function(e,t){let n=[],a=["plugin","controller","misc"];for(let t=0;t\n \n \n \n \n \n \n ';for(let e=s.length-1;e>-1;e--){let t="";s[e].subLevels>1&&(t="
"+s[e].subKey),l+='\n \n \n \n \n \n "}l+="\n
TypeTimerProcess
\n '+s[e].type+("000"+s[e].id).slice(-3)+'\n \n '+s[e].sortValue+'\n
\n avg: '+s[e].avg+"
\n min: "+s[e].min+"
\n max: "+s[e].max+"
\n count: "+s[e].count+"
\n per sec: "+s[e]["call-per-sec"]+"\n
\n
\n "+s[e].name+t+"\n
\n
Fetched: "+helpEasy.epochToHHMMSS(e.timestamp)+"
\n
Scheduled: "+helpEasy.epochToHHMMSS(e.timestamp+e.TTL)+"
\n \n ",set(guiEasy.nodes[t],"modal.table.timingstats_json",l)},twoLevelJsonToList:function(e,t){let n=guiEasy.nodes[t].live[e],a="",a+="";for(let l=0;l"}a+="
"+helpEasy.capitalWord(i)+""+o+"
"}}return a+="\n
Fetched: "+helpEasy.epochToHHMMSS(n.timestamp)+"
\n
Scheduled: "+helpEasy.epochToHHMMSS(n.timestamp+n.TTL)+"
\n \n ",set(guiEasy.nodes[t],"modal.table."+e,a),a},guiUpdater:function(){let e=Date.now(),t=helpEasy.getCurrentIndex(),n=guiEasy.nodes[t];void 0===guiEasy.jsonPathsIN&&(guiEasy.jsonPathsIN=[]);let a=guiEasy.jsonPathsIN;for(let e=0;e";set(guiEasy.nodes[t],"modal.table.wifi",e)}if(void 0!==n.live.filelist_json)helpEasy.filelist(n.live.filelist_json,t);else{let e="";set(guiEasy.nodes[t],"modal.table.files",e)}if(void 0!==n.live.sysinfo_json)helpEasy.twoLevelJsonToList("sysinfo_json",t);else{let e="";set(guiEasy.nodes[t],"modal.table.sysinfo_json",e)}if(void 0!==n.live.timingstats_json)helpEasy.timingstatsList(n.live.timingstats_json,t);else{let e="";set(guiEasy.nodes[t],"modal.table.timingstats_json",e)}i=document.querySelectorAll("[data-modal-table]");for(let e=0;eArray(r).fill("")),u=[...Array(o)].fill("");for(let e=0;e0&&document.getElementById(a+"hr").classList.remove("is-hidden"),document.getElementById(a+"name").innerText!==d[e][n].name&&(document.getElementById(a+"name").innerText=d[e][n].name),document.getElementById(a+"value").innerText!==d[e][n].value&&(document.getElementById(a+"value").innerText=d[e][n].value)}}guiEasy.current.gui=t,void 0===guiEasy.nodes[t].stats.gui&&(guiEasy.nodes[t].stats.gui={}),guiEasy.nodes[t].stats.gui.run=Date.now()-e,guiEasy.nodes[t].stats.gui.timestamp=e},clearTaskValues:function(e,t=null){let n,a,s=guiEasy.maxValuesPerTask(),l=[],i=[];if(null!==t){for(let o=1;o<=s;o++)(n=document.querySelectorAll("[id='task-"+(e+1)+"-value-"+(t+o)+"-name']")).length>0&&l.push([].slice.call(n)),(n=document.querySelectorAll("[id='task-"+(e+1)+"-value-"+(t+o)+"-value']")).length>0&&l.push([].slice.call(n)),null!==(a=document.getElementById("task-"+(e+1)+"-value-"+(t+o)+"-hr"))&&i.push(a);l.length>0&&l.map(e=>e.map(e=>e.innerHTML="")),i.length>0&&i.map(e=>e.classList.add("is-hidden"))}else(n=document.querySelectorAll("[data-clear-task='"+(e+1)+"']")).length>0&&(l=[].slice.call(n)),l.length>0&&l.map(e=>e.innerHTML=""),(a=document.querySelectorAll("[data-clear-hr='"+(e+1)+"']")).length>0&&(i=[].slice.call(a)),i.length>0&&i.map(e=>e.classList.add("is-hidden")),(a=document.querySelectorAll("[data-hide-row='"+(e+1)+"']")).length>0&&(i=[].slice.call(a)),i.length>0&&i.map(e=>e.classList.add("is-hidden"))},uploadBinaryAsFile:function(e,t,n){let a,s,l,i=document.getElementById("label-"+n),o=i.innerText;if("generic"===e&&(a=35,l="/upload",s=guiEasy.nodes[helpEasy.getCurrentIndex()].live.sysinfo_json.storage.spiffs_free),"firmware"===e&&(helpEasy.schedulerDelay(guiEasy.nodes,helpEasy.getCurrentIndex(),6e4),a=25,l="/update",s=guiEasy.nodes[helpEasy.getCurrentIndex()].live.sysinfo_json.storage.sketch_free),(s*=1e3)100&&(e=100),i.innerText=t.name+" ("+e+"%)"},n),u=new FormData;u.append("file",t),u.append("name",e),u.append("enctype","multipart/form-data");let p="http://"+guiEasy.nodes[helpEasy.getCurrentIndex()].ip+l;fetch(p,{method:"POST",body:u}).then(e=>e.text()).then(n=>{if(clearInterval(d),i.innerText=t.name+" (100%)",helpEasy.addToLogDOM(n,3),setTimeout(function(){helpEasy.blinkElement(i.id,"success")},500),"generic"===e&&setTimeout(function(){helpEasy.schedulerBump(guiEasy.nodes[helpEasy.getCurrentIndex()].scheduler,"sysinfo_json"),helpEasy.schedulerBump(guiEasy.nodes[helpEasy.getCurrentIndex()].scheduler,"filelist_json"),i.innerText=o,helpEasy.updateIndicator()},900),"firmware"===e){helpEasy.schedulerBump(guiEasy.nodes[helpEasy.getCurrentIndex()].scheduler,"sysinfo_json");let e=30,t=setInterval(function(){i.innerText="Will reboot in "+e,--e<1&&(clearInterval(t),location.reload())},1e3)}})}},updateIndicator:async function(){setTimeout(function(){let e=guiEasy.nodes[helpEasy.getCurrentIndex()].live.sysinfo_json.storage,t=Math.floor(parseInt(e.spiffs_free)/parseInt(e.spiffs_size)*100),n=document.getElementById("modal-input-upload-storage-free"),a=document.getElementById("modal-input-upload-storage-occupied");n.style.width=t+"%",n.innerText=parseInt(e.spiffs_free)+"kB",a.style.width=100-t+"%",a.innerText=(parseInt(e.spiffs_size)-parseInt(e.spiffs_free)).toString()+"kB"},5e3)},parseHTMLstring:function(e,t,n){let a=document.createElement("html");a.innerHTML=e;let s="";return"tag"===t&&(s=a.getElementsByTagName(n)[0].innerHTML.toString()),"name"===t&&(s=a.getElementsByName(n)[0].innerHTML.toString()),"class"===t&&(s=a.getElementsByClassName(n)[0].innerHTML.toString()),"id"===t&&(s=a.getElementById(n).innerHTML.toString()),"query"===t&&(s=a.querySelectorAll(n)[0].innerHTML.toString()),a.remove(),s},guiUpdaterSettings:function(e){let t=guiEasy.nodes[helpEasy.getCurrentIndex()],n=defaultSettings,a=helpEasy.getGuiInFields();e=void 0===e?"settings":"settingsBrowser";for(let s=0;s"+helpEasy.capitalWord(e[l[i].checked+"Text"])+e.tooltip+""}}}}},gaugeLevel:function(e,t){let n,a,s=e.parentNode,l=helpEasy.getjsonPathData(e.dataset.jsonPathGauge.split("--"),t),i=parseInt(e.dataset.max),o=parseInt(e.dataset.min),r="";i>o?((a=(l-o)/(i-o))>.6&&(r="main-info"),a>.8&&(r="main-warning"),a<.05&&(r="main-success")):((a=(l-i)/(o-i))<.4&&(r="main-info"),a<1-.8&&(r="main-warning"),a>.95&&(r="main-success")),(n=574.5*(1-a))>574.5&&(n=574.5),n<0&&(n=0),s.classList.remove("main-info","main-warning"),""!==r&&s.classList.add(r),e.style="stroke-dashoffset:"+n+";"},rssiToBars:function(e){return e>=-55?"level-5":e>=-66?"level-4":e>=-77?"level-3":e>=-88?"level-2":"level-1"},rssiToSVG:function(e){let t=helpEasy.rssiToBars(e);return guiEasy.curly.icon(["wifi",t])},getjsonPathData:function(e,t){return 1===e.length?t[e[0]]:2===e.length?t[e[0]][e[1]]:3===e.length?t[e[0]][e[1]][e[2]]:4===e.length?t[e[0]][e[1]][e[2]][e[3]]:5===e.length?t[e[0]][e[1]][e[2]][e[3]][e[4]]:6===e.length?t[e[0]][e[1]][e[2]][e[3]][e[4]][e[5]]:7===e.length?t[e[0]][e[1]][e[2]][e[3]][e[4]][e[5]][e[6]]:8===e.length?t[e[0]][e[1]][e[2]][e[3]][e[4]][e[5]][e[6]][e[7]]:void 0},sortObjectArray:e=>(t,n)=>t[e]===n[e]?0:t[e]=t&&console.log(e)},numberOfFound:function(e,t){return((e||"").match(t)||[]).length},findInArray:function(e,t){return t.indexOf(e)>-1},listOfProcesses:function(e,t,n,a){let s=document.getElementById("modal-loading-log"),l=document.getElementById("modal-loading-progress");document.getElementById("fallback-loading-animation").classList.add("is-hidden"),s.innerHTML+="
"+t+"
",l.max=guiEasy[a].length,void 0===guiEasy.guiStats[a]&&(guiEasy.guiStats[a]={}),guiEasy.guiStats[a][e]="running"},processDone:function(e,t){let n=document.getElementById("modal-loading-progress"),a=document.getElementById("log-entry-"+e),s=Date.now()-a.dataset.timestart;if(guiEasy.guiStats.bootTime+=s,a.innerHTML+=" ("+s+"ms)",a.classList.add("loading-is-done"),"startup"===t){if(n.max===n.value){let e=document.getElementById("modal-container");document.getElementById("modal-loading-screen").classList.add("is-hidden"),e.classList.add("is-hidden"),e.classList.remove("is-black"),helpEasy.addToLogDOM("total boot time: "+guiEasy.guiStats.bootTime+"ms",1)}n.value++}guiEasy.guiStats[t][e]="done"},internet:function(){let e=!1;return!0===window.navigator.onLine&&(e=!0),e},welcomePhrase:function(){let e=(new Date).getHours();return e>17?"Good evening!":e>11?"Good afternoon!":e>5?"Good morning!":"Hi!"},urlParams:function(){let e={};return window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(t,n,a){e[n.toLowerCase()]=a.toLowerCase()}),e},locationByIP:async function(){let e="https://ipapi.co/json?at="+Date.now()+"&gui="+guiEasy.geekNameFull(),t=await fetch(e);return await t.json()},blinkElement:function(e,t){let n=document.getElementById(e);n.classList.add("main-"+t),setTimeout(function(){n.classList.remove("main-"+t)},250)},dashGroupContainerOpen:function(e=""){return""===e?"
":"
"+helpEasy.capitalWord(e)+"
"},dashBoxContainerOpen:function(){return"
"},dashContainerClose:function(){return"
"},addToolsButton:function(e){let t="",n=e.type,a="";return void 0!==e.color&&(a=" main-"+e.color),"command"===n&&(t+="\n
\n \n
'+helpEasy.capitalWord(e.text)+"
\n
\n "),"info"===n&&(t+="\n
\n \n
'+helpEasy.capitalWord(e.text)+"
\n
\n "),"scanner"===n&&(t+="\n
\n \n
'+helpEasy.capitalWord(e.text)+"
\n
\n "),"system"===n&&(t+="\n
\n \n
'+helpEasy.capitalWord(e.text)+"
\n
\n "),t},addInput:function(e){let t=e.type,n="";void 0!==e.disabled&&!0===e.disabled&&(n="disabled");let a=e.title.split(" ").join("-"),s="generic-input-",l="";!0===e.toSettings&&(s="settings-input-",l+='data-settings="'+e.settingsId+'"'),void 0!==e.settingsIP&&(l+='data-settings-ip="'+e.settingsIP+'"'),void 0!==e.settingsRegEx&&(l+='data-settings-regex="'+e.settingsRegEx+'"'),void 0!==e.valueIfBlank&&(l+='data-value-if-blank="'+e.valueIfBlank+'"'),void 0!==e.allowedBlank&&(l+='data-allowed-blank="'+e.allowedBlank+'"'),void 0!==e.optionListOffset&&(l+='data-option-list-offset="'+e.optionListOffset+'"'),void 0!==e.list2value&&(l+='data-list2value="'+e.list2value+'"'),a=s+a;let i="",o="";void 0!==e.tooltip&&(i="
"+e.tooltip+"
",o="got-tooltip");let r="
";if("string"===t&&(r+=""+helpEasy.capitalWord(e.title)+i+"",r+="\n \n '),"password"===t&&(r+=""+helpEasy.capitalWord(e.title)+i+"",r+="\n \n '),"dropdown"===t){r+=""+helpEasy.capitalWord(e.title)+i+"",r+=' \n \n ";let t=e.optionList;for(let n=0;n"+s+i+"":r+=""}r+='\n \n '}if("toggle"===t&&(r+='\n \n \n "),"number"===t){let t="";""!==e.placeholder&&(t=" ["+e.placeholder+"]"),r+='\n \n \n "}return r+="
"},addLine:function(){return"
"},openArea:function(e){let t=e.replace(" ","-")+"-area";return defaultSettings.areasMinimized?'\n
\n
'+helpEasy.capitalWord(e)+'
\n ':'\n
\n
'+helpEasy.capitalWord(e)+'
\n '},closeArea:function(){return"
"},openColumn:function(e){return void 0===e?"
":"data"===e.split("-")[0]?"
":"
"},closeColumn:function(){return"
"},checkIfIP:function(e){return/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e)},screenshot:function(e){if(helpEasy.internet()){let e="screenshot-script",t={type:"wave",text:guiEasy.curly.icon(["screenshot"]),color:"inverted"},n=guiEasy.current.backgroundColor;void 0===n&&(n="#3492e2");let a=guiEasy.current.invertedColor;void 0===a&&(a="#2F4252");let s=helpEasy.capitalWord(guiEasy.current.tab.id.split("-")[0]),l=guiEasy.current.modal;void 0===l?l=guiEasy.current.tab:(n=a,s=s+"-"+document.getElementById("modal-title-text").innerText.replace(/ /g,"_")),s=guiEasy.nodes[helpEasy.getCurrentIndex()].live.json.System["Unit Name"]+"-"+s,guiEasy.popper.tryCallEvent(t);let i=document.createElement("script");i.id=e,i.onload=function(){html2canvas(l,{backgroundColor:n}).then(function(e){helpEasy.binaryDataToFile(e,"image/png",s+".png")})},i.src="https://github.com/niklasvh/html2canvas/releases/download/v1.0.0-rc.5/html2canvas.min.js",document.head.appendChild(i)}else{let e={type:"wave",text:"No internet!",color:"warning"};guiEasy.popper.tryCallEvent(e)}},binaryDataToFile:function(e,t,n){let a="temp-binary-blob-element",s=document.getElementById(a);null!==s&&s.remove();let l=document.createElement("a");l.id=a,document.body.appendChild(l),l.style.display="none",l.href=e.toDataURL(t),l.download=n,l.click()},favicon:function(e){let t=document.createElement("canvas");t.width=113,t.height=113;let n=t.getContext("2d");n.lineWidth=8,n.fillStyle=e.inverted,n.beginPath(),n.moveTo(0,15),n.lineTo(0,98),n.arc(15,98,15,Math.PI,.5*Math.PI,!0),n.lineTo(15,113),n.lineTo(98,113),n.arc(98,98,15,Math.PI,1.5*Math.PI,!0),n.lineTo(113,98),n.lineTo(113,15),n.arc(98,15,15,0,1.5*Math.PI,!0),n.lineTo(98,0),n.lineTo(15,0),n.arc(15,15,15,0,.5*Math.PI,!0),n.lineTo(0,15),n.closePath(),n.fill(),n.fillStyle=e.font,n.beginPath(),n.arc(90,90,10,0,2*Math.PI),n.closePath(),n.fill(),n.lineCap="round",n.strokeStyle=e.warning,n.beginPath(),n.moveTo(42,99),n.lineTo(99,42),n.closePath(),n.stroke(),n.strokeStyle=e.info,n.beginPath(),n.moveTo(14,99),n.lineTo(99,14),n.closePath(),n.stroke(),n.strokeStyle=e.sunny,n.beginPath(),n.moveTo(14,70),n.lineTo(70,14),n.closePath(),n.stroke(),n.strokeStyle=e.success,n.beginPath(),n.moveTo(14,42),n.lineTo(42,14),n.closePath(),n.stroke();let a=document.getElementById("favicon");null!==a&&a.remove(),(a=document.createElement("link")).id="favicon",a.type="image/x-icon",a.rel="shortcut icon",a.href=t.toDataURL("image/x-icon"),document.head.appendChild(a)}};function initiate(){for(let e=0;e0)return guiEasy.curly(e,t)}helpEasy.processDone(e,t),helpEasy.addToLogDOM(e+" loop count: "+guiEasy.syntax.curlyLC,1)},guiEasy.curly.compileArgs=function(e){let t=[],n=[];t.push(e[0].toLowerCase()),t.push(e.length-1);for(let t=1;t"+guiEasy.geekNameFull()+"
"},guiEasy.curly.unitname=function(){return"
"},guiEasy.curly.modal=function(e){let t=e[0],n="",a="";return"message"!==t?guiEasy.curly[t]:'\n \n "},guiEasy.curly.wave=function(){return'\n
\n
\n
\n '},guiEasy.curly.input=function(e){let t=e[0],n="";return"string"!==t&&"all"!==t||(n+=""),"textarea"!==t&&"all"!==t||(n+="\n
\n
\n
",t+="",n=e.right;let a="";for(let e=0;e",t+="",t+=""},guiEasy.curly.navbar.tab=function(e){return'\n
"; + //Area in between the tab groups... + html += ""; + x = tabs.right; + let rightHtml = ""; + for (let i=0; i < x.length; i++) { + rightHtml += guiEasy.curly.navbar.tab(x[i]); + } + rightHtml += ""; + html += ""; + html += ""; + html += ""; + return html; +}; + +guiEasy.curly.navbar.tab = function (name) { + return ` +