diff --git a/examples/device-dashboard/packed_fs.c b/examples/device-dashboard/packed_fs.c index 59cd220f..04aaca35 100644 --- a/examples/device-dashboard/packed_fs.c +++ b/examples/device-dashboard/packed_fs.c @@ -37,1167 +37,6 @@ static const unsigned char v1[] = { 10, 0 // . }; static const unsigned char v2[] = { - 39, 117, 115, 101, 32, 115, 116, 114, 105, 99, 116, 39, // 'use strict' - 59, 10, 105, 109, 112, 111, 114, 116, 32, 123, 67, 111, // ;.import {Co - 109, 112, 111, 110, 101, 110, 116, 44, 32, 104, 44, 32, // mponent, h, - 104, 116, 109, 108, 44, 32, 114, 101, 110, 100, 101, 114, // html, render - 44, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // , useEffect, - 32, 117, 115, 101, 83, 116, 97, 116, 101, 44, 32, 117, // useState, u - 115, 101, 82, 101, 102, 125, 32, 102, 114, 111, 109, 32, // seRef} from - 39, 46, 47, 112, 114, 101, 97, 99, 116, 46, 109, 105, // './preact.mi - 110, 46, 106, 115, 39, 59, 10, 10, 99, 111, 110, 115, // n.js';..cons - 116, 32, 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, // t MaxMetrics - 68, 97, 116, 97, 80, 111, 105, 110, 116, 115, 32, 61, // DataPoints = - 32, 53, 48, 59, 10, 10, 47, 47, 32, 84, 104, 105, // 50;..// Thi - 115, 32, 115, 105, 109, 112, 108, 101, 32, 112, 117, 98, // s simple pub - 108, 105, 115, 104, 47, 115, 117, 98, 115, 99, 114, 105, // lish/subscri - 98, 101, 32, 105, 115, 32, 117, 115, 101, 100, 32, 116, // be is used t - 111, 32, 112, 97, 115, 115, 32, 110, 111, 116, 105, 102, // o pass notif - 105, 99, 97, 116, 105, 111, 110, 115, 32, 116, 104, 97, // ications tha - 116, 32, 119, 101, 114, 101, 10, 47, 47, 32, 114, 101, // t were.// re - 99, 101, 105, 118, 101, 100, 32, 102, 114, 111, 109, 32, // ceived from - 116, 104, 101, 32, 115, 101, 114, 118, 101, 114, 44, 32, // the server, - 116, 111, 32, 97, 108, 108, 32, 99, 104, 105, 108, 100, // to all child - 32, 99, 111, 109, 112, 111, 110, 101, 110, 116, 115, 32, // components - 111, 102, 32, 116, 104, 101, 32, 97, 112, 112, 46, 10, // of the app.. - 118, 97, 114, 32, 80, 117, 98, 83, 117, 98, 32, 61, // var PubSub = - 32, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // (function() - 32, 123, 10, 32, 32, 118, 97, 114, 32, 104, 97, 110, // {. var han - 100, 108, 101, 114, 115, 32, 61, 32, 123, 125, 44, 32, // dlers = {}, - 105, 100, 32, 61, 32, 48, 59, 10, 32, 32, 114, 101, // id = 0;. re - 116, 117, 114, 110, 32, 123, 10, 32, 32, 32, 32, 115, // turn {. s - 117, 98, 115, 99, 114, 105, 98, 101, 58, 32, 102, 117, // ubscribe: fu - 110, 99, 116, 105, 111, 110, 40, 102, 110, 41, 32, 123, // nction(fn) { - 10, 32, 32, 32, 32, 32, 32, 104, 97, 110, 100, 108, // . handl - 101, 114, 115, 91, 105, 100, 43, 43, 93, 32, 61, 32, // ers[id++] = - 102, 110, 59, 10, 32, 32, 32, 32, 125, 44, 10, 32, // fn;. },. - 32, 32, 32, 117, 110, 115, 117, 98, 115, 99, 114, 105, // unsubscri - 98, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, // be: function - 40, 105, 100, 41, 32, 123, 10, 32, 32, 32, 32, 32, // (id) {. - 32, 100, 101, 108, 101, 116, 101, 32, 104, 97, 110, 100, // delete hand - 108, 101, 114, 115, 91, 105, 100, 93, 59, 10, 32, 32, // lers[id];. - 32, 32, 125, 44, 10, 32, 32, 32, 32, 112, 117, 98, // },. pub - 108, 105, 115, 104, 58, 32, 102, 117, 110, 99, 116, 105, // lish: functi - 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, 32, // on(data) {. - 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, // for (va - 114, 32, 107, 32, 105, 110, 32, 104, 97, 110, 100, 108, // r k in handl - 101, 114, 115, 41, 32, 104, 97, 110, 100, 108, 101, 114, // ers) handler - 115, 91, 107, 93, 40, 100, 97, 116, 97, 41, 59, 10, // s[k](data);. - 32, 32, 32, 32, 125, 10, 32, 32, 125, 59, 10, 125, // }. };.} - 41, 40, 41, 59, 10, 10, 99, 111, 110, 115, 116, 32, // )();..const - 78, 97, 118, 32, 61, 32, 112, 114, 111, 112, 115, 32, // Nav = props - 61, 62, 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, // => html`.. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. < - 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 102, // div style="f - 108, 101, 120, 58, 32, 49, 32, 49, 32, 97, 117, 116, // lex: 1 1 aut - 111, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, // o; display: - 102, 108, 101, 120, 59, 32, 97, 108, 105, 103, 110, 45, // flex; align- - 105, 116, 101, 109, 115, 58, 32, 99, 101, 110, 116, 101, // items: cente - 114, 59, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, // r;">. < - 98, 62, 89, 111, 117, 114, 32, 80, 114, 111, 100, 117, // b>Your Produ - 99, 116, 60, 47, 98, 62, 10, 32, 32, 32, 32, 60, // ct. < - 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, // /div>. . < - 115, 112, 97, 110, 62, 76, 111, 103, 103, 101, 100, 32, // span>Logged - 105, 110, 32, 97, 115, 58, 60, 47, 115, 112, 97, 110, // in as:. . - 32, 32, 32, 32, 60, 115, 112, 97, 110, 62, 36, 123, // ${ - 112, 114, 111, 112, 115, 46, 117, 115, 101, 114, 125, 60, // props.user}< - 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, 32, // /span>. - 32, 60, 97, 32, 99, 108, 97, 115, 115, 61, 34, 98, // logout - 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, // .
. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, // .`;...cons - 116, 32, 72, 101, 114, 111, 32, 61, 32, 112, 114, 111, // t Hero = pro - 112, 115, 32, 61, 62, 32, 104, 116, 109, 108, 96, 10, // ps => html`. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. - 10, 32, 32, 60, 104, 49, 32, 115, 116, 121, 108, 101, // .

Inte - 114, 97, 99, 116, 105, 118, 101, 32, 68, 101, 118, 105, // ractive Devi - 99, 101, 32, 68, 97, 115, 104, 98, 111, 97, 114, 100, // ce Dashboard - 60, 47, 104, 49, 62, 10, 10, 32, 32, 60, 112, 62, //

..

- 10, 32, 32, 84, 104, 105, 115, 32, 100, 101, 118, 105, // . This devi - 99, 101, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // ce dashboard - 32, 105, 115, 32, 100, 101, 118, 101, 108, 111, 112, 101, // is develope - 100, 32, 119, 105, 116, 104, 32, 109, 111, 100, 101, 114, // d with moder - 110, 32, 97, 110, 100, 32, 99, 111, 109, 112, 97, 99, // n and compac - 116, 32, 80, 114, 101, 97, 99, 116, 32, 102, 114, 97, // t Preact fra - 109, 101, 119, 111, 114, 107, 44, 10, 32, 32, 105, 110, // mework,. in - 32, 111, 114, 100, 101, 114, 32, 116, 111, 32, 102, 105, // order to fi - 116, 32, 111, 110, 32, 97, 32, 118, 101, 114, 121, 32, // t on a very - 115, 109, 97, 108, 108, 32, 100, 101, 118, 105, 99, 101, // small device - 115, 46, 32, 84, 104, 105, 115, 32, 105, 115, 10, 32, // s. This is. - 32, 97, 32, 60, 97, 32, 104, 114, 101, 102, 61, 34, // a hybr - 105, 100, 32, 115, 101, 114, 118, 101, 114, 60, 47, 97, // id server which. pr - 111, 118, 105, 100, 101, 115, 32, 98, 111, 116, 104, 32, // ovides both - 115, 116, 97, 116, 105, 99, 32, 97, 110, 100, 32, 100, // static and d - 121, 110, 97, 109, 105, 99, 32, 99, 111, 110, 116, 101, // ynamic conte - 110, 116, 46, 32, 32, 83, 116, 97, 116, 105, 99, 32, // nt. Static - 102, 105, 108, 101, 115, 44, 32, 108, 105, 107, 101, 32, // files, like - 67, 83, 83, 47, 74, 83, 47, 72, 84, 77, 76, 10, // CSS/JS/HTML. - 32, 32, 111, 114, 32, 105, 109, 97, 103, 101, 115, 44, // or images, - 32, 97, 114, 101, 32, 99, 111, 109, 112, 105, 108, 101, // are compile - 100, 32, 105, 110, 116, 111, 32, 116, 104, 101, 32, 115, // d into the s - 101, 114, 118, 101, 114, 32, 98, 105, 110, 97, 114, 121, // erver binary - 46, 10, 10, 32, 32, 84, 104, 105, 115, 32, 85, 73, // ... This UI - 32, 117, 115, 101, 115, 32, 116, 104, 101, 32, 82, 69, // uses the RE - 83, 84, 32, 65, 80, 73, 32, 105, 109, 112, 108, 101, // ST API imple - 109, 101, 110, 116, 101, 100, 32, 98, 121, 32, 116, 104, // mented by th - 101, 32, 100, 101, 118, 105, 99, 101, 44, 32, 119, 104, // e device, wh - 105, 99, 104, 32, 121, 111, 117, 32, 99, 97, 110, 32, // ich you can - 101, 120, 97, 109, 105, 110, 101, 10, 32, 32, 117, 115, // examine. us - 105, 110, 103, 32, 32, 60, 99, 111, 100, 101, 62, 99, // ing c - 117, 114, 108, 60, 47, 99, 111, 100, 101, 62, 32, 99, // url c - 111, 109, 109, 97, 110, 100, 45, 108, 105, 110, 101, 32, // ommand-line - 117, 116, 105, 108, 105, 116, 121, 58, 10, 32, 32, 60, // utility:. < - 47, 112, 62, 10, 10, 32, 32, 60, 100, 105, 118, 62, // /p>..

- 60, 99, 111, 100, 101, 62, 99, 117, 114, 108, 32, 108, // curl l - 111, 99, 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, // ocalhost:800 - 48, 47, 97, 112, 105, 47, 99, 111, 110, 102, 105, 103, // 0/api/config - 47, 103, 101, 116, 60, 47, 99, 111, 100, 101, 62, 32, // /get - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, //
. curl - 32, 108, 111, 99, 97, 108, 104, 111, 115, 116, 58, 56, // localhost:8 - 48, 48, 48, 47, 97, 112, 105, 47, 99, 111, 110, 102, // 000/api/conf - 105, 103, 47, 115, 101, 116, 32, 45, 100, 32, 39, 118, // ig/set -d 'v - 97, 108, 117, 101, 49, 61, 55, 38, 118, 97, 108, 117, // alue1=7&valu - 101, 50, 61, 104, 101, 108, 108, 111, 39, 60, 47, 99, // e2=hello'
. - 32, 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, 101, //
curl localh - 111, 115, 116, 58, 56, 48, 48, 48, 47, 97, 112, 105, // ost:8000/api - 47, 109, 101, 115, 115, 97, 103, 101, 47, 115, 101, 110, // /message/sen - 100, 32, 45, 100, 32, 39, 109, 115, 103, 61, 104, 101, // d -d 'msg=he - 108, 108, 111, 39, 60, 47, 99, 111, 100, 101, 62, 32, // llo' - 60, 47, 100, 105, 118, 62, 10, 10, 32, 32, 60, 112, //
..

. A device - 32, 99, 97, 110, 32, 115, 101, 110, 100, 32, 110, 111, // can send no - 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, 115, 32, // tifications - 116, 111, 32, 116, 104, 105, 115, 32, 100, 97, 115, 104, // to this dash - 98, 111, 97, 114, 100, 32, 97, 116, 32, 97, 110, 121, // board at any - 116, 105, 109, 101, 46, 32, 78, 111, 116, 105, 102, 105, // time. Notifi - 99, 97, 116, 105, 111, 110, 115, 10, 32, 32, 97, 114, // cations. ar - 101, 32, 115, 101, 110, 116, 32, 111, 118, 101, 114, 32, // e sent over - 87, 101, 98, 115, 111, 99, 107, 101, 116, 32, 97, 116, // Websocket at - 32, 85, 82, 73, 32, 60, 99, 111, 100, 101, 62, 99, // URI c - 117, 114, 108, 32, 108, 111, 99, 97, 108, 104, 111, 115, // url localhos - 116, 58, 56, 48, 48, 48, 47, 97, 112, 105, 47, 119, // t:8000/api/w - 97, 116, 99, 104, 60, 47, 99, 111, 100, 101, 62, 10, // atch. - 32, 32, 97, 115, 32, 74, 83, 79, 78, 32, 115, 116, // as JSON st - 114, 105, 110, 103, 115, 32, 60, 99, 111, 100, 101, 62, // rings - 123, 34, 110, 97, 109, 101, 34, 58, 32, 34, 46, 46, // {"name": ".. - 34, 44, 32, 34, 100, 97, 116, 97, 34, 58, 32, 46, // ", "data": . - 46, 46, 125, 60, 47, 99, 111, 100, 101, 62, 10, 32, // ..}. - 32, 60, 47, 112, 62, 10, 60, 47, 100, 105, 118, 62, //

. - 10, 60, 47, 100, 105, 118, 62, 96, 59, 10, 10, 99, // .`;..c - 111, 110, 115, 116, 32, 76, 111, 103, 105, 110, 32, 61, // onst Login = - 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, 114, // function(pr - 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, 110, // ops) {. con - 115, 116, 32, 91, 117, 115, 101, 114, 44, 32, 115, 101, // st [user, se - 116, 85, 115, 101, 114, 93, 32, 61, 32, 117, 115, 101, // tUser] = use - 83, 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, 32, // State('');. - 32, 99, 111, 110, 115, 116, 32, 91, 112, 97, 115, 115, // const [pass - 44, 32, 115, 101, 116, 80, 97, 115, 115, 93, 32, 61, // , setPass] = - 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState('' - 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, // );. const l - 111, 103, 105, 110, 32, 61, 32, 101, 118, 32, 61, 62, // ogin = ev => - 10, 32, 32, 32, 32, 32, 32, 102, 101, 116, 99, 104, // . fetch - 40, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // (. - 39, 47, 97, 112, 105, 47, 108, 111, 103, 105, 110, 39, // '/api/login' - 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ,. - 123, 104, 101, 97, 100, 101, 114, 115, 58, 32, 123, 65, // {headers: {A - 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110, // uthorization - 58, 32, 39, 66, 97, 115, 105, 99, 32, 39, 32, 43, // : 'Basic ' + - 32, 98, 116, 111, 97, 40, 117, 115, 101, 114, 32, 43, // btoa(user + - 32, 39, 58, 39, 32, 43, 32, 112, 97, 115, 115, 41, // ':' + pass) - 125, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, // }}). - 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, // .then(r => - 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 10, 32, // r.json()). - 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, // .th - 101, 110, 40, 114, 32, 61, 62, 32, 114, 32, 38, 38, // en(r => r && - 32, 112, 114, 111, 112, 115, 46, 108, 111, 103, 105, 110, // props.login - 40, 114, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, // (r)). - 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, 114, // .catch(er - 114, 32, 61, 62, 32, 101, 114, 114, 41, 59, 10, 32, // r => err);. - 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, 108, // return html - 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, // `.
- 10, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, // .
. - 60, 104, 49, 32, 115, 116, 121, 108, 101, 61, 34, 99, //

Device Dash - 98, 111, 97, 114, 100, 32, 76, 111, 103, 105, 110, 32, // board Login - 60, 47, 104, 49, 62, 10, 32, 32, 32, 32, 60, 100, //

. . < - 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 39, // input type=' - 116, 101, 120, 116, 39, 32, 112, 108, 97, 99, 101, 104, // text' placeh - 111, 108, 100, 101, 114, 61, 39, 78, 97, 109, 101, 39, // older='Name' - 32, 115, 116, 121, 108, 101, 61, 34, 119, 105, 100, 116, // style="widt - 104, 58, 32, 49, 48, 48, 37, 59, 34, 10, 32, 32, // h: 100%;". - 32, 32, 32, 32, 32, 32, 111, 110, 105, 110, 112, 117, // oninpu - 116, 61, 36, 123, 101, 118, 32, 61, 62, 32, 115, 101, // t=${ev => se - 116, 85, 115, 101, 114, 40, 101, 118, 46, 116, 97, 114, // tUser(ev.tar - 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, // get.value)} - 118, 97, 108, 117, 101, 61, 36, 123, 117, 115, 101, 114, // value=${user - 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, 47, 100, // } />. .
. setPass( - 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, // ev.target.va - 108, 117, 101, 41, 125, 32, 118, 97, 108, 117, 101, 61, // lue)} value= - 36, 123, 112, 97, 115, 115, 125, 10, 32, 32, 32, 32, // ${pass}. - 32, 32, 32, 32, 111, 110, 99, 104, 97, 110, 103, 101, // onchange - 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, 62, // =${login} /> - 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, // .
. - 32, 32, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, //
. - 32, 32, 32, 60, 98, 117, 116, 116, 111, 110, 32, 99, // . - 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, //
. - 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
. - 32, 32, 32, 32, 86, 97, 108, 105, 100, 32, 108, 111, // Valid lo - 103, 105, 110, 115, 58, 32, 97, 100, 109, 105, 110, 58, // gins: admin: - 112, 97, 115, 115, 48, 44, 32, 117, 115, 101, 114, 49, // pass0, user1 - 58, 112, 97, 115, 115, 49, 44, 32, 117, 115, 101, 114, // :pass1, user - 50, 58, 112, 97, 115, 115, 50, 10, 32, 32, 32, 32, // 2:pass2. - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, 100, //
. .
`; - 10, 125, 59, 10, 10, 10, 99, 111, 110, 115, 116, 32, // .};...const - 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // Configuratio - 110, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // n = function - 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, // (props) {. - 99, 111, 110, 115, 116, 32, 91, 117, 114, 108, 44, 32, // const [url, - 115, 101, 116, 85, 114, 108, 93, 32, 61, 32, 117, 115, // setUrl] = us - 101, 83, 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, // eState(props - 46, 99, 111, 110, 102, 105, 103, 46, 117, 114, 108, 32, // .config.url - 124, 124, 32, 39, 39, 41, 59, 10, 32, 32, 99, 111, // || '');. co - 110, 115, 116, 32, 91, 112, 117, 98, 44, 32, 115, 101, // nst [pub, se - 116, 80, 117, 98, 93, 32, 61, 32, 117, 115, 101, 83, // tPub] = useS - 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, 46, 99, // tate(props.c - 111, 110, 102, 105, 103, 46, 112, 117, 98, 32, 124, 124, // onfig.pub || - 32, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, 115, // '');. cons - 116, 32, 91, 115, 117, 98, 44, 32, 115, 101, 116, 83, // t [sub, setS - 117, 98, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // ub] = useSta - 116, 101, 40, 112, 114, 111, 112, 115, 46, 99, 111, 110, // te(props.con - 102, 105, 103, 46, 115, 117, 98, 32, 124, 124, 32, 39, // fig.sub || ' - 39, 41, 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, // ');.. useEf - 102, 101, 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, // fect(() => { - 10, 32, 32, 32, 32, 115, 101, 116, 85, 114, 108, 40, // . setUrl( - 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, // props.config - 46, 117, 114, 108, 41, 59, 10, 32, 32, 32, 32, 115, // .url);. s - 101, 116, 80, 117, 98, 40, 112, 114, 111, 112, 115, 46, // etPub(props. - 99, 111, 110, 102, 105, 103, 46, 112, 117, 98, 41, 59, // config.pub); - 10, 32, 32, 32, 32, 115, 101, 116, 83, 117, 98, 40, // . setSub( - 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, // props.config - 46, 115, 117, 98, 41, 59, 10, 32, 32, 125, 44, 32, // .sub);. }, - 91, 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, // [props.confi - 103, 93, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, // g]);.. cons - 116, 32, 117, 112, 100, 97, 116, 101, 32, 61, 32, 40, // t update = ( - 110, 97, 109, 101, 44, 32, 118, 97, 108, 41, 32, 61, // name, val) = - 62, 32, 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, // > fetch('/ap - 105, 47, 99, 111, 110, 102, 105, 103, 47, 115, 101, 116, // i/config/set - 39, 44, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // ', {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 109, 101, 116, 104, 111, 100, 58, 32, 39, // method: ' - 112, 111, 115, 116, 39, 44, 10, 32, 32, 32, 32, 32, // post',. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 98, 111, 100, 121, 58, 32, 96, // body: ` - 36, 123, 110, 97, 109, 101, 125, 61, 36, 123, 101, 110, // ${name}=${en - 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, 112, 111, // codeURICompo - 110, 101, 110, 116, 40, 118, 97, 108, 41, 125, 96, 10, // nent(val)}`. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 46, 99, // }).c - 97, 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, // atch(err => - 101, 114, 114, 41, 59, 10, 32, 32, 99, 111, 110, 115, // err);. cons - 116, 32, 117, 112, 100, 97, 116, 101, 117, 114, 108, 32, // t updateurl - 61, 32, 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, // = ev => upda - 116, 101, 40, 39, 117, 114, 108, 39, 44, 32, 117, 114, // te('url', ur - 108, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // l);. const - 117, 112, 100, 97, 116, 101, 112, 117, 98, 32, 61, 32, // updatepub = - 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, // ev => update - 40, 39, 112, 117, 98, 39, 44, 32, 112, 117, 98, 41, // ('pub', pub) - 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 117, 112, // ;. const up - 100, 97, 116, 101, 115, 117, 98, 32, 61, 32, 101, 118, // datesub = ev - 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, 40, 39, // => update(' - 115, 117, 98, 39, 44, 32, 115, 117, 98, 41, 59, 10, // sub', sub);. - 10, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // . console.l - 111, 103, 40, 112, 114, 111, 112, 115, 44, 32, 91, 117, // og(props, [u - 114, 108, 44, 32, 112, 117, 98, 44, 32, 115, 117, 98, // rl, pub, sub - 93, 41, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ]);. return - 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.

. - 32, 32, 68, 101, 118, 105, 99, 101, 32, 67, 111, 110, // Device Con - 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 60, 47, // figuration.
. M - 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, 58, 60, // QTT server:< - 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, 60, // /span>. < - 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 34, // input type=" - 116, 101, 120, 116, 34, 32, 115, 116, 121, 108, 101, 61, // text" style= - 34, 102, 108, 101, 120, 58, 32, 49, 32, 49, 48, 48, // "flex: 1 100 - 37, 59, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, // %;". - 32, 32, 118, 97, 108, 117, 101, 61, 36, 123, 117, 114, // value=${ur - 108, 125, 32, 111, 110, 99, 104, 97, 110, 103, 101, 61, // l} onchange= - 36, 123, 117, 112, 100, 97, 116, 101, 117, 114, 108, 125, // ${updateurl} - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 111, // . o - 110, 105, 110, 112, 117, 116, 61, 36, 123, 101, 118, 32, // ninput=${ev - 61, 62, 32, 115, 101, 116, 85, 114, 108, 40, 101, 118, // => setUrl(ev - 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, // .target.valu - 101, 41, 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, // e)} />. < - 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, 115, 115, // button class - 61, 34, 98, 116, 110, 34, 32, 100, 105, 115, 97, 98, // ="btn" disab - 108, 101, 100, 61, 36, 123, 33, 117, 114, 108, 125, 32, // led=${!url} - 111, 110, 99, 108, 105, 99, 107, 61, 36, 123, 117, 112, // onclick=${up - 100, 97, 116, 101, 117, 114, 108, 125, 10, 32, 32, 32, // dateurl}. - 32, 32, 32, 115, 116, 121, 108, 101, 61, 34, 109, 97, // style="ma - 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, 32, 49, // rgin-left: 1 - 101, 109, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // em; backgrou - 110, 100, 58, 32, 35, 56, 97, 97, 59, 34, 62, 85, // nd: #8aa;">U - 112, 100, 97, 116, 101, 60, 47, 98, 117, 116, 116, 111, // pdate.
. - 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
- 10, 32, 32, 32, 32, 60, 115, 112, 97, 110, 32, 99, // . Subs - 99, 114, 105, 98, 101, 32, 116, 111, 112, 105, 99, 58, // cribe topic: - 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, // . - 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // - 115, 101, 116, 83, 117, 98, 40, 101, 118, 46, 116, 97, // setSub(ev.ta - 114, 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, // rget.value)} - 32, 47, 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, // />. Upda - 116, 101, 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, // te. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < - 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 109, // div style="m - 97, 114, 103, 105, 110, 58, 32, 48, 46, 53, 101, 109, // argin: 0.5em - 32, 48, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, // 0; display: - 32, 102, 108, 101, 120, 59, 34, 62, 10, 32, 32, 32, // flex;">. - 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // Publish - 116, 111, 112, 105, 99, 58, 60, 47, 115, 112, 97, 110, // topic:. se - 116, 80, 117, 98, 40, 101, 118, 46, 116, 97, 114, 103, // tPub(ev.targ - 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, // et.value)} / - 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, // >. Update - 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, 32, 32, // . - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, //

. . You c - 97, 110, 32, 117, 115, 101, 32, 60, 97, 32, 104, 114, // an use . Hive - 77, 81, 32, 87, 101, 98, 115, 111, 99, 107, 101, 116, // MQ Websocket - 32, 119, 101, 98, 32, 99, 108, 105, 101, 110, 116, 60, // web client< - 47, 97, 62, 32, 116, 111, 32, 115, 101, 110, 100, 32, // /a> to send - 109, 101, 115, 115, 97, 103, 101, 115, 32, 116, 111, 32, // messages to - 116, 104, 105, 115, 32, 99, 111, 110, 115, 111, 108, 101, // this console - 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // ..
. - 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
. D - 101, 118, 105, 99, 101, 32, 107, 101, 101, 112, 115, 32, // evice keeps - 97, 32, 112, 101, 114, 115, 105, 115, 116, 101, 110, 116, // a persistent - 32, 99, 111, 110, 110, 101, 99, 116, 105, 111, 110, 32, // connection - 116, 111, 32, 116, 104, 101, 32, 99, 111, 110, 102, 105, // to the confi - 103, 117, 114, 101, 100, 32, 77, 81, 84, 84, 32, 115, // gured MQTT s - 101, 114, 118, 101, 114, 46, 10, 32, 32, 32, 32, 67, // erver.. C - 104, 97, 110, 103, 101, 115, 32, 116, 111, 32, 116, 104, // hanges to th - 105, 115, 32, 99, 111, 110, 102, 105, 103, 117, 114, 97, // is configura - 116, 105, 111, 110, 32, 97, 114, 101, 32, 112, 114, 111, // tion are pro - 112, 97, 103, 97, 116, 101, 100, 32, 116, 111, 32, 97, // pagated to a - 108, 108, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // ll dashboard - 115, 58, 32, 116, 114, 121, 10, 32, 32, 32, 32, 99, // s: try. c - 104, 97, 110, 103, 105, 110, 103, 32, 116, 104, 101, 109, // hanging them - 32, 105, 110, 32, 116, 104, 105, 115, 32, 100, 97, 115, // in this das - 104, 98, 111, 97, 114, 100, 32, 97, 110, 100, 32, 111, // hboard and o - 98, 115, 101, 114, 118, 101, 32, 99, 104, 97, 110, 103, // bserve chang - 101, 115, 32, 105, 110, 32, 116, 104, 101, 32, 111, 116, // es in the ot - 104, 101, 114, 32, 111, 112, 101, 110, 101, 100, 10, 32, // her opened. - 32, 32, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // dashboard - 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 60, 100, // ..
. Note - 58, 32, 97, 100, 109, 105, 110, 105, 115, 116, 114, 97, // : administra - 116, 111, 114, 115, 32, 99, 97, 110, 32, 115, 101, 101, // tors can see - 32, 116, 104, 105, 115, 32, 115, 101, 99, 116, 105, 111, // this sectio - 110, 32, 97, 110, 100, 32, 99, 97, 110, 32, 99, 104, // n and can ch - 97, 110, 103, 101, 32, 100, 101, 118, 105, 99, 101, 10, // ange device. - 32, 32, 32, 32, 99, 111, 110, 102, 105, 103, 117, 114, // configur - 97, 116, 105, 111, 110, 44, 32, 119, 104, 105, 108, 115, // ation, whils - 116, 32, 117, 115, 101, 114, 115, 32, 99, 97, 110, 110, // t users cann - 111, 116, 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, // ot.. - 10, 60, 47, 100, 105, 118, 62, 96, 59, 10, 125, 59, // .`;.}; - 10, 10, 10, 99, 111, 110, 115, 116, 32, 77, 101, 115, // ...const Mes - 115, 97, 103, 101, 32, 61, 32, 109, 32, 61, 62, 32, // sage = m => - 104, 116, 109, 108, 96, 60, 100, 105, 118, 32, 115, 116, // html`
. - 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // qos: - 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, 101, // ${m.message - 46, 113, 111, 115, 125, 32, 60, 47, 115, 112, 97, 110, // .qos} . - 116, 111, 112, 105, 99, 58, 32, 36, 123, 109, 46, 109, // topic: ${m.m - 101, 115, 115, 97, 103, 101, 46, 116, 111, 112, 105, 99, // essage.topic - 125, 32, 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, // } . - 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, // data: - 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, 101, // ${m.message - 46, 100, 97, 116, 97, 125, 60, 47, 115, 112, 97, 110, // .data}.
`;.. - 99, 111, 110, 115, 116, 32, 77, 101, 115, 115, 97, 103, // const Messag - 101, 115, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // es = functio - 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, // n(props) {. - 32, 99, 111, 110, 115, 116, 32, 91, 109, 101, 115, 115, // const [mess - 97, 103, 101, 115, 44, 32, 115, 101, 116, 77, 101, 115, // ages, setMes - 115, 97, 103, 101, 115, 93, 32, 61, 32, 117, 115, 101, // sages] = use - 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, 32, // State([]);. - 32, 99, 111, 110, 115, 116, 32, 91, 116, 120, 116, 44, // const [txt, - 32, 115, 101, 116, 84, 120, 116, 93, 32, 61, 32, 117, // setTxt] = u - 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, 41, 59, // seState(''); - 10, 10, 32, 32, 117, 115, 101, 69, 102, 102, 101, 99, // .. useEffec - 116, 40, 40, 41, 32, 61, 62, 32, 123, 10, 32, 32, // t(() => {. - 32, 32, 99, 111, 110, 115, 116, 32, 105, 100, 32, 61, // const id = - 32, 80, 117, 98, 83, 117, 98, 46, 115, 117, 98, 115, // PubSub.subs - 99, 114, 105, 98, 101, 40, 102, 117, 110, 99, 116, 105, // cribe(functi - 111, 110, 40, 109, 115, 103, 41, 32, 123, 10, 32, 32, // on(msg) {. - 32, 32, 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, // if (msg. - 110, 97, 109, 101, 32, 61, 61, 32, 39, 109, 101, 115, // name == 'mes - 115, 97, 103, 101, 39, 41, 32, 115, 101, 116, 77, 101, // sage') setMe - 115, 115, 97, 103, 101, 115, 40, 120, 32, 61, 62, 32, // ssages(x => - 120, 46, 99, 111, 110, 99, 97, 116, 40, 91, 109, 115, // x.concat([ms - 103, 46, 100, 97, 116, 97, 93, 41, 41, 59, 10, 32, // g.data]));. - 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, 32, 114, // });. r - 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, 117, 98, // eturn PubSub - 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, 98, 101, // .unsubscribe - 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, 32, 91, // (id);. }, [ - 93, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, // ]);.. const - 32, 115, 101, 110, 100, 109, 101, 115, 115, 97, 103, 101, // sendmessage - 32, 61, 32, 101, 118, 32, 61, 62, 32, 102, 101, 116, // = ev => fet - 99, 104, 40, 39, 47, 97, 112, 105, 47, 109, 101, 115, // ch('/api/mes - 115, 97, 103, 101, 47, 115, 101, 110, 100, 39, 44, 32, // sage/send', - 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 109, 101, 116, 104, // meth - 111, 100, 58, 32, 39, 112, 111, 115, 116, 39, 44, 10, // od: 'post',. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 98, 111, 100, 121, 58, 32, // body: - 96, 109, 101, 115, 115, 97, 103, 101, 61, 36, 123, 101, // `message=${e - 110, 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, 112, // ncodeURIComp - 111, 110, 101, 110, 116, 40, 116, 120, 116, 41, 125, 96, // onent(txt)}` - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // . - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 125, 41, 46, 116, 104, 101, 110, // }).then - 40, 114, 32, 61, 62, 32, 115, 101, 116, 84, 120, 116, // (r => setTxt - 40, 39, 39, 41, 41, 59, 10, 32, 32, 99, 111, 110, // (''));. con - 115, 116, 32, 99, 111, 110, 110, 115, 116, 97, 116, 117, // st connstatu - 115, 32, 61, 32, 112, 114, 111, 112, 115, 46, 99, 111, // s = props.co - 110, 102, 105, 103, 46, 99, 111, 110, 110, 101, 99, 116, // nfig.connect - 101, 100, 32, 63, 32, 39, 99, 111, 110, 110, 101, 99, // ed ? 'connec - 116, 101, 100, 39, 32, 58, 32, 39, 100, 105, 99, 111, // ted' : 'dico - 110, 110, 101, 99, 116, 101, 100, 39, 59, 10, 32, 32, // nnected';. - 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, 108, 96, // return html` - 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, // .
. - 32, 60, 104, 51, 32, 115, 116, 121, 108, 101, 61, 34, //

MQTT mess - 97, 103, 101, 115, 60, 47, 104, 51, 62, 10, 32, 32, // ages

. - 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, 77, 81, //
. MQ - 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, 115, 116, // TT server st - 97, 116, 117, 115, 58, 32, 60, 98, 62, 36, 123, 99, // atus: ${c - 111, 110, 110, 115, 116, 97, 116, 117, 115, 125, 60, 47, // onnstatus}.
. - 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
. ${ - 109, 101, 115, 115, 97, 103, 101, 115, 46, 109, 97, 112, // messages.map - 40, 109, 101, 115, 115, 97, 103, 101, 32, 61, 62, 32, // (message => - 104, 40, 77, 101, 115, 115, 97, 103, 101, 44, 32, 123, // h(Message, { - 109, 101, 115, 115, 97, 103, 101, 125, 41, 41, 125, 10, // message}))}. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < - 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 109, // div style="m - 97, 114, 103, 105, 110, 58, 32, 48, 46, 53, 101, 109, // argin: 0.5em - 32, 48, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, // 0; display: - 32, 102, 108, 101, 120, 34, 62, 10, 32, 32, 32, 32, // flex">. - 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, // Publish m - 101, 115, 115, 97, 103, 101, 58, 60, 47, 115, 112, 97, // essage:. setTx - 116, 40, 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, // t(ev.target. - 118, 97, 108, 117, 101, 41, 125, 32, 47, 62, 10, 32, // value)} />. - 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, //
. . Mess - 97, 103, 101, 32, 103, 101, 116, 115, 32, 112, 97, 115, // age gets pas - 115, 101, 100, 32, 116, 111, 32, 116, 104, 101, 32, 100, // sed to the d - 101, 118, 105, 99, 101, 32, 118, 105, 97, 32, 82, 69, // evice via RE - 83, 84, 46, 32, 84, 104, 101, 110, 32, 97, 32, 100, // ST. Then a d - 101, 118, 105, 99, 101, 32, 115, 101, 110, 100, 115, 32, // evice sends - 105, 116, 32, 116, 111, 10, 32, 32, 32, 32, 116, 104, // it to. th - 101, 32, 77, 81, 84, 84, 32, 115, 101, 114, 118, 101, // e MQTT serve - 114, 32, 111, 118, 101, 114, 32, 77, 81, 84, 84, 46, // r over MQTT. - 32, 65, 108, 108, 32, 77, 81, 84, 84, 32, 109, 101, // All MQTT me - 115, 115, 97, 103, 101, 115, 32, 111, 110, 32, 97, 32, // ssages on a - 115, 117, 98, 115, 99, 114, 105, 98, 101, 100, 32, 116, // subscribed t - 111, 112, 105, 99, 10, 32, 32, 32, 32, 114, 101, 99, // opic. rec - 101, 105, 118, 101, 100, 32, 98, 121, 32, 97, 32, 100, // eived by a d - 101, 118, 105, 99, 101, 44, 32, 97, 114, 101, 32, 112, // evice, are p - 114, 111, 112, 97, 103, 97, 116, 101, 100, 32, 116, 111, // ropagated to - 32, 116, 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, // this dashbo - 97, 114, 100, 32, 118, 105, 97, 32, 116, 104, 101, 10, // ard via the. - 32, 32, 32, 32, 47, 97, 112, 105, 47, 119, 97, 116, // /api/wat - 99, 104, 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, // ch.. - 10, 60, 47, 100, 105, 118, 62, 96, 59, 10, 125, 59, // .`;.}; - 10, 10, 47, 47, 32, 69, 120, 112, 101, 99, 116, 101, // ..// Expecte - 100, 32, 97, 114, 103, 117, 109, 101, 110, 116, 115, 58, // d arguments: - 10, 47, 47, 32, 100, 97, 116, 97, 58, 32, 116, 105, // .// data: ti - 109, 101, 115, 101, 114, 105, 101, 115, 44, 32, 101, 46, // meseries, e. - 103, 46, 32, 91, 32, 91, 49, 54, 53, 52, 51, 54, // g. [ [165436 - 49, 51, 53, 50, 44, 32, 49, 57, 93, 44, 32, 91, // 1352, 19], [ - 49, 54, 53, 52, 51, 54, 49, 51, 53, 51, 44, 32, // 1654361353, - 49, 56, 93, 44, 32, 46, 46, 46, 32, 93, 10, 47, // 18], ... ]./ - 47, 32, 119, 105, 100, 116, 104, 44, 32, 104, 101, 105, // / width, hei - 103, 104, 116, 44, 32, 121, 116, 105, 99, 107, 115, 44, // ght, yticks, - 32, 120, 116, 105, 99, 107, 115, 44, 32, 121, 109, 105, // xticks, ymi - 110, 44, 32, 121, 109, 97, 120, 44, 32, 120, 109, 105, // n, ymax, xmi - 110, 44, 32, 120, 109, 97, 120, 10, 99, 111, 110, 115, // n, xmax.cons - 116, 32, 83, 86, 71, 32, 61, 32, 102, 117, 110, 99, // t SVG = func - 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, 41, 32, // tion(props) - 123, 10, 32, 32, 47, 47, 32, 32, 32, 32, 32, 32, // {. // - 32, 32, 32, 32, 32, 32, 119, 10, 32, 32, 47, 47, // w. // - 32, 32, 32, 43, 45, 45, 45, 45, 45, 45, 45, 45, // +-------- - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ - 45, 43, 10, 32, 32, 47, 47, 32, 32, 32, 124, 32, // -+. // | - 32, 32, 32, 32, 32, 32, 32, 104, 49, 32, 32, 32, // h1 - 32, 32, 32, 32, 32, 32, 32, 32, 124, 10, 32, 32, // |. - 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, 43, 45, // // | +- - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 43, 32, // ----------+ - 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, 32, 32, // |. // - 124, 32, 32, 32, 32, 124, 32, 32, 32, 32, 32, 32, // | | - 32, 32, 32, 32, 32, 124, 32, 32, 32, 32, 124, 32, // | | - 32, 104, 10, 32, 32, 47, 47, 32, 32, 32, 124, 32, // h. // | - 119, 49, 32, 124, 32, 32, 32, 32, 32, 32, 32, 32, // w1 | - 32, 32, 32, 124, 32, 119, 50, 32, 124, 10, 32, 32, // | w2 |. - 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, 43, 45, // // | +- - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 43, 32, // ----------+ - 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, 32, 32, // |. // - 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, 104, 50, // | h2 - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 10, // |. - 32, 32, 47, 47, 32, 32, 32, 43, 45, 45, 45, 45, // // +---- - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ - 45, 45, 45, 45, 45, 43, 10, 32, 32, 47, 47, 10, // -----+. //. - 32, 32, 108, 101, 116, 32, 119, 32, 61, 32, 112, 114, // let w = pr - 111, 112, 115, 46, 119, 105, 100, 116, 104, 44, 32, 104, // ops.width, h - 32, 61, 32, 112, 114, 111, 112, 115, 46, 104, 101, 105, // = props.hei - 103, 104, 116, 44, 32, 119, 49, 32, 61, 32, 51, 48, // ght, w1 = 30 - 44, 32, 119, 50, 32, 61, 32, 48, 44, 32, 104, 49, // , w2 = 0, h1 - 32, 61, 32, 56, 44, 32, 104, 50, 32, 61, 32, 49, // = 8, h2 = 1 - 56, 59, 10, 32, 32, 108, 101, 116, 32, 121, 116, 105, // 8;. let yti - 99, 107, 115, 32, 61, 32, 112, 114, 111, 112, 115, 46, // cks = props. - 121, 116, 105, 99, 107, 115, 32, 124, 124, 32, 52, 44, // yticks || 4, - 32, 120, 116, 105, 99, 107, 115, 32, 61, 32, 112, 114, // xticks = pr - 111, 112, 115, 46, 120, 116, 105, 99, 107, 115, 32, 124, // ops.xticks | - 124, 32, 53, 59, 10, 32, 32, 108, 101, 116, 32, 100, // | 5;. let d - 97, 116, 97, 32, 61, 32, 112, 114, 111, 112, 115, 46, // ata = props. - 100, 97, 116, 97, 32, 124, 124, 32, 91, 93, 59, 10, // data || [];. - 32, 32, 108, 101, 116, 32, 121, 109, 105, 110, 32, 61, // let ymin = - 32, 112, 114, 111, 112, 115, 46, 121, 109, 105, 110, 32, // props.ymin - 124, 124, 32, 48, 59, 10, 32, 32, 108, 101, 116, 32, // || 0;. let - 121, 109, 97, 120, 32, 61, 32, 112, 114, 111, 112, 115, // ymax = props - 46, 121, 109, 97, 120, 32, 124, 124, 32, 77, 97, 116, // .ymax || Mat - 104, 46, 109, 97, 120, 46, 97, 112, 112, 108, 121, 40, // h.max.apply( - 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, // null, data.m - 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, 49, 93, // ap(p => p[1] - 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, 120, 109, // ));. let xm - 105, 110, 32, 61, 32, 112, 114, 111, 112, 115, 46, 120, // in = props.x - 109, 105, 110, 32, 124, 124, 32, 77, 97, 116, 104, 46, // min || Math. - 109, 105, 110, 46, 97, 112, 112, 108, 121, 40, 110, 117, // min.apply(nu - 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, 97, 112, // ll, data.map - 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, 41, 41, // (p => p[0])) - 59, 10, 32, 32, 108, 101, 116, 32, 120, 109, 97, 120, // ;. let xmax - 32, 61, 32, 112, 114, 111, 112, 115, 46, 120, 109, 97, // = props.xma - 120, 32, 124, 124, 32, 77, 97, 116, 104, 46, 109, 97, // x || Math.ma - 120, 46, 97, 112, 112, 108, 121, 40, 110, 117, 108, 108, // x.apply(null - 44, 32, 100, 97, 116, 97, 46, 109, 97, 112, 40, 112, // , data.map(p - 32, 61, 62, 32, 112, 91, 48, 93, 41, 41, 59, 10, // => p[0]));. - 10, 32, 32, 47, 47, 32, 89, 45, 97, 120, 105, 115, // . // Y-axis - 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, 115, 32, // tick lines - 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, 10, 32, // and labels. - 32, 108, 101, 116, 32, 121, 116, 97, 32, 61, 32, 40, // let yta = ( - 110, 101, 119, 32, 65, 114, 114, 97, 121, 40, 121, 116, // new Array(yt - 105, 99, 107, 115, 32, 43, 32, 49, 41, 41, 46, 102, // icks + 1)).f - 105, 108, 108, 40, 48, 41, 46, 109, 97, 112, 40, 40, // ill(0).map(( - 95, 44, 32, 105, 41, 32, 61, 62, 32, 105, 41, 59, // _, i) => i); - 32, 32, 47, 47, 32, 105, 110, 100, 105, 99, 101, 115, // // indices - 10, 32, 32, 108, 101, 116, 32, 121, 116, 105, 32, 61, // . let yti = - 32, 105, 32, 61, 62, 32, 104, 32, 45, 32, 104, 50, // i => h - h2 - 32, 45, 32, 40, 104, 32, 45, 32, 104, 49, 32, 45, // - (h - h1 - - 32, 104, 50, 41, 32, 42, 32, 105, 32, 47, 32, 121, // h2) * i / y - 116, 105, 99, 107, 115, 59, 32, 32, 32, 32, 32, 32, // ticks; - 32, 32, 32, 32, 47, 47, 32, 105, 110, 100, 101, 120, // // index - 39, 115, 32, 89, 10, 32, 32, 108, 101, 116, 32, 121, // 's Y. let y - 116, 118, 32, 61, 32, 105, 32, 61, 62, 32, 40, 121, // tv = i => (y - 109, 97, 120, 32, 45, 32, 121, 109, 105, 110, 41, 32, // max - ymin) - 42, 32, 105, 32, 47, 32, 121, 116, 105, 99, 107, 115, // * i / yticks - 59, 10, 32, 32, 108, 101, 116, 32, 121, 116, 108, 32, // ;. let ytl - 61, 32, 121, 32, 61, 62, 32, 104, 116, 109, 108, 96, // = y => html` - 60, 108, 105, 110, 101, 32, 120, 49, 61, 36, 123, 119, // `;. le - 116, 32, 121, 116, 116, 32, 61, 32, 40, 121, 44, 32, // t ytt = (y, - 118, 41, 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, // v) => html`< - 116, 101, 120, 116, 32, 120, 61, 48, 32, 121, 61, 36, // text x=0 y=$ - 123, 121, 32, 43, 32, 53, 125, 32, 99, 108, 97, 115, // {y + 5} clas - 115, 61, 34, 108, 97, 98, 101, 108, 34, 62, 36, 123, // s="label">${ - 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, 59, 10, // v}`;. - 10, 32, 32, 47, 47, 32, 88, 45, 97, 120, 105, 115, // . // X-axis - 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, 115, 32, // tick lines - 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, 10, 32, // and labels. - 32, 108, 101, 116, 32, 100, 97, 116, 101, 102, 109, 116, // let datefmt - 32, 61, 32, 117, 110, 105, 120, 32, 61, 62, 32, 40, // = unix => ( - 110, 101, 119, 32, 68, 97, 116, 101, 40, 117, 110, 105, // new Date(uni - 120, 32, 42, 32, 49, 48, 48, 48, 41, 41, 46, 116, // x * 1000)).t - 111, 73, 83, 79, 83, 116, 114, 105, 110, 103, 40, 41, // oISOString() - 46, 115, 117, 98, 115, 116, 114, 40, 49, 52, 44, 32, // .substr(14, - 53, 41, 59, 10, 32, 32, 108, 101, 116, 32, 120, 116, // 5);. let xt - 97, 32, 61, 32, 40, 110, 101, 119, 32, 65, 114, 114, // a = (new Arr - 97, 121, 40, 120, 116, 105, 99, 107, 115, 32, 43, 32, // ay(xticks + - 49, 41, 41, 46, 102, 105, 108, 108, 40, 48, 41, 46, // 1)).fill(0). - 109, 97, 112, 40, 40, 95, 44, 32, 105, 41, 32, 61, // map((_, i) = - 62, 32, 105, 41, 59, 32, 32, 47, 47, 32, 105, 110, // > i); // in - 100, 105, 99, 101, 115, 10, 32, 32, 108, 101, 116, 32, // dices. let - 120, 116, 105, 32, 61, 32, 105, 32, 61, 62, 32, 119, // xti = i => w - 49, 32, 43, 32, 40, 119, 32, 45, 32, 119, 49, 32, // 1 + (w - w1 - 45, 32, 119, 50, 41, 32, 42, 32, 105, 32, 47, 32, // - w2) * i / - 120, 116, 105, 99, 107, 115, 59, 32, 32, 32, 32, 32, // xticks; - 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, // // - 105, 110, 100, 101, 120, 39, 115, 32, 88, 10, 32, 32, // index's X. - 108, 101, 116, 32, 120, 116, 118, 32, 61, 32, 105, 32, // let xtv = i - 61, 62, 32, 100, 97, 116, 101, 102, 109, 116, 40, 120, // => datefmt(x - 109, 105, 110, 32, 43, 32, 40, 120, 109, 97, 120, 32, // min + (xmax - 45, 32, 120, 109, 105, 110, 41, 32, 42, 32, 105, 32, // - xmin) * i - 47, 32, 120, 116, 105, 99, 107, 115, 41, 59, 10, 32, // / xticks);. - 32, 108, 101, 116, 32, 120, 116, 108, 32, 61, 32, 120, // let xtl = x - 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, 112, 97, // => html``;. let - 120, 116, 116, 32, 61, 32, 40, 120, 44, 32, 118, 41, // xtt = (x, v) - 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, 104, 116, // =>. ht - 109, 108, 96, 60, 116, 101, 120, 116, 32, 120, 61, 36, // ml`${ - 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, 59, 10, // v}`;. - 10, 32, 32, 47, 47, 32, 84, 114, 97, 110, 115, 102, // . // Transf - 111, 114, 109, 32, 100, 97, 116, 97, 32, 112, 111, 105, // orm data poi - 110, 116, 115, 32, 97, 114, 114, 97, 121, 32, 105, 110, // nts array in - 116, 111, 32, 99, 111, 111, 114, 100, 105, 110, 97, 116, // to coordinat - 101, 10, 32, 32, 108, 101, 116, 32, 100, 120, 32, 61, // e. let dx = - 32, 118, 32, 61, 62, 32, 119, 49, 32, 43, 32, 40, // v => w1 + ( - 118, 32, 45, 32, 120, 109, 105, 110, 41, 32, 47, 32, // v - xmin) / - 40, 40, 120, 109, 97, 120, 32, 45, 32, 120, 109, 105, // ((xmax - xmi - 110, 41, 32, 124, 124, 32, 49, 41, 32, 42, 32, 40, // n) || 1) * ( - 119, 32, 45, 32, 119, 49, 32, 45, 32, 119, 50, 41, // w - w1 - w2) - 59, 10, 32, 32, 108, 101, 116, 32, 100, 121, 32, 61, // ;. let dy = - 32, 118, 32, 61, 62, 32, 104, 32, 45, 32, 104, 50, // v => h - h2 - 32, 45, 32, 40, 118, 32, 45, 32, 121, 109, 105, 110, // - (v - ymin - 41, 32, 47, 32, 40, 40, 121, 109, 97, 120, 32, 45, // ) / ((ymax - - 32, 121, 109, 105, 110, 41, 32, 124, 124, 32, 49, 41, // ymin) || 1) - 32, 42, 32, 40, 104, 32, 45, 32, 104, 49, 32, 45, // * (h - h1 - - 32, 104, 50, 41, 59, 10, 32, 32, 108, 101, 116, 32, // h2);. let - 100, 100, 32, 61, 32, 100, 97, 116, 97, 46, 109, 97, // dd = data.ma - 112, 40, 112, 32, 61, 62, 32, 91, 77, 97, 116, 104, // p(p => [Math - 46, 114, 111, 117, 110, 100, 40, 100, 120, 40, 112, 91, // .round(dx(p[ - 48, 93, 41, 41, 44, 32, 77, 97, 116, 104, 46, 114, // 0])), Math.r - 111, 117, 110, 100, 40, 100, 121, 40, 112, 91, 49, 93, // ound(dy(p[1] - 41, 41, 93, 41, 59, 10, 32, 32, 108, 101, 116, 32, // ))]);. let - 100, 100, 108, 32, 61, 32, 100, 100, 46, 108, 101, 110, // ddl = dd.len - 103, 116, 104, 59, 10, 32, 32, 47, 47, 32, 65, 110, // gth;. // An - 100, 32, 112, 108, 111, 116, 32, 116, 104, 101, 32, 100, // d plot the d - 97, 116, 97, 32, 97, 115, 32, 60, 112, 97, 116, 104, // ata as element. - 108, 101, 116, 32, 98, 101, 103, 105, 110, 48, 32, 61, // let begin0 = - 32, 100, 100, 108, 32, 63, 32, 96, 77, 32, 36, 123, // ddl ? `M ${ - 100, 100, 91, 48, 93, 91, 48, 93, 125, 44, 36, 123, // dd[0][0]},${ - 100, 100, 91, 48, 93, 91, 49, 93, 125, 96, 32, 58, // dd[0][1]}` : - 32, 96, 77, 32, 48, 44, 48, 96, 59, 10, 32, 32, // `M 0,0`;. - 108, 101, 116, 32, 98, 101, 103, 105, 110, 32, 61, 32, // let begin = - 96, 77, 32, 36, 123, 119, 49, 125, 44, 36, 123, 104, // `M ${w1},${h - 32, 45, 32, 104, 50, 125, 96, 59, 32, 32, 47, 47, // - h2}`; // - 32, 73, 110, 105, 116, 105, 97, 108, 32, 112, 111, 105, // Initial poi - 110, 116, 10, 32, 32, 108, 101, 116, 32, 101, 110, 100, // nt. let end - 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, 76, 32, // = ddl ? `L - 36, 123, 100, 100, 91, 100, 100, 108, 32, 45, 32, 49, // ${dd[ddl - 1 - 93, 91, 48, 93, 125, 44, 36, 123, 104, 32, 45, 32, // ][0]},${h - - 104, 50, 125, 96, 32, 58, 32, 96, 76, 32, 36, 123, // h2}` : `L ${ - 119, 49, 125, 44, 36, 123, 104, 32, 45, 32, 104, 50, // w1},${h - h2 - 125, 96, 59, 10, 32, 32, 108, 101, 116, 32, 115, 101, // }`;. let se - 114, 105, 101, 115, 32, 61, 32, 100, 100, 108, 32, 63, // ries = ddl ? - 32, 100, 100, 46, 109, 97, 112, 40, 112, 32, 61, 62, // dd.map(p => - 32, 96, 76, 32, 36, 123, 112, 91, 48, 93, 125, 32, // `L ${p[0]} - 36, 123, 112, 91, 49, 93, 125, 96, 41, 32, 58, 32, // ${p[1]}`) : - 91, 93, 59, 10, 10, 32, 32, 114, 101, 116, 117, 114, // [];.. retur - 110, 32, 104, 116, 109, 108, 96, 10, 60, 115, 118, 103, // n html`.. . $ - 123, 121, 116, 97, 46, 109, 97, 112, 40, 105, 32, 61, // {yta.map(i = - 62, 32, 121, 116, 108, 40, 121, 116, 105, 40, 105, 41, // > ytl(yti(i) - 41, 41, 125, 10, 32, 32, 36, 123, 121, 116, 97, 46, // ))}. ${yta. - 109, 97, 112, 40, 105, 32, 61, 62, 32, 121, 116, 116, // map(i => ytt - 40, 121, 116, 105, 40, 105, 41, 44, 32, 121, 116, 118, // (yti(i), ytv - 40, 105, 41, 41, 41, 125, 10, 32, 32, 36, 123, 120, // (i)))}. ${x - 116, 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, // ta.map(i => - 120, 116, 108, 40, 120, 116, 105, 40, 105, 41, 41, 41, // xtl(xti(i))) - 125, 10, 32, 32, 36, 123, 100, 97, 116, 97, 46, 108, // }. ${data.l - 101, 110, 103, 116, 104, 32, 63, 32, 120, 116, 97, 46, // ength ? xta. - 109, 97, 112, 40, 105, 32, 61, 62, 32, 120, 116, 116, // map(i => xtt - 40, 120, 116, 105, 40, 105, 41, 44, 32, 120, 116, 118, // (xti(i), xtv - 40, 105, 41, 41, 41, 32, 58, 32, 39, 39, 125, 10, // (i))) : ''}. - 32, 32, 60, 112, 97, 116, 104, 32, 100, 61, 34, 36, // .

.`;.};...co - 110, 115, 116, 32, 67, 104, 97, 114, 116, 32, 61, 32, // nst Chart = - 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, 114, 111, // function(pro - 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, 110, 115, // ps) {. cons - 116, 32, 91, 100, 97, 116, 97, 44, 32, 115, 101, 116, // t [data, set - 68, 97, 116, 97, 93, 32, 61, 32, 117, 115, 101, 83, // Data] = useS - 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, 32, 32, // tate([]);. - 117, 115, 101, 69, 102, 102, 101, 99, 116, 40, 40, 41, // useEffect(() - 32, 61, 62, 32, 123, 10, 32, 32, 32, 32, 99, 111, // => {. co - 110, 115, 116, 32, 105, 100, 32, 61, 32, 80, 117, 98, // nst id = Pub - 83, 117, 98, 46, 115, 117, 98, 115, 99, 114, 105, 98, // Sub.subscrib - 101, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 109, // e(function(m - 115, 103, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, // sg) {. - 105, 102, 32, 40, 109, 115, 103, 46, 110, 97, 109, 101, // if (msg.name - 32, 33, 61, 32, 39, 109, 101, 116, 114, 105, 99, 115, // != 'metrics - 39, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, // ') return;. - 32, 32, 32, 32, 32, 115, 101, 116, 68, 97, 116, 97, // setData - 40, 120, 32, 61, 62, 32, 120, 46, 99, 111, 110, 99, // (x => x.conc - 97, 116, 40, 91, 109, 115, 103, 46, 100, 97, 116, 97, // at([msg.data - 93, 41, 46, 115, 112, 108, 105, 99, 101, 40, 45, 77, // ]).splice(-M - 97, 120, 77, 101, 116, 114, 105, 99, 115, 68, 97, 116, // axMetricsDat - 97, 80, 111, 105, 110, 116, 115, 41, 41, 59, 10, 32, // aPoints));. - 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, 32, 114, // });. r - 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, 117, 98, // eturn PubSub - 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, 98, 101, // .unsubscribe - 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, 32, 91, // (id);. }, [ - 93, 41, 59, 10, 10, 32, 32, 108, 101, 116, 32, 120, // ]);.. let x - 109, 97, 120, 32, 61, 32, 48, 44, 32, 109, 105, 115, // max = 0, mis - 115, 105, 110, 103, 32, 61, 32, 77, 97, 120, 77, 101, // sing = MaxMe - 116, 114, 105, 99, 115, 68, 97, 116, 97, 80, 111, 105, // tricsDataPoi - 110, 116, 115, 32, 45, 32, 100, 97, 116, 97, 46, 108, // nts - data.l - 101, 110, 103, 116, 104, 59, 10, 32, 32, 105, 102, 32, // ength;. if - 40, 109, 105, 115, 115, 105, 110, 103, 32, 62, 32, 48, // (missing > 0 - 41, 32, 120, 109, 97, 120, 32, 61, 32, 77, 97, 116, // ) xmax = Mat - 104, 46, 114, 111, 117, 110, 100, 40, 68, 97, 116, 101, // h.round(Date - 46, 110, 111, 119, 40, 41, 32, 47, 32, 49, 48, 48, // .now() / 100 - 48, 41, 32, 43, 32, 109, 105, 115, 115, 105, 110, 103, // 0) + missing - 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, // ;. return h - 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, 99, 108, // tml`.

.

Data Cha - 114, 116, 60, 47, 104, 51, 62, 10, 32, 32, 60, 100, // rt

. . <${ - 83, 86, 71, 125, 32, 104, 101, 105, 103, 104, 116, 61, // SVG} height= - 50, 52, 48, 32, 119, 105, 100, 116, 104, 61, 54, 48, // 240 width=60 - 48, 32, 121, 109, 105, 110, 61, 48, 32, 121, 109, 97, // 0 ymin=0 yma - 120, 61, 50, 48, 32, 120, 109, 97, 120, 61, 36, 123, // x=20 xmax=${ - 120, 109, 97, 120, 125, 32, 100, 97, 116, 97, 61, 36, // xmax} data=$ - 123, 100, 97, 116, 97, 125, 32, 47, 62, 10, 32, 32, // {data} />. - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, //
. . This - 99, 104, 97, 114, 116, 32, 112, 108, 111, 116, 115, 32, // chart plots - 108, 105, 118, 101, 32, 115, 101, 110, 115, 111, 114, 32, // live sensor - 100, 97, 116, 97, 44, 32, 115, 101, 110, 116, 32, 98, // data, sent b - 121, 32, 97, 32, 100, 101, 118, 105, 99, 101, 32, 118, // y a device v - 105, 97, 32, 47, 97, 112, 105, 47, 119, 97, 116, 99, // ia /api/watc - 104, 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, // h.. . - 60, 47, 100, 105, 118, 62, 96, 59, 10, 125, 59, 10, // `;.};. - 10, 99, 111, 110, 115, 116, 32, 65, 112, 112, 32, 61, // .const App = - 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, 114, // function(pr - 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, 110, // ops) {. con - 115, 116, 32, 91, 117, 115, 101, 114, 44, 32, 115, 101, // st [user, se - 116, 85, 115, 101, 114, 93, 32, 61, 32, 117, 115, 101, // tUser] = use - 83, 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, 32, // State('');. - 32, 99, 111, 110, 115, 116, 32, 91, 99, 111, 110, 102, // const [conf - 105, 103, 44, 32, 115, 101, 116, 67, 111, 110, 102, 105, // ig, setConfi - 103, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, // g] = useStat - 101, 40, 123, 125, 41, 59, 10, 10, 32, 32, 99, 111, // e({});.. co - 110, 115, 116, 32, 103, 101, 116, 99, 111, 110, 102, 105, // nst getconfi - 103, 32, 61, 32, 40, 41, 32, 61, 62, 10, 32, 32, // g = () =>. - 32, 32, 32, 32, 102, 101, 116, 99, 104, 40, 39, 47, // fetch('/ - 97, 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, 103, // api/config/g - 101, 116, 39, 44, 32, 123, 104, 101, 97, 100, 101, 114, // et', {header - 115, 58, 32, 123, 65, 117, 116, 104, 111, 114, 105, 122, // s: {Authoriz - 97, 116, 105, 111, 110, 58, 32, 39, 39, 125, 125, 41, // ation: ''}}) - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, // . . - 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, 46, // then(r => r. - 106, 115, 111, 110, 40, 41, 41, 10, 32, 32, 32, 32, // json()). - 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, // .then( - 114, 32, 61, 62, 32, 115, 101, 116, 67, 111, 110, 102, // r => setConf - 105, 103, 40, 114, 41, 41, 10, 32, 32, 32, 32, 32, // ig(r)). - 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, // .catch( - 101, 114, 114, 32, 61, 62, 32, 99, 111, 110, 115, 111, // err => conso - 108, 101, 46, 108, 111, 103, 40, 101, 114, 114, 41, 41, // le.log(err)) - 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, // ;.. const l - 111, 103, 105, 110, 32, 61, 32, 102, 117, 110, 99, 116, // ogin = funct - 105, 111, 110, 40, 117, 41, 32, 123, 10, 32, 32, 32, // ion(u) {. - 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 111, // document.co - 111, 107, 105, 101, 32, 61, 32, 96, 97, 99, 99, 101, // okie = `acce - 115, 115, 95, 116, 111, 107, 101, 110, 61, 36, 123, 117, // ss_token=${u - 46, 116, 111, 107, 101, 110, 125, 59, 112, 97, 116, 104, // .token};path - 61, 47, 59, 109, 97, 120, 45, 97, 103, 101, 61, 51, // =/;max-age=3 - 54, 48, 48, 96, 59, 10, 32, 32, 32, 32, 115, 101, // 600`;. se - 116, 85, 115, 101, 114, 40, 117, 46, 117, 115, 101, 114, // tUser(u.user - 41, 59, 10, 32, 32, 32, 32, 114, 101, 116, 117, 114, // );. retur - 110, 32, 103, 101, 116, 99, 111, 110, 102, 105, 103, 40, // n getconfig( - 41, 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 99, // );. };.. c - 111, 110, 115, 116, 32, 108, 111, 103, 111, 117, 116, 32, // onst logout - 61, 32, 101, 118, 32, 61, 62, 32, 123, 10, 32, 32, // = ev => {. - 32, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, // document.c - 111, 111, 107, 105, 101, 32, 61, 32, 96, 97, 99, 99, // ookie = `acc - 101, 115, 115, 95, 116, 111, 107, 101, 110, 61, 59, 112, // ess_token=;p - 97, 116, 104, 61, 47, 59, 109, 97, 120, 45, 97, 103, // ath=/;max-ag - 101, 61, 48, 96, 59, 10, 32, 32, 32, 32, 115, 101, // e=0`;. se - 116, 85, 115, 101, 114, 40, 39, 39, 41, 59, 10, 32, // tUser('');. - 32, 125, 59, 10, 10, 32, 32, 47, 47, 32, 87, 97, // };.. // Wa - 116, 99, 104, 32, 102, 111, 114, 32, 110, 111, 116, 105, // tch for noti - 102, 105, 99, 97, 116, 105, 111, 110, 115, 46, 32, 65, // fications. A - 115, 32, 115, 111, 111, 110, 32, 97, 115, 32, 97, 32, // s soon as a - 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, // notification - 32, 97, 114, 114, 105, 118, 101, 115, 44, 32, 112, 97, // arrives, pa - 115, 115, 32, 105, 116, 32, 111, 110, 10, 32, 32, 47, // ss it on. / - 47, 32, 116, 111, 32, 97, 108, 108, 32, 115, 117, 98, // / to all sub - 115, 99, 114, 105, 98, 101, 100, 32, 99, 111, 109, 112, // scribed comp - 111, 110, 101, 110, 116, 115, 10, 32, 32, 99, 111, 110, // onents. con - 115, 116, 32, 119, 97, 116, 99, 104, 32, 61, 32, 102, // st watch = f - 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, // unction() {. - 32, 32, 32, 32, 118, 97, 114, 32, 108, 32, 61, 32, // var l = - 119, 105, 110, 100, 111, 119, 46, 108, 111, 99, 97, 116, // window.locat - 105, 111, 110, 44, 32, 112, 114, 111, 116, 111, 32, 61, // ion, proto = - 32, 108, 46, 112, 114, 111, 116, 111, 99, 111, 108, 46, // l.protocol. - 114, 101, 112, 108, 97, 99, 101, 40, 39, 104, 116, 116, // replace('htt - 112, 39, 44, 32, 39, 119, 115, 39, 41, 59, 10, 32, // p', 'ws');. - 32, 32, 32, 118, 97, 114, 32, 116, 105, 100, 44, 32, // var tid, - 119, 115, 85, 82, 73, 32, 61, 32, 112, 114, 111, 116, // wsURI = prot - 111, 32, 43, 32, 39, 47, 47, 39, 32, 43, 32, 108, // o + '//' + l - 46, 104, 111, 115, 116, 32, 43, 32, 39, 47, 97, 112, // .host + '/ap - 105, 47, 119, 97, 116, 99, 104, 39, 10, 32, 32, 32, // i/watch'. - 32, 118, 97, 114, 32, 114, 101, 99, 111, 110, 110, 101, // var reconne - 99, 116, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // ct = functio - 110, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, // n() {. - 118, 97, 114, 32, 119, 115, 32, 61, 32, 110, 101, 119, // var ws = new - 32, 87, 101, 98, 83, 111, 99, 107, 101, 116, 40, 119, // WebSocket(w - 115, 85, 82, 73, 41, 59, 10, 32, 32, 32, 32, 32, // sURI);. - 32, 119, 115, 46, 111, 110, 111, 112, 101, 110, 32, 61, // ws.onopen = - 32, 40, 41, 32, 61, 62, 32, 99, 111, 110, 115, 111, // () => conso - 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, 32, 99, // le.log('ws c - 111, 110, 110, 101, 99, 116, 101, 100, 39, 41, 59, 10, // onnected');. - 32, 32, 32, 32, 32, 32, 119, 115, 46, 111, 110, 109, // ws.onm - 101, 115, 115, 97, 103, 101, 32, 61, 32, 102, 117, 110, // essage = fun - 99, 116, 105, 111, 110, 40, 101, 118, 41, 32, 123, 10, // ction(ev) {. - 32, 32, 32, 32, 32, 32, 32, 32, 116, 114, 121, 32, // try - 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. - 118, 97, 114, 32, 109, 115, 103, 32, 61, 32, 74, 83, // var msg = JS - 79, 78, 46, 112, 97, 114, 115, 101, 40, 101, 118, 46, // ON.parse(ev. - 100, 97, 116, 97, 41, 59, 10, 32, 32, 32, 32, 32, // data);. - 32, 32, 32, 32, 32, 80, 117, 98, 83, 117, 98, 46, // PubSub. - 112, 117, 98, 108, 105, 115, 104, 40, 109, 115, 103, 41, // publish(msg) - 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ;. - 105, 102, 32, 40, 109, 115, 103, 46, 110, 97, 109, 101, // if (msg.name - 32, 33, 61, 32, 39, 109, 101, 116, 114, 105, 99, 115, // != 'metrics - 39, 41, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // ') console.l - 111, 103, 40, 39, 119, 115, 45, 62, 39, 44, 32, 109, // og('ws->', m - 115, 103, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, // sg);. - 32, 125, 32, 99, 97, 116, 99, 104, 32, 40, 101, 41, // } catch (e) - 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. - 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, // console.log - 40, 39, 73, 110, 118, 97, 108, 105, 100, 32, 119, 115, // ('Invalid ws - 32, 102, 114, 97, 109, 101, 58, 39, 44, 32, 101, 118, // frame:', ev - 46, 100, 97, 116, 97, 41, 59, 32, 32, 47, 47, 32, // .data); // - 101, 115, 108, 105, 110, 116, 45, 100, 105, 115, 97, 98, // eslint-disab - 108, 101, 45, 108, 105, 110, 101, 10, 32, 32, 32, 32, // le-line. - 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, // }. - 125, 59, 10, 32, 32, 32, 32, 32, 32, 119, 115, 46, // };. ws. - 111, 110, 99, 108, 111, 115, 101, 32, 61, 32, 102, 117, // onclose = fu - 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, // nction() {. - 32, 32, 32, 32, 32, 32, 32, 99, 108, 101, 97, 114, // clear - 84, 105, 109, 101, 111, 117, 116, 40, 116, 105, 100, 41, // Timeout(tid) - 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 105, // ;. ti - 100, 32, 61, 32, 115, 101, 116, 84, 105, 109, 101, 111, // d = setTimeo - 117, 116, 40, 114, 101, 99, 111, 110, 110, 101, 99, 116, // ut(reconnect - 44, 32, 49, 48, 48, 48, 41, 59, 10, 32, 32, 32, // , 1000);. - 32, 32, 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, // console - 46, 108, 111, 103, 40, 39, 119, 115, 32, 100, 105, 115, // .log('ws dis - 99, 111, 110, 110, 101, 99, 116, 101, 100, 39, 41, 59, // connected'); - 10, 32, 32, 32, 32, 32, 32, 125, 59, 10, 32, 32, // . };. - 32, 32, 125, 59, 10, 32, 32, 32, 32, 114, 101, 99, // };. rec - 111, 110, 110, 101, 99, 116, 40, 41, 59, 10, 32, 32, // onnect();. - 125, 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, 102, // };.. useEff - 101, 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, 10, // ect(() => {. - 32, 32, 32, 32, 47, 47, 32, 67, 97, 108, 108, 101, // // Calle - 100, 32, 111, 110, 99, 101, 32, 97, 116, 32, 105, 110, // d once at in - 105, 116, 32, 116, 105, 109, 101, 10, 32, 32, 32, 32, // it time. - 80, 117, 98, 83, 117, 98, 46, 115, 117, 98, 115, 99, // PubSub.subsc - 114, 105, 98, 101, 40, 109, 115, 103, 32, 61, 62, 32, // ribe(msg => - 109, 115, 103, 46, 110, 97, 109, 101, 32, 61, 61, 32, // msg.name == - 39, 99, 111, 110, 102, 105, 103, 39, 32, 38, 38, 32, // 'config' && - 103, 101, 116, 99, 111, 110, 102, 105, 103, 40, 41, 41, // getconfig()) - 59, 10, 32, 32, 32, 32, 102, 101, 116, 99, 104, 40, // ;. fetch( - 39, 47, 97, 112, 105, 47, 108, 111, 103, 105, 110, 39, // '/api/login' - 44, 32, 123, 104, 101, 97, 100, 101, 114, 115, 58, 32, // , {headers: - 123, 65, 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, // {Authorizati - 111, 110, 58, 32, 39, 39, 125, 125, 41, 10, 32, 32, // on: ''}}). - 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, // .then( - 114, 32, 61, 62, 32, 114, 46, 106, 115, 111, 110, 40, // r => r.json( - 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, // )). . - 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 108, 111, // then(r => lo - 103, 105, 110, 40, 114, 41, 41, 10, 32, 32, 32, 32, // gin(r)). - 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, 119, 97, // .then(wa - 116, 99, 104, 41, 10, 32, 32, 32, 32, 32, 32, 32, // tch). - 32, 46, 99, 97, 116, 99, 104, 40, 101, 114, 114, 32, // .catch(err - 61, 62, 32, 115, 101, 116, 85, 115, 101, 114, 40, 39, // => setUser(' - 39, 41, 41, 59, 10, 32, 32, 125, 44, 32, 91, 93, // '));. }, [] - 41, 59, 10, 10, 32, 32, 105, 102, 32, 40, 33, 117, // );.. if (!u - 115, 101, 114, 41, 32, 114, 101, 116, 117, 114, 110, 32, // ser) return - 104, 116, 109, 108, 96, 60, 36, 123, 76, 111, 103, 105, // html`<${Logi - 110, 125, 32, 108, 111, 103, 105, 110, 61, 36, 123, 108, // n} login=${l - 111, 103, 105, 110, 125, 32, 47, 62, 96, 59, 10, 10, // ogin} />`;.. - 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, // return htm - 108, 96, 10, 60, 36, 123, 78, 97, 118, 125, 32, 117, // l`.<${Nav} u - 115, 101, 114, 61, 36, 123, 117, 115, 101, 114, 125, 32, // ser=${user} - 108, 111, 103, 111, 117, 116, 61, 36, 123, 108, 111, 103, // logout=${log - 111, 117, 116, 125, 32, 47, 62, 10, 60, 100, 105, 118, // out} />.
. .
<${He - 114, 111, 125, 32, 47, 62, 60, 47, 100, 105, 118, 62, // ro} />
- 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, // .
<${Chart - 125, 32, 47, 62, 60, 47, 100, 105, 118, 62, 10, 32, // } />
. - 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, //
. ${u - 115, 101, 114, 32, 61, 61, 32, 39, 97, 100, 109, 105, // ser == 'admi - 110, 39, 32, 38, 38, 32, 104, 40, 67, 111, 110, 102, // n' && h(Conf - 105, 103, 117, 114, 97, 116, 105, 111, 110, 44, 32, 123, // iguration, { - 99, 111, 110, 102, 105, 103, 125, 41, 125, 10, 32, 32, // config})}. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, //
. - 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
- 60, 36, 123, 77, 101, 115, 115, 97, 103, 101, 115, 125, // <${Messages} - 32, 99, 111, 110, 102, 105, 103, 61, 36, 123, 99, 111, // config=${co - 110, 102, 105, 103, 125, 32, 47, 62, 60, 47, 100, 105, // nfig} />.
. - 60, 47, 100, 105, 118, 62, 96, 59, 10, 125, 59, 10, //
`;.};. - 10, 119, 105, 110, 100, 111, 119, 46, 111, 110, 108, 111, // .window.onlo - 97, 100, 32, 61, 32, 40, 41, 32, 61, 62, 32, 114, // ad = () => r - 101, 110, 100, 101, 114, 40, 104, 40, 65, 112, 112, 41, // ender(h(App) - 44, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 98, // , document.b - 111, 100, 121, 41, 59, 10, 0 // ody);. -}; -static const unsigned char v3[] = { 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t, 111, 44, 114, 44, 117, 44, 108, 61, 123, 125, 44, 105, // o,r,u,l={},i 61, 91, 93, 44, 99, 61, 47, 97, 99, 105, 116, 124, // =[],c=/acit| @@ -2299,7 +1138,7 @@ static const unsigned char v3[] = { 115, 101, 69, 114, 114, 111, 114, 66, 111, 117, 110, 100, // seErrorBound 97, 114, 121, 125, 59, 10, 0 // ary};. }; -static const unsigned char v4[] = { +static const unsigned char v3[] = { 42, 32, 123, 32, 98, 111, 120, 45, 115, 105, 122, 105, // * { box-sizi 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, // ng: border-b 111, 120, 59, 32, 125, 10, 104, 116, 109, 108, 44, 32, // ox; }.html, @@ -2454,7 +1293,7 @@ static const unsigned char v4[] = { 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100 37, 59, 32, 125, 32, 125, 10, 0 // %; } }. }; -static const unsigned char v5[] = { +static const unsigned char v4[] = { 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, // .PNG........ 73, 72, 68, 82, 0, 0, 0, 128, 0, 0, 0, 128, // IHDR........ 8, 6, 0, 0, 0, 195, 62, 97, 203, 0, 0, 0, // ......>a.... @@ -2778,6 +1617,1177 @@ static const unsigned char v5[] = { 126, 121, 49, 188, 0, 0, 0, 0, 73, 69, 78, 68, // ~y1.....IEND 174, 66, 96, 130, 0 // .B`. }; +static const unsigned char v5[] = { + 39, 117, 115, 101, 32, 115, 116, 114, 105, 99, 116, 39, // 'use strict' + 59, 10, 105, 109, 112, 111, 114, 116, 32, 123, 67, 111, // ;.import {Co + 109, 112, 111, 110, 101, 110, 116, 44, 32, 104, 44, 32, // mponent, h, + 104, 116, 109, 108, 44, 32, 114, 101, 110, 100, 101, 114, // html, render + 44, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // , useEffect, + 32, 117, 115, 101, 83, 116, 97, 116, 101, 44, 32, 117, // useState, u + 115, 101, 82, 101, 102, 125, 32, 102, 114, 111, 109, 32, // seRef} from + 39, 46, 47, 112, 114, 101, 97, 99, 116, 46, 109, 105, // './preact.mi + 110, 46, 106, 115, 39, 59, 10, 10, 99, 111, 110, 115, // n.js';..cons + 116, 32, 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, // t MaxMetrics + 68, 97, 116, 97, 80, 111, 105, 110, 116, 115, 32, 61, // DataPoints = + 32, 53, 48, 59, 10, 10, 47, 47, 32, 84, 104, 105, // 50;..// Thi + 115, 32, 115, 105, 109, 112, 108, 101, 32, 112, 117, 98, // s simple pub + 108, 105, 115, 104, 47, 115, 117, 98, 115, 99, 114, 105, // lish/subscri + 98, 101, 32, 105, 115, 32, 117, 115, 101, 100, 32, 116, // be is used t + 111, 32, 112, 97, 115, 115, 32, 110, 111, 116, 105, 102, // o pass notif + 105, 99, 97, 116, 105, 111, 110, 115, 32, 116, 104, 97, // ications tha + 116, 32, 119, 101, 114, 101, 10, 47, 47, 32, 114, 101, // t were.// re + 99, 101, 105, 118, 101, 100, 32, 102, 114, 111, 109, 32, // ceived from + 116, 104, 101, 32, 115, 101, 114, 118, 101, 114, 44, 32, // the server, + 116, 111, 32, 97, 108, 108, 32, 99, 104, 105, 108, 100, // to all child + 32, 99, 111, 109, 112, 111, 110, 101, 110, 116, 115, 32, // components + 111, 102, 32, 116, 104, 101, 32, 97, 112, 112, 46, 10, // of the app.. + 118, 97, 114, 32, 80, 117, 98, 83, 117, 98, 32, 61, // var PubSub = + 32, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // (function() + 32, 123, 10, 32, 32, 118, 97, 114, 32, 104, 97, 110, // {. var han + 100, 108, 101, 114, 115, 32, 61, 32, 123, 125, 44, 32, // dlers = {}, + 105, 100, 32, 61, 32, 48, 59, 10, 32, 32, 114, 101, // id = 0;. re + 116, 117, 114, 110, 32, 123, 10, 32, 32, 32, 32, 115, // turn {. s + 117, 98, 115, 99, 114, 105, 98, 101, 58, 32, 102, 117, // ubscribe: fu + 110, 99, 116, 105, 111, 110, 40, 102, 110, 41, 32, 123, // nction(fn) { + 10, 32, 32, 32, 32, 32, 32, 104, 97, 110, 100, 108, // . handl + 101, 114, 115, 91, 105, 100, 43, 43, 93, 32, 61, 32, // ers[id++] = + 102, 110, 59, 10, 32, 32, 32, 32, 125, 44, 10, 32, // fn;. },. + 32, 32, 32, 117, 110, 115, 117, 98, 115, 99, 114, 105, // unsubscri + 98, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, // be: function + 40, 105, 100, 41, 32, 123, 10, 32, 32, 32, 32, 32, // (id) {. + 32, 100, 101, 108, 101, 116, 101, 32, 104, 97, 110, 100, // delete hand + 108, 101, 114, 115, 91, 105, 100, 93, 59, 10, 32, 32, // lers[id];. + 32, 32, 125, 44, 10, 32, 32, 32, 32, 112, 117, 98, // },. pub + 108, 105, 115, 104, 58, 32, 102, 117, 110, 99, 116, 105, // lish: functi + 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, 32, // on(data) {. + 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, // for (va + 114, 32, 107, 32, 105, 110, 32, 104, 97, 110, 100, 108, // r k in handl + 101, 114, 115, 41, 32, 104, 97, 110, 100, 108, 101, 114, // ers) handler + 115, 91, 107, 93, 40, 100, 97, 116, 97, 41, 59, 10, // s[k](data);. + 32, 32, 32, 32, 125, 10, 32, 32, 125, 59, 10, 125, // }. };.} + 41, 40, 41, 59, 10, 10, 99, 111, 110, 115, 116, 32, // )();..const + 78, 97, 118, 32, 61, 32, 112, 114, 111, 112, 115, 32, // Nav = props + 61, 62, 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, // => html`.. + 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. + 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, // .`;...cons + 116, 32, 72, 101, 114, 111, 32, 61, 32, 112, 114, 111, // t Hero = pro + 112, 115, 32, 61, 62, 32, 104, 116, 109, 108, 96, 10, // ps => html`. + 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. + 10, 32, 32, 60, 104, 49, 32, 115, 116, 121, 108, 101, // .

Inte + 114, 97, 99, 116, 105, 118, 101, 32, 68, 101, 118, 105, // ractive Devi + 99, 101, 32, 68, 97, 115, 104, 98, 111, 97, 114, 100, // ce Dashboard + 60, 47, 104, 49, 62, 10, 10, 32, 32, 60, 112, 62, //

..

+ 10, 32, 32, 84, 104, 105, 115, 32, 100, 101, 118, 105, // . This devi + 99, 101, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // ce dashboard + 32, 105, 115, 32, 100, 101, 118, 101, 108, 111, 112, 101, // is develope + 100, 32, 117, 115, 105, 110, 103, 32, 116, 104, 101, 32, // d using the + 109, 111, 100, 101, 114, 110, 32, 97, 110, 100, 32, 99, // modern and c + 111, 109, 112, 97, 99, 116, 32, 80, 114, 101, 97, 99, // ompact Preac + 116, 32, 102, 114, 97, 109, 101, 119, 111, 114, 107, 44, // t framework, + 10, 32, 32, 105, 110, 32, 111, 114, 100, 101, 114, 32, // . in order + 116, 111, 32, 102, 105, 116, 32, 111, 110, 32, 118, 101, // to fit on ve + 114, 121, 32, 115, 109, 97, 108, 108, 32, 100, 101, 118, // ry small dev + 105, 99, 101, 115, 46, 32, 84, 104, 105, 115, 32, 105, // ices. This i + 115, 10, 32, 32, 97, 32, 60, 97, 32, 104, 114, 101, // s. a h + 121, 98, 114, 105, 100, 32, 115, 101, 114, 118, 101, 114, // ybrid server + 60, 47, 97, 62, 32, 119, 104, 105, 99, 104, 10, 32, // which. + 32, 112, 114, 111, 118, 105, 100, 101, 115, 32, 98, 111, // provides bo + 116, 104, 32, 115, 116, 97, 116, 105, 99, 32, 97, 110, // th static an + 100, 32, 100, 121, 110, 97, 109, 105, 99, 32, 99, 111, // d dynamic co + 110, 116, 101, 110, 116, 46, 32, 32, 83, 116, 97, 116, // ntent. Stat + 105, 99, 32, 102, 105, 108, 101, 115, 44, 32, 108, 105, // ic files, li + 107, 101, 32, 67, 83, 83, 47, 74, 83, 47, 72, 84, // ke CSS/JS/HT + 77, 76, 10, 32, 32, 111, 114, 32, 105, 109, 97, 103, // ML. or imag + 101, 115, 44, 32, 97, 114, 101, 32, 99, 111, 109, 112, // es, are comp + 105, 108, 101, 100, 32, 105, 110, 116, 111, 32, 116, 104, // iled into th + 101, 32, 115, 101, 114, 118, 101, 114, 32, 98, 105, 110, // e server bin + 97, 114, 121, 46, 10, 10, 32, 32, 84, 104, 105, 115, // ary... This + 32, 85, 73, 32, 117, 115, 101, 115, 32, 116, 104, 101, // UI uses the + 32, 82, 69, 83, 84, 32, 65, 80, 73, 32, 105, 109, // REST API im + 112, 108, 101, 109, 101, 110, 116, 101, 100, 32, 98, 121, // plemented by + 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, 101, 44, // the device, + 32, 119, 104, 105, 99, 104, 32, 121, 111, 117, 32, 99, // which you c + 97, 110, 32, 101, 120, 97, 109, 105, 110, 101, 10, 32, // an examine. + 32, 117, 115, 105, 110, 103, 32, 32, 60, 99, 111, 100, // using curl command-li + 110, 101, 32, 117, 116, 105, 108, 105, 116, 121, 58, 10, // ne utility:. + 32, 32, 60, 47, 112, 62, 10, 10, 32, 32, 60, 100, //

.. cur + 108, 32, 45, 117, 32, 97, 100, 109, 105, 110, 58, 112, // l -u admin:p + 97, 115, 115, 48, 32, 108, 111, 99, 97, 108, 104, 111, // ass0 localho + 115, 116, 58, 56, 48, 48, 48, 47, 97, 112, 105, 47, // st:8000/api/ + 99, 111, 110, 102, 105, 103, 47, 103, 101, 116, 60, 47, // config/get
+ 10, 32, 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, // .
curl -u ad + 109, 105, 110, 58, 112, 97, 115, 115, 48, 32, 108, 111, // min:pass0 lo + 99, 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, // calhost:8000 + 47, 97, 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, // /api/config/ + 115, 101, 116, 32, 45, 100, 32, 39, 112, 117, 98, 61, // set -d 'pub= + 109, 103, 47, 116, 111, 112, 105, 99, 39, 60, 47, 99, // mg/topic'
. + 32, 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, 101, //
curl -u adm + 105, 110, 58, 112, 97, 115, 115, 48, 32, 108, 111, 99, // in:pass0 loc + 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, 47, // alhost:8000/ + 97, 112, 105, 47, 109, 101, 115, 115, 97, 103, 101, 47, // api/message/ + 115, 101, 110, 100, 32, 45, 100, 32, 39, 109, 101, 115, // send -d 'mes + 115, 97, 103, 101, 61, 104, 101, 108, 108, 111, 39, 60, // sage=hello'< + 47, 99, 111, 100, 101, 62, 32, 60, 47, 100, 105, 118, // /code>
..

. T + 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, 99, 97, // he device ca + 110, 32, 115, 101, 110, 100, 32, 110, 111, 116, 105, 102, // n send notif + 105, 99, 97, 116, 105, 111, 110, 115, 32, 116, 111, 32, // ications to + 116, 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, 97, // this dashboa + 114, 100, 32, 97, 116, 32, 97, 110, 121, 116, 105, 109, // rd at anytim + 101, 46, 32, 78, 111, 116, 105, 102, 105, 99, 97, 116, // e. Notificat + 105, 111, 110, 115, 10, 32, 32, 97, 114, 101, 32, 115, // ions. are s + 101, 110, 116, 32, 111, 118, 101, 114, 32, 87, 101, 98, // ent over Web + 83, 111, 99, 107, 101, 116, 32, 97, 116, 32, 85, 82, // Socket at UR + 73, 32, 60, 99, 111, 100, 101, 62, 47, 97, 112, 105, // I /api + 47, 119, 97, 116, 99, 104, 60, 47, 99, 111, 100, 101, // /watch as JSON st + 114, 105, 110, 103, 115, 58, 32, 60, 99, 111, 100, 101, // rings: {"name": ". + 46, 34, 44, 32, 34, 100, 97, 116, 97, 34, 58, 32, // .", "data": + 46, 46, 46, 125, 60, 47, 99, 111, 100, 101, 62, 10, // ...}. + 32, 32, 60, 100, 105, 118, 62, 84, 114, 121, 32, 60, //

Try < + 99, 111, 100, 101, 62, 119, 115, 99, 97, 116, 32, 45, // code>wscat - + 45, 97, 117, 116, 104, 32, 117, 115, 101, 114, 49, 58, // -auth user1: + 112, 97, 115, 115, 49, 32, 45, 45, 99, 111, 110, 110, // pass1 --conn + 101, 99, 116, 32, 119, 115, 58, 47, 47, 108, 111, 99, // ect ws://loc + 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, 47, // alhost:8000/ + 97, 112, 105, 47, 119, 97, 116, 99, 104, 60, 47, 99, // api/watch
. + 32, 60, 47, 112, 62, 10, 60, 47, 100, 105, 118, 62, //

. + 10, 60, 47, 100, 105, 118, 62, 96, 59, 10, 10, 99, // .`;..c + 111, 110, 115, 116, 32, 76, 111, 103, 105, 110, 32, 61, // onst Login = + 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, 114, // function(pr + 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, 110, // ops) {. con + 115, 116, 32, 91, 117, 115, 101, 114, 44, 32, 115, 101, // st [user, se + 116, 85, 115, 101, 114, 93, 32, 61, 32, 117, 115, 101, // tUser] = use + 83, 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, 32, // State('');. + 32, 99, 111, 110, 115, 116, 32, 91, 112, 97, 115, 115, // const [pass + 44, 32, 115, 101, 116, 80, 97, 115, 115, 93, 32, 61, // , setPass] = + 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState('' + 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, // );. const l + 111, 103, 105, 110, 32, 61, 32, 101, 118, 32, 61, 62, // ogin = ev => + 10, 32, 32, 32, 32, 32, 32, 102, 101, 116, 99, 104, // . fetch + 40, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // (. + 39, 47, 97, 112, 105, 47, 108, 111, 103, 105, 110, 39, // '/api/login' + 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ,. + 123, 104, 101, 97, 100, 101, 114, 115, 58, 32, 123, 65, // {headers: {A + 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110, // uthorization + 58, 32, 39, 66, 97, 115, 105, 99, 32, 39, 32, 43, // : 'Basic ' + + 32, 98, 116, 111, 97, 40, 117, 115, 101, 114, 32, 43, // btoa(user + + 32, 39, 58, 39, 32, 43, 32, 112, 97, 115, 115, 41, // ':' + pass) + 125, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, // }}). + 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, // .then(r => + 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 10, 32, // r.json()). + 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, // .th + 101, 110, 40, 114, 32, 61, 62, 32, 114, 32, 38, 38, // en(r => r && + 32, 112, 114, 111, 112, 115, 46, 108, 111, 103, 105, 110, // props.login + 40, 114, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, // (r)). + 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, 114, // .catch(er + 114, 32, 61, 62, 32, 101, 114, 114, 41, 59, 10, 32, // r => err);. + 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, 108, // return html + 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, // `.
+ 10, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, // .
. + 60, 104, 49, 32, 115, 116, 121, 108, 101, 61, 34, 99, //

Device Dash + 98, 111, 97, 114, 100, 32, 76, 111, 103, 105, 110, 32, // board Login + 60, 47, 104, 49, 62, 10, 32, 32, 32, 32, 60, 100, //

. . < + 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 39, // input type=' + 116, 101, 120, 116, 39, 32, 112, 108, 97, 99, 101, 104, // text' placeh + 111, 108, 100, 101, 114, 61, 39, 78, 97, 109, 101, 39, // older='Name' + 32, 115, 116, 121, 108, 101, 61, 34, 119, 105, 100, 116, // style="widt + 104, 58, 32, 49, 48, 48, 37, 59, 34, 10, 32, 32, // h: 100%;". + 32, 32, 32, 32, 32, 32, 111, 110, 105, 110, 112, 117, // oninpu + 116, 61, 36, 123, 101, 118, 32, 61, 62, 32, 115, 101, // t=${ev => se + 116, 85, 115, 101, 114, 40, 101, 118, 46, 116, 97, 114, // tUser(ev.tar + 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, // get.value)} + 118, 97, 108, 117, 101, 61, 36, 123, 117, 115, 101, 114, // value=${user + 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, 47, 100, // } />. .
. setPass( + 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, // ev.target.va + 108, 117, 101, 41, 125, 32, 118, 97, 108, 117, 101, 61, // lue)} value= + 36, 123, 112, 97, 115, 115, 125, 10, 32, 32, 32, 32, // ${pass}. + 32, 32, 32, 32, 111, 110, 99, 104, 97, 110, 103, 101, // onchange + 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, 62, // =${login} /> + 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, // .
. + 32, 32, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, //
. + 32, 32, 32, 60, 98, 117, 116, 116, 111, 110, 32, 99, // . + 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, //
. + 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
. + 32, 32, 32, 32, 86, 97, 108, 105, 100, 32, 108, 111, // Valid lo + 103, 105, 110, 115, 58, 32, 97, 100, 109, 105, 110, 58, // gins: admin: + 112, 97, 115, 115, 48, 44, 32, 117, 115, 101, 114, 49, // pass0, user1 + 58, 112, 97, 115, 115, 49, 44, 32, 117, 115, 101, 114, // :pass1, user + 50, 58, 112, 97, 115, 115, 50, 10, 32, 32, 32, 32, // 2:pass2. + 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, 100, //
. .
`; + 10, 125, 59, 10, 10, 10, 99, 111, 110, 115, 116, 32, // .};...const + 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // Configuratio + 110, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // n = function + 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, // (props) {. + 99, 111, 110, 115, 116, 32, 91, 117, 114, 108, 44, 32, // const [url, + 115, 101, 116, 85, 114, 108, 93, 32, 61, 32, 117, 115, // setUrl] = us + 101, 83, 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, // eState(props + 46, 99, 111, 110, 102, 105, 103, 46, 117, 114, 108, 32, // .config.url + 124, 124, 32, 39, 39, 41, 59, 10, 32, 32, 99, 111, // || '');. co + 110, 115, 116, 32, 91, 112, 117, 98, 44, 32, 115, 101, // nst [pub, se + 116, 80, 117, 98, 93, 32, 61, 32, 117, 115, 101, 83, // tPub] = useS + 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, 46, 99, // tate(props.c + 111, 110, 102, 105, 103, 46, 112, 117, 98, 32, 124, 124, // onfig.pub || + 32, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, 115, // '');. cons + 116, 32, 91, 115, 117, 98, 44, 32, 115, 101, 116, 83, // t [sub, setS + 117, 98, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // ub] = useSta + 116, 101, 40, 112, 114, 111, 112, 115, 46, 99, 111, 110, // te(props.con + 102, 105, 103, 46, 115, 117, 98, 32, 124, 124, 32, 39, // fig.sub || ' + 39, 41, 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, // ');.. useEf + 102, 101, 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, // fect(() => { + 10, 32, 32, 32, 32, 115, 101, 116, 85, 114, 108, 40, // . setUrl( + 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, // props.config + 46, 117, 114, 108, 41, 59, 10, 32, 32, 32, 32, 115, // .url);. s + 101, 116, 80, 117, 98, 40, 112, 114, 111, 112, 115, 46, // etPub(props. + 99, 111, 110, 102, 105, 103, 46, 112, 117, 98, 41, 59, // config.pub); + 10, 32, 32, 32, 32, 115, 101, 116, 83, 117, 98, 40, // . setSub( + 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, // props.config + 46, 115, 117, 98, 41, 59, 10, 32, 32, 125, 44, 32, // .sub);. }, + 91, 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, // [props.confi + 103, 93, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, // g]);.. cons + 116, 32, 117, 112, 100, 97, 116, 101, 32, 61, 32, 40, // t update = ( + 110, 97, 109, 101, 44, 32, 118, 97, 108, 41, 32, 61, // name, val) = + 62, 32, 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, // > fetch('/ap + 105, 47, 99, 111, 110, 102, 105, 103, 47, 115, 101, 116, // i/config/set + 39, 44, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // ', {. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 109, 101, 116, 104, 111, 100, 58, 32, 39, // method: ' + 112, 111, 115, 116, 39, 44, 10, 32, 32, 32, 32, 32, // post',. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 98, 111, 100, 121, 58, 32, 96, // body: ` + 36, 123, 110, 97, 109, 101, 125, 61, 36, 123, 101, 110, // ${name}=${en + 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, 112, 111, // codeURICompo + 110, 101, 110, 116, 40, 118, 97, 108, 41, 125, 96, 10, // nent(val)}`. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 46, 99, // }).c + 97, 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, // atch(err => + 101, 114, 114, 41, 59, 10, 32, 32, 99, 111, 110, 115, // err);. cons + 116, 32, 117, 112, 100, 97, 116, 101, 117, 114, 108, 32, // t updateurl + 61, 32, 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, // = ev => upda + 116, 101, 40, 39, 117, 114, 108, 39, 44, 32, 117, 114, // te('url', ur + 108, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // l);. const + 117, 112, 100, 97, 116, 101, 112, 117, 98, 32, 61, 32, // updatepub = + 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, // ev => update + 40, 39, 112, 117, 98, 39, 44, 32, 112, 117, 98, 41, // ('pub', pub) + 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 117, 112, // ;. const up + 100, 97, 116, 101, 115, 117, 98, 32, 61, 32, 101, 118, // datesub = ev + 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, 40, 39, // => update(' + 115, 117, 98, 39, 44, 32, 115, 117, 98, 41, 59, 10, // sub', sub);. + 10, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // . console.l + 111, 103, 40, 112, 114, 111, 112, 115, 44, 32, 91, 117, // og(props, [u + 114, 108, 44, 32, 112, 117, 98, 44, 32, 115, 117, 98, // rl, pub, sub + 93, 41, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ]);. return + 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.

. + 32, 32, 68, 101, 118, 105, 99, 101, 32, 67, 111, 110, // Device Con + 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 60, 47, // figuration.
. M + 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, 58, 60, // QTT server:< + 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, 60, // /span>. < + 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 34, // input type=" + 116, 101, 120, 116, 34, 32, 115, 116, 121, 108, 101, 61, // text" style= + 34, 102, 108, 101, 120, 58, 32, 49, 32, 49, 48, 48, // "flex: 1 100 + 37, 59, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, // %;". + 32, 32, 118, 97, 108, 117, 101, 61, 36, 123, 117, 114, // value=${ur + 108, 125, 32, 111, 110, 99, 104, 97, 110, 103, 101, 61, // l} onchange= + 36, 123, 117, 112, 100, 97, 116, 101, 117, 114, 108, 125, // ${updateurl} + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 111, // . o + 110, 105, 110, 112, 117, 116, 61, 36, 123, 101, 118, 32, // ninput=${ev + 61, 62, 32, 115, 101, 116, 85, 114, 108, 40, 101, 118, // => setUrl(ev + 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, // .target.valu + 101, 41, 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, // e)} />. < + 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, 115, 115, // button class + 61, 34, 98, 116, 110, 34, 32, 100, 105, 115, 97, 98, // ="btn" disab + 108, 101, 100, 61, 36, 123, 33, 117, 114, 108, 125, 32, // led=${!url} + 111, 110, 99, 108, 105, 99, 107, 61, 36, 123, 117, 112, // onclick=${up + 100, 97, 116, 101, 117, 114, 108, 125, 10, 32, 32, 32, // dateurl}. + 32, 32, 32, 115, 116, 121, 108, 101, 61, 34, 109, 97, // style="ma + 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, 32, 49, // rgin-left: 1 + 101, 109, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // em; backgrou + 110, 100, 58, 32, 35, 56, 97, 97, 59, 34, 62, 85, // nd: #8aa;">U + 112, 100, 97, 116, 101, 60, 47, 98, 117, 116, 116, 111, // pdate.
. + 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
+ 10, 32, 32, 32, 32, 60, 115, 112, 97, 110, 32, 99, // . Subs + 99, 114, 105, 98, 101, 32, 116, 111, 112, 105, 99, 58, // cribe topic: + 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, // . + 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // + 115, 101, 116, 83, 117, 98, 40, 101, 118, 46, 116, 97, // setSub(ev.ta + 114, 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, // rget.value)} + 32, 47, 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, // />. Upda + 116, 101, 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, // te. + 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < + 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 109, // div style="m + 97, 114, 103, 105, 110, 58, 32, 48, 46, 53, 101, 109, // argin: 0.5em + 32, 48, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, // 0; display: + 32, 102, 108, 101, 120, 59, 34, 62, 10, 32, 32, 32, // flex;">. + 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // Publish + 116, 111, 112, 105, 99, 58, 60, 47, 115, 112, 97, 110, // topic:. se + 116, 80, 117, 98, 40, 101, 118, 46, 116, 97, 114, 103, // tPub(ev.targ + 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, // et.value)} / + 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, // >. Update + 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, 32, 32, // . + 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, //

. . You c + 97, 110, 32, 117, 115, 101, 32, 60, 97, 32, 104, 114, // an use . Hive + 77, 81, 32, 87, 101, 98, 115, 111, 99, 107, 101, 116, // MQ Websocket + 32, 119, 101, 98, 32, 99, 108, 105, 101, 110, 116, 60, // web client< + 47, 97, 62, 32, 116, 111, 32, 115, 101, 110, 100, 32, // /a> to send + 109, 101, 115, 115, 97, 103, 101, 115, 32, 116, 111, 32, // messages to + 116, 104, 105, 115, 32, 99, 111, 110, 115, 111, 108, 101, // this console + 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // ..
. + 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
. T + 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, 107, 101, // he device ke + 101, 112, 115, 32, 97, 32, 112, 101, 114, 115, 105, 115, // eps a persis + 116, 101, 110, 116, 32, 99, 111, 110, 110, 101, 99, 116, // tent connect + 105, 111, 110, 32, 116, 111, 32, 116, 104, 101, 32, 99, // ion to the c + 111, 110, 102, 105, 103, 117, 114, 101, 100, 32, 77, 81, // onfigured MQ + 84, 84, 32, 115, 101, 114, 118, 101, 114, 46, 10, 32, // TT server.. + 32, 32, 32, 67, 104, 97, 110, 103, 101, 115, 32, 116, // Changes t + 111, 32, 116, 104, 105, 115, 32, 99, 111, 110, 102, 105, // o this confi + 103, 117, 114, 97, 116, 105, 111, 110, 32, 97, 114, 101, // guration are + 32, 112, 114, 111, 112, 97, 103, 97, 116, 101, 100, 32, // propagated + 116, 111, 32, 97, 108, 108, 32, 100, 97, 115, 104, 98, // to all dashb + 111, 97, 114, 100, 115, 58, 32, 116, 114, 121, 10, 32, // oards: try. + 32, 32, 32, 99, 104, 97, 110, 103, 105, 110, 103, 32, // changing + 116, 104, 101, 109, 32, 105, 110, 32, 116, 104, 105, 115, // them in this + 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, 32, 97, // dashboard a + 110, 100, 32, 111, 98, 115, 101, 114, 118, 101, 32, 99, // nd observe c + 104, 97, 110, 103, 101, 115, 32, 105, 110, 32, 111, 116, // hanges in ot + 104, 101, 114, 32, 111, 112, 101, 110, 101, 100, 10, 32, // her opened. + 32, 32, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // dashboard + 115, 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 60, // s..
< + 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 109, // div class="m + 115, 103, 34, 62, 10, 32, 32, 32, 32, 78, 111, 116, // sg">. Not + 101, 58, 32, 97, 100, 109, 105, 110, 105, 115, 116, 114, // e: administr + 97, 116, 111, 114, 115, 32, 99, 97, 110, 32, 115, 101, // ators can se + 101, 32, 116, 104, 105, 115, 32, 115, 101, 99, 116, 105, // e this secti + 111, 110, 32, 97, 110, 100, 32, 99, 97, 110, 32, 99, // on and can c + 104, 97, 110, 103, 101, 32, 100, 101, 118, 105, 99, 101, // hange device + 10, 32, 32, 32, 32, 99, 111, 110, 102, 105, 103, 117, // . configu + 114, 97, 116, 105, 111, 110, 44, 32, 119, 104, 105, 108, // ration, whil + 115, 116, 32, 117, 115, 101, 114, 115, 32, 99, 97, 110, // st users can + 110, 111, 116, 46, 10, 32, 32, 60, 47, 100, 105, 118, // not.. .`;.} + 59, 10, 10, 10, 99, 111, 110, 115, 116, 32, 77, 101, // ;...const Me + 115, 115, 97, 103, 101, 32, 61, 32, 109, 32, 61, 62, // ssage = m => + 32, 104, 116, 109, 108, 96, 60, 100, 105, 118, 32, 115, // html`
+ 10, 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, // . qos + 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag + 101, 46, 113, 111, 115, 125, 32, 60, 47, 115, 112, 97, // e.qos} . topic: ${m. + 109, 101, 115, 115, 97, 103, 101, 46, 116, 111, 112, 105, // message.topi + 99, 125, 32, 60, 47, 115, 112, 97, 110, 62, 10, 32, // c} . + 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // data + 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag + 101, 46, 100, 97, 116, 97, 125, 60, 47, 115, 112, 97, // e.data}.
`;. + 10, 99, 111, 110, 115, 116, 32, 77, 101, 115, 115, 97, // .const Messa + 103, 101, 115, 32, 61, 32, 102, 117, 110, 99, 116, 105, // ges = functi + 111, 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, // on(props) {. + 32, 32, 99, 111, 110, 115, 116, 32, 91, 109, 101, 115, // const [mes + 115, 97, 103, 101, 115, 44, 32, 115, 101, 116, 77, 101, // sages, setMe + 115, 115, 97, 103, 101, 115, 93, 32, 61, 32, 117, 115, // ssages] = us + 101, 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, // eState([]);. + 32, 32, 99, 111, 110, 115, 116, 32, 91, 116, 120, 116, // const [txt + 44, 32, 115, 101, 116, 84, 120, 116, 93, 32, 61, 32, // , setTxt] = + 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, 41, // useState('') + 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, 102, 101, // ;.. useEffe + 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, 10, 32, // ct(() => {. + 32, 32, 32, 99, 111, 110, 115, 116, 32, 105, 100, 32, // const id + 61, 32, 80, 117, 98, 83, 117, 98, 46, 115, 117, 98, // = PubSub.sub + 115, 99, 114, 105, 98, 101, 40, 102, 117, 110, 99, 116, // scribe(funct + 105, 111, 110, 40, 109, 115, 103, 41, 32, 123, 10, 32, // ion(msg) {. + 32, 32, 32, 32, 32, 105, 102, 32, 40, 109, 115, 103, // if (msg + 46, 110, 97, 109, 101, 32, 61, 61, 32, 39, 109, 101, // .name == 'me + 115, 115, 97, 103, 101, 39, 41, 32, 115, 101, 116, 77, // ssage') setM + 101, 115, 115, 97, 103, 101, 115, 40, 120, 32, 61, 62, // essages(x => + 32, 120, 46, 99, 111, 110, 99, 97, 116, 40, 91, 109, // x.concat([m + 115, 103, 46, 100, 97, 116, 97, 93, 41, 41, 59, 10, // sg.data]));. + 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, 32, // });. + 114, 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, 117, // return PubSu + 98, 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, 98, // b.unsubscrib + 101, 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, 32, // e(id);. }, + 91, 93, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, // []);.. cons + 116, 32, 115, 101, 110, 100, 109, 101, 115, 115, 97, 103, // t sendmessag + 101, 32, 61, 32, 101, 118, 32, 61, 62, 32, 102, 101, // e = ev => fe + 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 109, 101, // tch('/api/me + 115, 115, 97, 103, 101, 47, 115, 101, 110, 100, 39, 44, // ssage/send', + 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 109, 101, 116, // met + 104, 111, 100, 58, 32, 39, 112, 111, 115, 116, 39, 44, // hod: 'post', + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // . + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 98, 111, 100, 121, 58, // body: + 32, 96, 109, 101, 115, 115, 97, 103, 101, 61, 36, 123, // `message=${ + 101, 110, 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, // encodeURICom + 112, 111, 110, 101, 110, 116, 40, 116, 120, 116, 41, 125, // ponent(txt)} + 96, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // `. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 125, 41, 46, 116, 104, 101, // }).the + 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, 84, 120, // n(r => setTx + 116, 40, 39, 39, 41, 41, 59, 10, 32, 32, 99, 111, // t(''));. co + 110, 115, 116, 32, 99, 111, 110, 110, 115, 116, 97, 116, // nst connstat + 117, 115, 32, 61, 32, 112, 114, 111, 112, 115, 46, 99, // us = props.c + 111, 110, 102, 105, 103, 46, 99, 111, 110, 110, 101, 99, // onfig.connec + 116, 101, 100, 32, 63, 32, 39, 99, 111, 110, 110, 101, // ted ? 'conne + 99, 116, 101, 100, 39, 32, 58, 32, 39, 100, 105, 115, // cted' : 'dis + 99, 111, 110, 110, 101, 99, 116, 101, 100, 39, 59, 10, // connected';. + 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, // return htm + 108, 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, // l`.
+ 10, 32, 32, 60, 104, 51, 32, 115, 116, 121, 108, 101, // .

MQTT me + 115, 115, 97, 103, 101, 115, 60, 47, 104, 51, 62, 10, // ssages

. + 32, 32, 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, //
. + 77, 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, // MQTT server + 115, 116, 97, 116, 117, 115, 58, 32, 60, 98, 62, 36, // status: $ + 123, 99, 111, 110, 110, 115, 116, 97, 116, 117, 115, 125, // {connstatus} + 60, 47, 98, 62, 10, 32, 32, 60, 47, 100, 105, 118, // .
.
. + 36, 123, 109, 101, 115, 115, 97, 103, 101, 115, 46, 109, // ${messages.m + 97, 112, 40, 109, 101, 115, 115, 97, 103, 101, 32, 61, // ap(message = + 62, 32, 104, 40, 77, 101, 115, 115, 97, 103, 101, 44, // > h(Message, + 32, 123, 109, 101, 115, 115, 97, 103, 101, 125, 41, 41, // {message})) + 125, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // }.
. + 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, //
. + 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // Publish + 32, 109, 101, 115, 115, 97, 103, 101, 58, 60, 47, 115, // message:. set + 84, 120, 116, 40, 101, 118, 46, 116, 97, 114, 103, 101, // Txt(ev.targe + 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, 62, // t.value)} /> + 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, // .
. + 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. Th + 101, 32, 109, 101, 115, 115, 97, 103, 101, 32, 103, 101, // e message ge + 116, 115, 32, 112, 97, 115, 115, 101, 100, 32, 116, 111, // ts passed to + 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, // the device + 118, 105, 97, 32, 82, 69, 83, 84, 46, 32, 84, 104, // via REST. Th + 101, 110, 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, // en the devic + 101, 32, 115, 101, 110, 100, 115, 32, 105, 116, 32, 116, // e sends it t + 111, 10, 32, 32, 32, 32, 116, 104, 101, 32, 77, 81, // o. the MQ + 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, 111, 118, // TT server ov + 101, 114, 32, 77, 81, 84, 84, 46, 32, 65, 108, 108, // er MQTT. All + 32, 77, 81, 84, 84, 32, 109, 101, 115, 115, 97, 103, // MQTT messag + 101, 115, 32, 111, 110, 32, 97, 32, 115, 117, 98, 115, // es on a subs + 99, 114, 105, 98, 101, 100, 32, 116, 111, 112, 105, 99, // cribed topic + 10, 32, 32, 32, 32, 114, 101, 99, 101, 105, 118, 101, // . receive + 100, 32, 98, 121, 32, 116, 104, 101, 32, 100, 101, 118, // d by the dev + 105, 99, 101, 44, 32, 97, 114, 101, 32, 112, 114, 111, // ice, are pro + 112, 97, 103, 97, 116, 101, 100, 32, 116, 111, 32, 116, // pagated to t + 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, 97, 114, // his dashboar + 100, 32, 118, 105, 97, 32, 47, 97, 112, 105, 47, 119, // d via /api/w + 97, 116, 99, 104, 46, 10, 32, 32, 60, 47, 100, 105, // atch.. .
`;. + 125, 59, 10, 10, 47, 47, 32, 69, 120, 112, 101, 99, // };..// Expec + 116, 101, 100, 32, 97, 114, 103, 117, 109, 101, 110, 116, // ted argument + 115, 58, 10, 47, 47, 32, 100, 97, 116, 97, 58, 32, // s:.// data: + 116, 105, 109, 101, 115, 101, 114, 105, 101, 115, 44, 32, // timeseries, + 101, 46, 103, 46, 32, 91, 32, 91, 49, 54, 53, 52, // e.g. [ [1654 + 51, 54, 49, 51, 53, 50, 44, 32, 49, 57, 93, 44, // 361352, 19], + 32, 91, 49, 54, 53, 52, 51, 54, 49, 51, 53, 51, // [1654361353 + 44, 32, 49, 56, 93, 44, 32, 46, 46, 46, 32, 93, // , 18], ... ] + 10, 47, 47, 32, 119, 105, 100, 116, 104, 44, 32, 104, // .// width, h + 101, 105, 103, 104, 116, 44, 32, 121, 116, 105, 99, 107, // eight, ytick + 115, 44, 32, 120, 116, 105, 99, 107, 115, 44, 32, 121, // s, xticks, y + 109, 105, 110, 44, 32, 121, 109, 97, 120, 44, 32, 120, // min, ymax, x + 109, 105, 110, 44, 32, 120, 109, 97, 120, 10, 99, 111, // min, xmax.co + 110, 115, 116, 32, 83, 86, 71, 32, 61, 32, 102, 117, // nst SVG = fu + 110, 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, // nction(props + 41, 32, 123, 10, 32, 32, 47, 47, 32, 32, 32, 32, // ) {. // + 32, 32, 32, 32, 32, 32, 32, 32, 119, 10, 32, 32, // w. + 47, 47, 32, 32, 32, 43, 45, 45, 45, 45, 45, 45, // // +------ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ + 45, 45, 45, 43, 10, 32, 32, 47, 47, 32, 32, 32, // ---+. // + 124, 32, 32, 32, 32, 32, 32, 32, 32, 104, 49, 32, // | h1 + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 10, // |. + 32, 32, 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, // // | + 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +----------- + 43, 32, 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, // + |. // + 32, 32, 124, 32, 32, 32, 32, 124, 32, 32, 32, 32, // | | + 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 32, 32, // | + 124, 32, 32, 104, 10, 32, 32, 47, 47, 32, 32, 32, // | h. // + 124, 32, 119, 49, 32, 124, 32, 32, 32, 32, 32, 32, // | w1 | + 32, 32, 32, 32, 32, 124, 32, 119, 50, 32, 124, 10, // | w2 |. + 32, 32, 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, // // | + 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +----------- + 43, 32, 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, // + |. // + 32, 32, 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, // | + 104, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // h2 + 124, 10, 32, 32, 47, 47, 32, 32, 32, 43, 45, 45, // |. // +-- + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ + 45, 45, 45, 45, 45, 45, 45, 43, 10, 32, 32, 47, // -------+. / + 47, 10, 32, 32, 108, 101, 116, 32, 119, 32, 61, 32, // /. let w = + 112, 114, 111, 112, 115, 46, 119, 105, 100, 116, 104, 44, // props.width, + 32, 104, 32, 61, 32, 112, 114, 111, 112, 115, 46, 104, // h = props.h + 101, 105, 103, 104, 116, 44, 32, 119, 49, 32, 61, 32, // eight, w1 = + 51, 48, 44, 32, 119, 50, 32, 61, 32, 48, 44, 32, // 30, w2 = 0, + 104, 49, 32, 61, 32, 56, 44, 32, 104, 50, 32, 61, // h1 = 8, h2 = + 32, 49, 56, 59, 10, 32, 32, 108, 101, 116, 32, 121, // 18;. let y + 116, 105, 99, 107, 115, 32, 61, 32, 112, 114, 111, 112, // ticks = prop + 115, 46, 121, 116, 105, 99, 107, 115, 32, 124, 124, 32, // s.yticks || + 52, 44, 32, 120, 116, 105, 99, 107, 115, 32, 61, 32, // 4, xticks = + 112, 114, 111, 112, 115, 46, 120, 116, 105, 99, 107, 115, // props.xticks + 32, 124, 124, 32, 53, 59, 10, 32, 32, 108, 101, 116, // || 5;. let + 32, 100, 97, 116, 97, 32, 61, 32, 112, 114, 111, 112, // data = prop + 115, 46, 100, 97, 116, 97, 32, 124, 124, 32, 91, 93, // s.data || [] + 59, 10, 32, 32, 108, 101, 116, 32, 121, 109, 105, 110, // ;. let ymin + 32, 61, 32, 112, 114, 111, 112, 115, 46, 121, 109, 105, // = props.ymi + 110, 32, 124, 124, 32, 48, 59, 10, 32, 32, 108, 101, // n || 0;. le + 116, 32, 121, 109, 97, 120, 32, 61, 32, 112, 114, 111, // t ymax = pro + 112, 115, 46, 121, 109, 97, 120, 32, 124, 124, 32, 77, // ps.ymax || M + 97, 116, 104, 46, 109, 97, 120, 46, 97, 112, 112, 108, // ath.max.appl + 121, 40, 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, // y(null, data + 46, 109, 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, // .map(p => p[ + 49, 93, 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, // 1]));. let + 120, 109, 105, 110, 32, 61, 32, 112, 114, 111, 112, 115, // xmin = props + 46, 120, 109, 105, 110, 32, 124, 124, 32, 77, 97, 116, // .xmin || Mat + 104, 46, 109, 105, 110, 46, 97, 112, 112, 108, 121, 40, // h.min.apply( + 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, // null, data.m + 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, // ap(p => p[0] + 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, 120, 109, // ));. let xm + 97, 120, 32, 61, 32, 112, 114, 111, 112, 115, 46, 120, // ax = props.x + 109, 97, 120, 32, 124, 124, 32, 77, 97, 116, 104, 46, // max || Math. + 109, 97, 120, 46, 97, 112, 112, 108, 121, 40, 110, 117, // max.apply(nu + 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, 97, 112, // ll, data.map + 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, 41, 41, // (p => p[0])) + 59, 10, 10, 32, 32, 47, 47, 32, 89, 45, 97, 120, // ;.. // Y-ax + 105, 115, 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, // is tick line + 115, 32, 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, // s and labels + 10, 32, 32, 108, 101, 116, 32, 121, 116, 97, 32, 61, // . let yta = + 32, 40, 110, 101, 119, 32, 65, 114, 114, 97, 121, 40, // (new Array( + 121, 116, 105, 99, 107, 115, 32, 43, 32, 49, 41, 41, // yticks + 1)) + 46, 102, 105, 108, 108, 40, 48, 41, 46, 109, 97, 112, // .fill(0).map + 40, 40, 95, 44, 32, 105, 41, 32, 61, 62, 32, 105, // ((_, i) => i + 41, 59, 32, 32, 47, 47, 32, 105, 110, 100, 105, 99, // ); // indic + 101, 115, 10, 32, 32, 108, 101, 116, 32, 121, 116, 105, // es. let yti + 32, 61, 32, 105, 32, 61, 62, 32, 104, 32, 45, 32, // = i => h - + 104, 50, 32, 45, 32, 40, 104, 32, 45, 32, 104, 49, // h2 - (h - h1 + 32, 45, 32, 104, 50, 41, 32, 42, 32, 105, 32, 47, // - h2) * i / + 32, 121, 116, 105, 99, 107, 115, 59, 32, 32, 32, 32, // yticks; + 32, 32, 32, 32, 32, 32, 47, 47, 32, 105, 110, 100, // // ind + 101, 120, 39, 115, 32, 89, 10, 32, 32, 108, 101, 116, // ex's Y. let + 32, 121, 116, 118, 32, 61, 32, 105, 32, 61, 62, 32, // ytv = i => + 40, 121, 109, 97, 120, 32, 45, 32, 121, 109, 105, 110, // (ymax - ymin + 41, 32, 42, 32, 105, 32, 47, 32, 121, 116, 105, 99, // ) * i / ytic + 107, 115, 59, 10, 32, 32, 108, 101, 116, 32, 121, 116, // ks;. let yt + 108, 32, 61, 32, 121, 32, 61, 62, 32, 104, 116, 109, // l = y => htm + 108, 96, 60, 108, 105, 110, 101, 32, 120, 49, 61, 36, // l``;. + 108, 101, 116, 32, 121, 116, 116, 32, 61, 32, 40, 121, // let ytt = (y + 44, 32, 118, 41, 32, 61, 62, 32, 104, 116, 109, 108, // , v) => html + 96, 60, 116, 101, 120, 116, 32, 120, 61, 48, 32, 121, // ` + 36, 123, 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, // ${v}` + 59, 10, 10, 32, 32, 47, 47, 32, 88, 45, 97, 120, // ;.. // X-ax + 105, 115, 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, // is tick line + 115, 32, 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, // s and labels + 10, 32, 32, 108, 101, 116, 32, 100, 97, 116, 101, 102, // . let datef + 109, 116, 32, 61, 32, 117, 110, 105, 120, 32, 61, 62, // mt = unix => + 32, 40, 110, 101, 119, 32, 68, 97, 116, 101, 40, 117, // (new Date(u + 110, 105, 120, 32, 42, 32, 49, 48, 48, 48, 41, 41, // nix * 1000)) + 46, 116, 111, 73, 83, 79, 83, 116, 114, 105, 110, 103, // .toISOString + 40, 41, 46, 115, 117, 98, 115, 116, 114, 40, 49, 52, // ().substr(14 + 44, 32, 53, 41, 59, 10, 32, 32, 108, 101, 116, 32, // , 5);. let + 120, 116, 97, 32, 61, 32, 40, 110, 101, 119, 32, 65, // xta = (new A + 114, 114, 97, 121, 40, 120, 116, 105, 99, 107, 115, 32, // rray(xticks + 43, 32, 49, 41, 41, 46, 102, 105, 108, 108, 40, 48, // + 1)).fill(0 + 41, 46, 109, 97, 112, 40, 40, 95, 44, 32, 105, 41, // ).map((_, i) + 32, 61, 62, 32, 105, 41, 59, 32, 32, 47, 47, 32, // => i); // + 105, 110, 100, 105, 99, 101, 115, 10, 32, 32, 108, 101, // indices. le + 116, 32, 120, 116, 105, 32, 61, 32, 105, 32, 61, 62, // t xti = i => + 32, 119, 49, 32, 43, 32, 40, 119, 32, 45, 32, 119, // w1 + (w - w + 49, 32, 45, 32, 119, 50, 41, 32, 42, 32, 105, 32, // 1 - w2) * i + 47, 32, 120, 116, 105, 99, 107, 115, 59, 32, 32, 32, // / xticks; + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, // / + 47, 32, 105, 110, 100, 101, 120, 39, 115, 32, 88, 10, // / index's X. + 32, 32, 108, 101, 116, 32, 120, 116, 118, 32, 61, 32, // let xtv = + 105, 32, 61, 62, 32, 100, 97, 116, 101, 102, 109, 116, // i => datefmt + 40, 120, 109, 105, 110, 32, 43, 32, 40, 120, 109, 97, // (xmin + (xma + 120, 32, 45, 32, 120, 109, 105, 110, 41, 32, 42, 32, // x - xmin) * + 105, 32, 47, 32, 120, 116, 105, 99, 107, 115, 41, 59, // i / xticks); + 10, 32, 32, 108, 101, 116, 32, 120, 116, 108, 32, 61, // . let xtl = + 32, 120, 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, // x => html`< + 112, 97, 116, 104, 32, 100, 61, 34, 77, 32, 36, 123, // path d="M ${ + 120, 125, 44, 36, 123, 104, 49, 125, 32, 76, 32, 36, // x},${h1} L $ + 123, 120, 125, 44, 36, 123, 104, 32, 45, 32, 104, 50, // {x},${h - h2 + 125, 34, 32, 99, 108, 97, 115, 115, 61, 34, 116, 105, // }" class="ti + 99, 107, 34, 47, 62, 96, 59, 10, 32, 32, 108, 101, // ck"/>`;. le + 116, 32, 120, 116, 116, 32, 61, 32, 40, 120, 44, 32, // t xtt = (x, + 118, 41, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, // v) =>. + 104, 116, 109, 108, 96, 60, 116, 101, 120, 116, 32, 120, // html` + 36, 123, 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, // ${v}` + 59, 10, 10, 32, 32, 47, 47, 32, 84, 114, 97, 110, // ;.. // Tran + 115, 102, 111, 114, 109, 32, 100, 97, 116, 97, 32, 112, // sform data p + 111, 105, 110, 116, 115, 32, 97, 114, 114, 97, 121, 32, // oints array + 105, 110, 116, 111, 32, 99, 111, 111, 114, 100, 105, 110, // into coordin + 97, 116, 101, 10, 32, 32, 108, 101, 116, 32, 100, 120, // ate. let dx + 32, 61, 32, 118, 32, 61, 62, 32, 119, 49, 32, 43, // = v => w1 + + 32, 40, 118, 32, 45, 32, 120, 109, 105, 110, 41, 32, // (v - xmin) + 47, 32, 40, 40, 120, 109, 97, 120, 32, 45, 32, 120, // / ((xmax - x + 109, 105, 110, 41, 32, 124, 124, 32, 49, 41, 32, 42, // min) || 1) * + 32, 40, 119, 32, 45, 32, 119, 49, 32, 45, 32, 119, // (w - w1 - w + 50, 41, 59, 10, 32, 32, 108, 101, 116, 32, 100, 121, // 2);. let dy + 32, 61, 32, 118, 32, 61, 62, 32, 104, 32, 45, 32, // = v => h - + 104, 50, 32, 45, 32, 40, 118, 32, 45, 32, 121, 109, // h2 - (v - ym + 105, 110, 41, 32, 47, 32, 40, 40, 121, 109, 97, 120, // in) / ((ymax + 32, 45, 32, 121, 109, 105, 110, 41, 32, 124, 124, 32, // - ymin) || + 49, 41, 32, 42, 32, 40, 104, 32, 45, 32, 104, 49, // 1) * (h - h1 + 32, 45, 32, 104, 50, 41, 59, 10, 32, 32, 108, 101, // - h2);. le + 116, 32, 100, 100, 32, 61, 32, 100, 97, 116, 97, 46, // t dd = data. + 109, 97, 112, 40, 112, 32, 61, 62, 32, 91, 77, 97, // map(p => [Ma + 116, 104, 46, 114, 111, 117, 110, 100, 40, 100, 120, 40, // th.round(dx( + 112, 91, 48, 93, 41, 41, 44, 32, 77, 97, 116, 104, // p[0])), Math + 46, 114, 111, 117, 110, 100, 40, 100, 121, 40, 112, 91, // .round(dy(p[ + 49, 93, 41, 41, 93, 41, 59, 10, 32, 32, 108, 101, // 1]))]);. le + 116, 32, 100, 100, 108, 32, 61, 32, 100, 100, 46, 108, // t ddl = dd.l + 101, 110, 103, 116, 104, 59, 10, 32, 32, 47, 47, 32, // ength;. // + 65, 110, 100, 32, 112, 108, 111, 116, 32, 116, 104, 101, // And plot the + 32, 100, 97, 116, 97, 32, 97, 115, 32, 60, 112, 97, // data as element. + 32, 32, 108, 101, 116, 32, 98, 101, 103, 105, 110, 48, // let begin0 + 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, 77, 32, // = ddl ? `M + 36, 123, 100, 100, 91, 48, 93, 91, 48, 93, 125, 44, // ${dd[0][0]}, + 36, 123, 100, 100, 91, 48, 93, 91, 49, 93, 125, 96, // ${dd[0][1]}` + 32, 58, 32, 96, 77, 32, 48, 44, 48, 96, 59, 10, // : `M 0,0`;. + 32, 32, 108, 101, 116, 32, 98, 101, 103, 105, 110, 32, // let begin + 61, 32, 96, 77, 32, 36, 123, 119, 49, 125, 44, 36, // = `M ${w1},$ + 123, 104, 32, 45, 32, 104, 50, 125, 96, 59, 32, 32, // {h - h2}`; + 47, 47, 32, 73, 110, 105, 116, 105, 97, 108, 32, 112, // // Initial p + 111, 105, 110, 116, 10, 32, 32, 108, 101, 116, 32, 101, // oint. let e + 110, 100, 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, // nd = ddl ? ` + 76, 32, 36, 123, 100, 100, 91, 100, 100, 108, 32, 45, // L ${dd[ddl - + 32, 49, 93, 91, 48, 93, 125, 44, 36, 123, 104, 32, // 1][0]},${h + 45, 32, 104, 50, 125, 96, 32, 58, 32, 96, 76, 32, // - h2}` : `L + 36, 123, 119, 49, 125, 44, 36, 123, 104, 32, 45, 32, // ${w1},${h - + 104, 50, 125, 96, 59, 10, 32, 32, 108, 101, 116, 32, // h2}`;. let + 115, 101, 114, 105, 101, 115, 32, 61, 32, 100, 100, 108, // series = ddl + 32, 63, 32, 100, 100, 46, 109, 97, 112, 40, 112, 32, // ? dd.map(p + 61, 62, 32, 96, 76, 32, 36, 123, 112, 91, 48, 93, // => `L ${p[0] + 125, 32, 36, 123, 112, 91, 49, 93, 125, 96, 41, 32, // } ${p[1]}`) + 58, 32, 91, 93, 59, 10, 10, 32, 32, 114, 101, 116, // : [];.. ret + 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, 115, // urn html`.. . + 32, 36, 123, 121, 116, 97, 46, 109, 97, 112, 40, 105, // ${yta.map(i + 32, 61, 62, 32, 121, 116, 108, 40, 121, 116, 105, 40, // => ytl(yti( + 105, 41, 41, 41, 125, 10, 32, 32, 36, 123, 121, 116, // i)))}. ${yt + 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, 121, // a.map(i => y + 116, 116, 40, 121, 116, 105, 40, 105, 41, 44, 32, 121, // tt(yti(i), y + 116, 118, 40, 105, 41, 41, 41, 125, 10, 32, 32, 36, // tv(i)))}. $ + 123, 120, 116, 97, 46, 109, 97, 112, 40, 105, 32, 61, // {xta.map(i = + 62, 32, 120, 116, 108, 40, 120, 116, 105, 40, 105, 41, // > xtl(xti(i) + 41, 41, 125, 10, 32, 32, 36, 123, 100, 97, 116, 97, // ))}. ${data + 46, 108, 101, 110, 103, 116, 104, 32, 63, 32, 120, 116, // .length ? xt + 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, 120, // a.map(i => x + 116, 116, 40, 120, 116, 105, 40, 105, 41, 44, 32, 120, // tt(xti(i), x + 116, 118, 40, 105, 41, 41, 41, 32, 58, 32, 39, 39, // tv(i))) : '' + 125, 10, 32, 32, 60, 112, 97, 116, 104, 32, 100, 61, // }. . + 60, 112, 97, 116, 104, 32, 100, 61, 34, 36, 123, 98, // .`;.};... + 99, 111, 110, 115, 116, 32, 67, 104, 97, 114, 116, 32, // const Chart + 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, // = function(p + 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, // rops) {. co + 110, 115, 116, 32, 91, 100, 97, 116, 97, 44, 32, 115, // nst [data, s + 101, 116, 68, 97, 116, 97, 93, 32, 61, 32, 117, 115, // etData] = us + 101, 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, // eState([]);. + 32, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 40, // useEffect( + 40, 41, 32, 61, 62, 32, 123, 10, 32, 32, 32, 32, // () => {. + 99, 111, 110, 115, 116, 32, 105, 100, 32, 61, 32, 80, // const id = P + 117, 98, 83, 117, 98, 46, 115, 117, 98, 115, 99, 114, // ubSub.subscr + 105, 98, 101, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ibe(function + 40, 109, 115, 103, 41, 32, 123, 10, 32, 32, 32, 32, // (msg) {. + 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, 110, 97, // if (msg.na + 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, 114, 105, // me != 'metri + 99, 115, 39, 41, 32, 114, 101, 116, 117, 114, 110, 59, // cs') return; + 10, 32, 32, 32, 32, 32, 32, 115, 101, 116, 68, 97, // . setDa + 116, 97, 40, 120, 32, 61, 62, 32, 120, 46, 99, 111, // ta(x => x.co + 110, 99, 97, 116, 40, 91, 109, 115, 103, 46, 100, 97, // ncat([msg.da + 116, 97, 93, 41, 46, 115, 112, 108, 105, 99, 101, 40, // ta]).splice( + 45, 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, 68, // -MaxMetricsD + 97, 116, 97, 80, 111, 105, 110, 116, 115, 41, 41, 59, // ataPoints)); + 10, 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, // . });. + 32, 114, 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, // return PubS + 117, 98, 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, // ub.unsubscri + 98, 101, 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, // be(id);. }, + 32, 91, 93, 41, 59, 10, 10, 32, 32, 108, 101, 116, // []);.. let + 32, 120, 109, 97, 120, 32, 61, 32, 48, 44, 32, 109, // xmax = 0, m + 105, 115, 115, 105, 110, 103, 32, 61, 32, 77, 97, 120, // issing = Max + 77, 101, 116, 114, 105, 99, 115, 68, 97, 116, 97, 80, // MetricsDataP + 111, 105, 110, 116, 115, 32, 45, 32, 100, 97, 116, 97, // oints - data + 46, 108, 101, 110, 103, 116, 104, 59, 10, 32, 32, 105, // .length;. i + 102, 32, 40, 109, 105, 115, 115, 105, 110, 103, 32, 62, // f (missing > + 32, 48, 41, 32, 120, 109, 97, 120, 32, 61, 32, 77, // 0) xmax = M + 97, 116, 104, 46, 114, 111, 117, 110, 100, 40, 68, 97, // ath.round(Da + 116, 101, 46, 110, 111, 119, 40, 41, 32, 47, 32, 49, // te.now() / 1 + 48, 48, 48, 41, 32, 43, 32, 109, 105, 115, 115, 105, // 000) + missi + 110, 103, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ng;. return + 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.

Data C + 104, 97, 114, 116, 60, 47, 104, 51, 62, 10, 32, 32, // hart

. + 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. < + 36, 123, 83, 86, 71, 125, 32, 104, 101, 105, 103, 104, // ${SVG} heigh + 116, 61, 50, 52, 48, 32, 119, 105, 100, 116, 104, 61, // t=240 width= + 54, 48, 48, 32, 121, 109, 105, 110, 61, 48, 32, 121, // 600 ymin=0 y + 109, 97, 120, 61, 50, 48, 32, 120, 109, 97, 120, 61, // max=20 xmax= + 36, 123, 120, 109, 97, 120, 125, 32, 100, 97, 116, 97, // ${xmax} data + 61, 36, 123, 100, 97, 116, 97, 125, 32, 47, 62, 10, // =${data} />. + 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < + 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 109, // div class="m + 115, 103, 34, 62, 10, 32, 32, 32, 32, 84, 104, 105, // sg">. Thi + 115, 32, 99, 104, 97, 114, 116, 32, 112, 108, 111, 116, // s chart plot + 115, 32, 108, 105, 118, 101, 32, 115, 101, 110, 115, 111, // s live senso + 114, 32, 100, 97, 116, 97, 44, 32, 115, 101, 110, 116, // r data, sent + 32, 98, 121, 32, 116, 104, 101, 32, 100, 101, 118, 105, // by the devi + 99, 101, 32, 118, 105, 97, 32, 47, 97, 112, 105, 47, // ce via /api/ + 119, 97, 116, 99, 104, 46, 10, 32, 32, 60, 47, 100, // watch.. .
`; + 10, 125, 59, 10, 10, 99, 111, 110, 115, 116, 32, 65, // .};..const A + 112, 112, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // pp = functio + 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, // n(props) {. + 32, 99, 111, 110, 115, 116, 32, 91, 117, 115, 101, 114, // const [user + 44, 32, 115, 101, 116, 85, 115, 101, 114, 93, 32, 61, // , setUser] = + 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState('' + 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, // );. const [ + 99, 111, 110, 102, 105, 103, 44, 32, 115, 101, 116, 67, // config, setC + 111, 110, 102, 105, 103, 93, 32, 61, 32, 117, 115, 101, // onfig] = use + 83, 116, 97, 116, 101, 40, 123, 125, 41, 59, 10, 10, // State({});.. + 32, 32, 99, 111, 110, 115, 116, 32, 103, 101, 116, 99, // const getc + 111, 110, 102, 105, 103, 32, 61, 32, 40, 41, 32, 61, // onfig = () = + 62, 10, 32, 32, 32, 32, 32, 32, 102, 101, 116, 99, // >. fetc + 104, 40, 39, 47, 97, 112, 105, 47, 99, 111, 110, 102, // h('/api/conf + 105, 103, 47, 103, 101, 116, 39, 44, 32, 123, 104, 101, // ig/get', {he + 97, 100, 101, 114, 115, 58, 32, 123, 65, 117, 116, 104, // aders: {Auth + 111, 114, 105, 122, 97, 116, 105, 111, 110, 58, 32, 39, // orization: ' + 39, 125, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, // '}}). + 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, // .then(r = + 62, 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 10, // > r.json()). + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, // .t + 104, 101, 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, // hen(r => set + 67, 111, 110, 102, 105, 103, 40, 114, 41, 41, 10, 32, // Config(r)). + 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, // .ca + 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, 99, // tch(err => c + 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 101, // onsole.log(e + 114, 114, 41, 41, 59, 10, 10, 32, 32, 99, 111, 110, // rr));.. con + 115, 116, 32, 108, 111, 103, 105, 110, 32, 61, 32, 102, // st login = f + 117, 110, 99, 116, 105, 111, 110, 40, 117, 41, 32, 123, // unction(u) { + 10, 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, 110, // . documen + 116, 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, 96, // t.cookie = ` + 97, 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, 110, // access_token + 61, 36, 123, 117, 46, 116, 111, 107, 101, 110, 125, 59, // =${u.token}; + 112, 97, 116, 104, 61, 47, 59, 109, 97, 120, 45, 97, // path=/;max-a + 103, 101, 61, 51, 54, 48, 48, 96, 59, 10, 32, 32, // ge=3600`;. + 32, 32, 115, 101, 116, 85, 115, 101, 114, 40, 117, 46, // setUser(u. + 117, 115, 101, 114, 41, 59, 10, 32, 32, 32, 32, 114, // user);. r + 101, 116, 117, 114, 110, 32, 103, 101, 116, 99, 111, 110, // eturn getcon + 102, 105, 103, 40, 41, 59, 10, 32, 32, 125, 59, 10, // fig();. };. + 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, 111, 103, // . const log + 111, 117, 116, 32, 61, 32, 101, 118, 32, 61, 62, 32, // out = ev => + 123, 10, 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, // {. docume + 110, 116, 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, // nt.cookie = + 96, 97, 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, // `access_toke + 110, 61, 59, 112, 97, 116, 104, 61, 47, 59, 109, 97, // n=;path=/;ma + 120, 45, 97, 103, 101, 61, 48, 96, 59, 10, 32, 32, // x-age=0`;. + 32, 32, 115, 101, 116, 85, 115, 101, 114, 40, 39, 39, // setUser('' + 41, 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 47, // );. };.. / + 47, 32, 87, 97, 116, 99, 104, 32, 102, 111, 114, 32, // / Watch for + 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, // notification + 115, 46, 32, 65, 115, 32, 115, 111, 111, 110, 32, 97, // s. As soon a + 115, 32, 97, 32, 110, 111, 116, 105, 102, 105, 99, 97, // s a notifica + 116, 105, 111, 110, 32, 97, 114, 114, 105, 118, 101, 115, // tion arrives + 44, 32, 112, 97, 115, 115, 32, 105, 116, 32, 111, 110, // , pass it on + 10, 32, 32, 47, 47, 32, 116, 111, 32, 97, 108, 108, // . // to all + 32, 115, 117, 98, 115, 99, 114, 105, 98, 101, 100, 32, // subscribed + 99, 111, 109, 112, 111, 110, 101, 110, 116, 115, 10, 32, // components. + 32, 99, 111, 110, 115, 116, 32, 119, 97, 116, 99, 104, // const watch + 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, // = function( + 41, 32, 123, 10, 32, 32, 32, 32, 118, 97, 114, 32, // ) {. var + 108, 32, 61, 32, 119, 105, 110, 100, 111, 119, 46, 108, // l = window.l + 111, 99, 97, 116, 105, 111, 110, 44, 32, 112, 114, 111, // ocation, pro + 116, 111, 32, 61, 32, 108, 46, 112, 114, 111, 116, 111, // to = l.proto + 99, 111, 108, 46, 114, 101, 112, 108, 97, 99, 101, 40, // col.replace( + 39, 104, 116, 116, 112, 39, 44, 32, 39, 119, 115, 39, // 'http', 'ws' + 41, 59, 10, 32, 32, 32, 32, 118, 97, 114, 32, 116, // );. var t + 105, 100, 44, 32, 119, 115, 85, 82, 73, 32, 61, 32, // id, wsURI = + 112, 114, 111, 116, 111, 32, 43, 32, 39, 47, 47, 39, // proto + '//' + 32, 43, 32, 108, 46, 104, 111, 115, 116, 32, 43, 32, // + l.host + + 39, 47, 97, 112, 105, 47, 119, 97, 116, 99, 104, 39, // '/api/watch' + 10, 32, 32, 32, 32, 118, 97, 114, 32, 114, 101, 99, // . var rec + 111, 110, 110, 101, 99, 116, 32, 61, 32, 102, 117, 110, // onnect = fun + 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, // ction() {. + 32, 32, 32, 32, 118, 97, 114, 32, 119, 115, 32, 61, // var ws = + 32, 110, 101, 119, 32, 87, 101, 98, 83, 111, 99, 107, // new WebSock + 101, 116, 40, 119, 115, 85, 82, 73, 41, 59, 10, 32, // et(wsURI);. + 32, 32, 32, 32, 32, 119, 115, 46, 111, 110, 111, 112, // ws.onop + 101, 110, 32, 61, 32, 40, 41, 32, 61, 62, 32, 99, // en = () => c + 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 39, // onsole.log(' + 119, 115, 32, 99, 111, 110, 110, 101, 99, 116, 101, 100, // ws connected + 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 119, 115, // ');. ws + 46, 111, 110, 109, 101, 115, 115, 97, 103, 101, 32, 61, // .onmessage = + 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 118, // function(ev + 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ) {. + 116, 114, 121, 32, 123, 10, 32, 32, 32, 32, 32, 32, // try {. + 32, 32, 32, 32, 118, 97, 114, 32, 109, 115, 103, 32, // var msg + 61, 32, 74, 83, 79, 78, 46, 112, 97, 114, 115, 101, // = JSON.parse + 40, 101, 118, 46, 100, 97, 116, 97, 41, 59, 10, 32, // (ev.data);. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 80, 117, 98, // Pub + 83, 117, 98, 46, 112, 117, 98, 108, 105, 115, 104, 40, // Sub.publish( + 109, 115, 103, 41, 59, 10, 32, 32, 32, 32, 32, 32, // msg);. + 32, 32, 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, // if (msg. + 110, 97, 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, // name != 'met + 114, 105, 99, 115, 39, 41, 32, 99, 111, 110, 115, 111, // rics') conso + 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, 45, 62, // le.log('ws-> + 39, 44, 32, 109, 115, 103, 41, 59, 10, 32, 32, 32, // ', msg);. + 32, 32, 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, // } catch + 32, 40, 101, 41, 32, 123, 10, 32, 32, 32, 32, 32, // (e) {. + 32, 32, 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, // console + 46, 108, 111, 103, 40, 39, 73, 110, 118, 97, 108, 105, // .log('Invali + 100, 32, 119, 115, 32, 102, 114, 97, 109, 101, 58, 39, // d ws frame:' + 44, 32, 101, 118, 46, 100, 97, 116, 97, 41, 59, 32, // , ev.data); + 32, 47, 47, 32, 101, 115, 108, 105, 110, 116, 45, 100, // // eslint-d + 105, 115, 97, 98, 108, 101, 45, 108, 105, 110, 101, 10, // isable-line. + 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, // }. + 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, 32, 32, // };. + 32, 119, 115, 46, 111, 110, 99, 108, 111, 115, 101, 32, // ws.onclose + 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // = function() + 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, // {. c + 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout( + 116, 105, 100, 41, 59, 10, 32, 32, 32, 32, 32, 32, // tid);. + 32, 32, 116, 105, 100, 32, 61, 32, 115, 101, 116, 84, // tid = setT + 105, 109, 101, 111, 117, 116, 40, 114, 101, 99, 111, 110, // imeout(recon + 110, 101, 99, 116, 44, 32, 49, 48, 48, 48, 41, 59, // nect, 1000); + 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 110, // . con + 115, 111, 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, // sole.log('ws + 32, 100, 105, 115, 99, 111, 110, 110, 101, 99, 116, 101, // disconnecte + 100, 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 125, // d');. } + 59, 10, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // ;. };. + 32, 114, 101, 99, 111, 110, 110, 101, 99, 116, 40, 41, // reconnect() + 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 117, 115, // ;. };.. us + 101, 69, 102, 102, 101, 99, 116, 40, 40, 41, 32, 61, // eEffect(() = + 62, 32, 123, 10, 32, 32, 32, 32, 47, 47, 32, 67, // > {. // C + 97, 108, 108, 101, 100, 32, 111, 110, 99, 101, 32, 97, // alled once a + 116, 32, 105, 110, 105, 116, 32, 116, 105, 109, 101, 10, // t init time. + 32, 32, 32, 32, 80, 117, 98, 83, 117, 98, 46, 115, // PubSub.s + 117, 98, 115, 99, 114, 105, 98, 101, 40, 109, 115, 103, // ubscribe(msg + 32, 61, 62, 32, 109, 115, 103, 46, 110, 97, 109, 101, // => msg.name + 32, 61, 61, 32, 39, 99, 111, 110, 102, 105, 103, 39, // == 'config' + 32, 38, 38, 32, 103, 101, 116, 99, 111, 110, 102, 105, // && getconfi + 103, 40, 41, 41, 59, 10, 32, 32, 32, 32, 102, 101, // g());. fe + 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 108, 111, // tch('/api/lo + 103, 105, 110, 39, 44, 32, 123, 104, 101, 97, 100, 101, // gin', {heade + 114, 115, 58, 32, 123, 65, 117, 116, 104, 111, 114, 105, // rs: {Authori + 122, 97, 116, 105, 111, 110, 58, 32, 39, 39, 125, 125, // zation: ''}} + 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, // ). .t + 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, 46, 106, // hen(r => r.j + 115, 111, 110, 40, 41, 41, 10, 32, 32, 32, 32, 32, // son()). + 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, // .then(r = + 62, 32, 108, 111, 103, 105, 110, 40, 114, 41, 41, 10, // > login(r)). + 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, // .the + 110, 40, 119, 97, 116, 99, 104, 41, 10, 32, 32, 32, // n(watch). + 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, // .catch( + 101, 114, 114, 32, 61, 62, 32, 115, 101, 116, 85, 115, // err => setUs + 101, 114, 40, 39, 39, 41, 41, 59, 10, 32, 32, 125, // er(''));. } + 44, 32, 91, 93, 41, 59, 10, 10, 32, 32, 105, 102, // , []);.. if + 32, 40, 33, 117, 115, 101, 114, 41, 32, 114, 101, 116, // (!user) ret + 117, 114, 110, 32, 104, 116, 109, 108, 96, 60, 36, 123, // urn html`<${ + 76, 111, 103, 105, 110, 125, 32, 108, 111, 103, 105, 110, // Login} login + 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, 62, // =${login} /> + 96, 59, 10, 10, 32, 32, 114, 101, 116, 117, 114, 110, // `;.. return + 32, 104, 116, 109, 108, 96, 10, 60, 36, 123, 78, 97, // html`.<${Na + 118, 125, 32, 117, 115, 101, 114, 61, 36, 123, 117, 115, // v} user=${us + 101, 114, 125, 32, 108, 111, 103, 111, 117, 116, 61, 36, // er} logout=$ + 123, 108, 111, 103, 111, 117, 116, 125, 32, 47, 62, 10, // {logout} />. + 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. + 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, //
. + 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
< + 36, 123, 72, 101, 114, 111, 125, 32, 47, 62, 60, 47, // ${Hero} />. <${C + 104, 97, 114, 116, 125, 32, 47, 62, 60, 47, 100, 105, // hart} />.
. + 32, 36, 123, 117, 115, 101, 114, 32, 61, 61, 32, 39, // ${user == ' + 97, 100, 109, 105, 110, 39, 32, 38, 38, 32, 104, 40, // admin' && h( + 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // Configuratio + 110, 44, 32, 123, 99, 111, 110, 102, 105, 103, 125, 41, // n, {config}) + 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, // }.
+ 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, // .
<${Messa + 103, 101, 115, 125, 32, 99, 111, 110, 102, 105, 103, 61, // ges} config= + 36, 123, 99, 111, 110, 102, 105, 103, 125, 32, 47, 62, // ${config} /> + 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, 100, //
. .
`; + 10, 125, 59, 10, 10, 119, 105, 110, 100, 111, 119, 46, // .};..window. + 111, 110, 108, 111, 97, 100, 32, 61, 32, 40, 41, 32, // onload = () + 61, 62, 32, 114, 101, 110, 100, 101, 114, 40, 104, 40, // => render(h( + 65, 112, 112, 41, 44, 32, 100, 111, 99, 117, 109, 101, // App), docume + 110, 116, 46, 98, 111, 100, 121, 41, 59, 10, 0 // nt.body);. +}; static const struct packed_file { const char *name; @@ -2785,11 +2795,11 @@ static const struct packed_file { size_t size; time_t mtime; } packed_files[] = { - {"/web_root/index.html", v1, sizeof(v1), 1654437619}, - {"/web_root/main.js", v2, sizeof(v2), 1654714271}, - {"/web_root/preact.min.js", v3, sizeof(v3), 1652374364}, - {"/web_root/style.css", v4, sizeof(v4), 1654709515}, - {"/web_root/user.png", v5, sizeof(v5), 1626172939}, + {"/web_root/index.html", v1, sizeof(v1), 1655487950}, + {"/web_root/preact.min.js", v2, sizeof(v2), 1655487950}, + {"/web_root/style.css", v3, sizeof(v3), 1655487950}, + {"/web_root/user.png", v4, sizeof(v4), 1655487950}, + {"/web_root/main.js", v5, sizeof(v5), 1656008519}, {NULL, NULL, 0, 0} }; diff --git a/examples/device-dashboard/web_root/main.js b/examples/device-dashboard/web_root/main.js index 4bebf590..1fa535c0 100644 --- a/examples/device-dashboard/web_root/main.js +++ b/examples/device-dashboard/web_root/main.js @@ -43,8 +43,8 @@ const Hero = props => html`

Interactive Device Dashboard

- This device dashboard is developed with modern and compact Preact framework, - in order to fit on a very small devices. This is + This device dashboard is developed using the modern and compact Preact framework, + in order to fit on very small devices. This is a hybrid server which provides both static and dynamic content. Static files, like CSS/JS/HTML or images, are compiled into the server binary. @@ -53,14 +53,14 @@ const Hero = props => html` using curl command-line utility:

-
curl localhost:8000/api/config/get
-
curl localhost:8000/api/config/set -d 'value1=7&value2=hello'
-
curl localhost:8000/api/message/send -d 'msg=hello'
+
curl -u admin:pass0 localhost:8000/api/config/get
+
curl -u admin:pass0 localhost:8000/api/config/set -d 'pub=mg/topic'
+
curl -u admin:pass0 localhost:8000/api/message/send -d 'message=hello'

- A device can send notifications to this dashboard at anytime. Notifications - are sent over Websocket at URI curl localhost:8000/api/watch - as JSON strings {"name": "..", "data": ...} + The device can send notifications to this dashboard at anytime. Notifications + are sent over WebSocket at URI /api/watch as JSON strings: {"name": "..", "data": ...} +

Try wscat --auth user1:pass1 --connect ws://localhost:8000/api/watch

`; @@ -153,10 +153,10 @@ const Configuration = function(props) { HiveMQ Websocket web client to send messages to this console.
- Device keeps a persistent connection to the configured MQTT server. + The device keeps a persistent connection to the configured MQTT server. Changes to this configuration are propagated to all dashboards: try - changing them in this dashboard and observe changes in the other opened - dashboard. + changing them in this dashboard and observe changes in other opened + dashboards.
Note: administrators can see this section and can change device configuration, whilst users cannot. @@ -186,7 +186,7 @@ const Messages = function(props) { method: 'post', body: `message=${encodeURIComponent(txt)}` }).then(r => setTxt('')); - const connstatus = props.config.connected ? 'connected' : 'diconnected'; + const connstatus = props.config.connected ? 'connected' : 'disconnected'; return html`

MQTT messages

@@ -203,10 +203,9 @@ const Messages = function(props) { oninput=${ev => setTxt(ev.target.value)} />
- Message gets passed to the device via REST. Then a device sends it to + The message gets passed to the device via REST. Then the device sends it to the MQTT server over MQTT. All MQTT messages on a subscribed topic - received by a device, are propagated to this dashboard via the - /api/watch. + received by the device, are propagated to this dashboard via /api/watch.
`; }; @@ -298,7 +297,7 @@ const Chart = function(props) { <${SVG} height=240 width=600 ymin=0 ymax=20 xmax=${xmax} data=${data} />
- This chart plots live sensor data, sent by a device via /api/watch. + This chart plots live sensor data, sent by the device via /api/watch.
`; };