diff --git a/examples/device-dashboard/Makefile b/examples/device-dashboard/Makefile index 937aaf71..2cc444cc 100644 --- a/examples/device-dashboard/Makefile +++ b/examples/device-dashboard/Makefile @@ -1,40 +1,33 @@ -PROG ?= example -SOURCES ?= ../../mongoose.c main.c net.c packed_fs.c -CFLAGS ?= -I../.. -DMG_ENABLE_PACKED_FS=1 -DMG_ENABLE_LINES=1 $(EXTRA) -FILES_TO_EMBED ?= $(wildcard web_root/*) -ROOT ?= $(realpath $(CURDIR)/../../..) -DOCKER ?= docker run --rm -e Tmp=. -e WINEDEBUG=-all -v $(ROOT):$(ROOT) -w $(CURDIR) -VC98 ?= $(DOCKER) mdashnet/vc98 wine -MINGW ?= $(DOCKER) mdashnet/mingw +SOURCES = ../../mongoose.c main.c net.c packed_fs.c +CFLAGS = -W -Wall -Wextra -g -ifeq "$(SSL)" "MBEDTLS" -CFLAGS += -DMG_ENABLE_MBEDTLS=1 -I$(MBEDTLS)/include -L$(MBEDTLS)/lib -lmbedtls -lmbedcrypto -lmbedx509 -endif +# Mongoose build options. See https://mongoose.ws/documentation/#build-options +CFLAGS += -I ../.. -DMG_ENABLE_PACKED_FS=1 -ifeq "$(SSL)" "OPENSSL" -CFLAGS += -DMG_ENABLE_OPENSSL=1 -I$(OPENSSL)/include -L$(OPENSSL)/lib -lssl -lcrypto +ifeq ($(OS),Windows_NT) + # Windows settings. Assume MinGW compiler + PROG ?= example.exe # Use .exe suffix for the binary + CC = gcc # Use MinGW gcc compiler + CFLAGS += -lws2_32 # Link against Winsock library + DELETE = cmd /C del /Q /F /S # Command prompt command to delete files +else + # Mac, Linux + PROG ?= example + DELETE = rm -rf endif all: $(PROG) - $(RUN) ./$(PROG) + $(RUN) ./$(PROG) $(ARGS) -$(PROG): $(SOURCES) $(FILES_TO_EMBED) +# Before embedding files, gzip them to save space +packed_fs.c: $(shell find web_root -type f) Makefile + rm -rf tmp/web_root && mkdir tmp && cp -r web_root tmp/ + find tmp -type f | xargs -n1 gzip $(CC) ../../test/pack.c -o pack - ./pack $(FILES_TO_EMBED) > packed_fs.c - $(CC) -W -Wall -Wextra -O0 -g3 $(CFLAGS) -o $(PROG) $(SOURCES) + cd tmp && ../pack `find web_root -type f` > ../$@ - -mingw: $(SOURCES) $(FILES_TO_EMBED) - $(MINGW) i686-w64-mingw32-gcc $(CFLAGS) ../../test/pack.c -o pack.exe - $(MINGW) wine cmd /c 'pack.exe $(FILES_TO_EMBED) > packed_fs.c' - $(MINGW) i686-w64-mingw32-gcc $(CFLAGS) $(SOURCES) -lws2_32 -o $(PROG).exe - $(MINGW) wine $(PROG).exe - -vc98: $(SOURCES) $(FILES_TO_EMBED) - $(VC98) cl.exe /nologo $(CFLAGS) ../../test/pack.c /Fepack.exe - $(VC98) cmd /c 'pack.exe $(FILES_TO_EMBED) > packed_fs.c' - $(VC98) cl.exe /nologo /O2 $(CFLAGS) $(SOURCES) /Fe$(PROG).exe - $(VC98) $(PROG).exe +$(PROG): $(SOURCES) + $(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_EXTRA) -o $@ clean: - rm -rf $(PROG) *.o *.dSYM *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb log.txt pack + $(DELETE) $(PROG) *.dSYM pack tmp diff --git a/examples/device-dashboard/packed_fs.c b/examples/device-dashboard/packed_fs.c index 8eb9229e..2c633f8d 100644 --- a/examples/device-dashboard/packed_fs.c +++ b/examples/device-dashboard/packed_fs.c @@ -3,3485 +3,886 @@ #include static const unsigned char v1[] = { - 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, 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);. + 31, 139, 8, 8, 16, 107, 222, 99, 0, 3, 109, 97, // .....k.c..ma + 105, 110, 46, 106, 115, 0, 189, 91, 123, 119, 219, 184, // in.js..[{w.. + 177, 255, 63, 159, 2, 171, 235, 91, 81, 181, 68, 73, // ..?....[Q.DI + 118, 156, 205, 149, 35, 245, 164, 217, 237, 221, 244, 36, // v...#......$ + 217, 116, 157, 109, 187, 199, 199, 167, 166, 72, 72, 98, // .t.m.....HHb + 77, 145, 92, 18, 122, 213, 225, 119, 191, 191, 25, 128, // M...z..w.... + 36, 40, 203, 143, 108, 218, 235, 228, 72, 36, 48, 24, // $(..l...H$0. + 12, 102, 6, 243, 2, 212, 94, 229, 82, 228, 42, 11, // .f....^.R.*. + 125, 213, 62, 127, 22, 46, 211, 36, 83, 226, 246, 77, // }.>....$S..M + 130, 135, 88, 198, 170, 43, 22, 248, 175, 150, 81, 87, // ..X..+....QW + 100, 50, 14, 100, 214, 21, 24, 240, 253, 108, 38, 125, // d2.d.....l&} + 197, 143, 23, 202, 83, 146, 159, 126, 146, 179, 66, 204, // ....S..~..B. + 178, 100, 41, 218, 110, 63, 205, 164, 231, 43, 119, 25, // .d).n?...+w. + 198, 238, 63, 115, 32, 126, 182, 246, 50, 17, 200, 181, // ..?s ~..2... + 23, 4, 153, 24, 139, 22, 125, 203, 60, 31, 209, 116, // ......}.<..t + 45, 116, 251, 73, 156, 43, 241, 222, 219, 190, 151, 68, // -t.I.+.....D + 75, 254, 157, 167, 188, 143, 73, 24, 171, 28, 208, 103, // K.....I....g + 3, 64, 244, 251, 226, 211, 34, 204, 69, 14, 26, 35, // .@....".E..# + 41, 210, 213, 52, 10, 243, 69, 63, 95, 77, 115, 63, // )..4..E?_Ms? + 11, 167, 82, 160, 15, 84, 4, 66, 37, 34, 245, 242, // ..R..T.B%".. + 92, 196, 137, 10, 103, 161, 239, 169, 16, 184, 133, 90, // ....g......Z + 120, 74, 108, 100, 38, 9, 81, 38, 125, 25, 174, 1, // xJld&.Q&}... + 203, 228, 170, 5, 56, 32, 179, 53, 45, 14, 131, 189, // ....8 .5-... + 40, 18, 254, 34, 140, 2, 225, 151, 92, 200, 69, 50, // (.."......E2 + 99, 48, 47, 77, 93, 94, 202, 199, 213, 244, 98, 53, // c0/M]^....b5 + 5, 109, 206, 108, 21, 251, 52, 133, 211, 17, 183, 207, // .m.l..4..... + 132, 160, 206, 133, 23, 7, 145, 204, 136, 244, 219, 162, // ............ + 43, 194, 0, 15, 88, 130, 192, 188, 106, 149, 197, 12, // +...X...j... + 39, 68, 69, 249, 72, 84, 56, 102, 113, 199, 244, 138, // 'DE.HT8fq... + 10, 203, 101, 24, 28, 31, 95, 1, 197, 44, 62, 231, // ..e..._..,>. + 174, 162, 203, 95, 171, 248, 16, 134, 48, 168, 49, 4, // ..._....0.1. + 50, 146, 74, 218, 136, 174, 26, 24, 12, 15, 173, 209, // 2.J......... + 1, 216, 94, 143, 159, 37, 153, 112, 104, 65, 55, 34, // ..^..%.phA7" + 140, 43, 52, 157, 26, 225, 205, 149, 30, 97, 176, 226, // .+4......a.. + 179, 56, 127, 86, 116, 156, 78, 37, 209, 15, 222, 26, // .8.Vt.N%.... + 148, 167, 89, 146, 130, 27, 19, 214, 164, 235, 103, 175, // ..Y.......g. + 130, 112, 13, 157, 219, 69, 114, 220, 154, 122, 254, 205, // .p...Er..z.. + 60, 75, 86, 113, 48, 18, 255, 117, 122, 122, 122, 14, // .,.Lv... + 37, 158, 105, 39, 99, 139, 184, 66, 92, 232, 206, 89, // %.i'c..B...Y + 24, 201, 188, 43, 162, 240, 70, 138, 55, 23, 23, 253, // ...+..F.7... + 63, 95, 244, 127, 248, 244, 254, 29, 112, 193, 44, 133, // ?_......p.,. + 75, 111, 78, 189, 94, 38, 121, 225, 128, 165, 77, 131, // KoN.^&y...M. + 229, 213, 214, 92, 76, 195, 216, 203, 118, 238, 179, 146, // ....L...v... + 169, 63, 191, 37, 15, 145, 51, 200, 79, 223, 95, 124, // .?.%..3.O._| + 18, 175, 63, 190, 21, 236, 78, 150, 180, 57, 3, 49, // ..?...N..9.1 + 221, 113, 159, 230, 71, 87, 211, 46, 118, 201, 74, 248, // .q..GW..v.J. + 216, 120, 114, 11, 58, 99, 9, 100, 154, 253, 226, 149, // .xr.:c.d.... + 15, 230, 79, 252, 85, 22, 189, 234, 243, 35, 81, 178, // ..O.U....#Q. + 196, 154, 122, 17, 224, 196, 74, 133, 81, 168, 118, 35, // ..z...J.Q.v# + 214, 225, 84, 11, 152, 116, 184, 30, 38, 122, 43, 225, // ..T..t..&z+. + 5, 64, 58, 34, 135, 53, 16, 71, 183, 198, 67, 22, // .@:".5.G..C. + 125, 47, 13, 129, 51, 158, 133, 243, 254, 92, 170, 18, // }/..3....... + 127, 189, 41, 126, 11, 162, 92, 42, 209, 11, 68, 27, // ..)~...*..D. + 102, 127, 188, 156, 247, 177, 3, 66, 191, 253, 149, 168, // f......B.... + 151, 112, 226, 144, 4, 112, 67, 148, 132, 220, 52, 140, // .p...pC...4. + 23, 50, 138, 146, 125, 236, 150, 142, 151, 92, 102, 214, // .2..}.....f. + 242, 232, 61, 127, 77, 146, 36, 165, 175, 118, 0, 252, // ..=.M.$..v.. + 183, 23, 239, 84, 184, 148, 174, 248, 96, 195, 146, 186, // ...T....`... + 102, 36, 244, 24, 138, 77, 114, 255, 155, 156, 94, 36, // f$...Mr...^$ + 254, 13, 150, 139, 49, 63, 255, 244, 214, 72, 138, 9, // ....1?...H.. + 222, 120, 202, 95, 148, 100, 121, 185, 248, 243, 197, 143, // .x._.dy..... + 31, 56, 254, 137, 231, 216, 220, 26, 240, 182, 5, 149, // .8.......... + 148, 173, 145, 104, 185, 110, 171, 43, 90, 228, 227, 240, // ...h.n.+Z... + 230, 186, 110, 97, 70, 150, 124, 250, 132, 61, 164, 199, // ..naF.|..=.. + 108, 114, 80, 35, 122, 61, 24, 245, 5, 105, 89, 54, // lrP#z=...iY6 + 100, 134, 13, 209, 4, 246, 199, 48, 69, 98, 67, 187, // d......0EbC. + 104, 143, 127, 54, 57, 150, 201, 75, 75, 131, 103, 217, // h..69..KK.g. + 61, 109, 246, 224, 31, 176, 153, 199, 181, 203, 102, 3, // =m........f. + 168, 125, 182, 134, 184, 164, 217, 187, 96, 135, 250, 25, // .}......`... + 15, 20, 56, 148, 97, 154, 211, 110, 179, 171, 54, 112, // ..8.a..n..6p + 68, 31, 195, 125, 196, 195, 253, 112, 145, 153, 81, 194, // D..}...p..Q. + 147, 151, 158, 97, 38, 65, 182, 83, 89, 126, 33, 218, // ...a&A.SY~!. + 188, 26, 6, 109, 119, 173, 246, 219, 133, 244, 96, 119, // ...mw.....`w + 192, 218, 219, 215, 224, 12, 140, 198, 191, 88, 104, 35, // .........Xh# + 209, 254, 163, 151, 99, 151, 183, 197, 177, 152, 170, 196, // ....c....... + 115, 136, 106, 60, 183, 71, 212, 66, 164, 117, 138, 162, // s.j<.G.B.u.. + 99, 97, 114, 177, 51, 99, 39, 35, 83, 159, 33, 166, // car.3c'#S.!. + 164, 128, 235, 190, 110, 241, 187, 223, 137, 202, 69, 133, // ....n.....E. + 104, 109, 66, 250, 196, 115, 71, 102, 12, 140, 175, 142, // hmB..sGf.... + 21, 154, 221, 245, 34, 236, 25, 200, 54, 176, 1, 109, // ...."...6..m + 213, 38, 126, 219, 219, 132, 129, 66, 244, 244, 252, 229, // .&~....B.... + 32, 133, 183, 175, 140, 190, 113, 236, 182, 163, 57, 59, // .....q...9; + 236, 104, 234, 112, 102, 223, 171, 159, 208, 128, 50, 152, // .h.pf.....2. + 169, 29, 75, 233, 117, 94, 188, 120, 1, 167, 178, 239, // ..K.u^.x.... + 72, 140, 114, 104, 127, 178, 31, 155, 212, 62, 233, 204, // H.rh.....>.. + 248, 164, 210, 203, 135, 113, 186, 82, 66, 237, 82, 57, // .....q.RB.R9 + 110, 43, 185, 85, 109, 129, 32, 198, 151, 139, 36, 194, // n+.Um. ...$. + 130, 199, 237, 15, 216, 11, 237, 18, 139, 89, 242, 112, // .........Y.p + 48, 248, 239, 243, 86, 197, 212, 36, 102, 28, 136, 12, // 0...V..$f... + 88, 73, 74, 221, 115, 228, 218, 85, 152, 86, 42, 119, // XIJ.s..U.V*w + 237, 69, 43, 217, 41, 4, 127, 3, 142, 163, 13, 68, // .E+.)......D + 36, 15, 69, 83, 79, 162, 184, 69, 170, 2, 55, 23, // $.ESO..E..7. + 180, 26, 84, 183, 62, 86, 205, 95, 74, 57, 141, 124, // ..T.>V._J9.| + 128, 114, 154, 175, 176, 198, 251, 136, 134, 231, 212, 193, // .r.......... + 186, 246, 212, 53, 13, 247, 86, 52, 93, 41, 5, 167, // ...5..V4]).. + 108, 135, 91, 7, 232, 62, 16, 55, 85, 148, 32, 246, // l.[..>.7U. . + 244, 166, 240, 130, 160, 228, 27, 222, 75, 159, 63, 139, // ........K.?. + 111, 152, 88, 43, 112, 211, 52, 78, 42, 69, 209, 211, // o.X+p.4N*E.. + 62, 72, 113, 35, 208, 177, 117, 250, 132, 131, 78, 51, // >Hq#..u...N3 + 255, 95, 17, 235, 6, 218, 84, 96, 175, 91, 14, 163, // ._....T`.[.. + 107, 27, 67, 253, 114, 194, 47, 39, 15, 135, 121, 69, // k.C.r./'..yE + 29, 233, 189, 97, 247, 181, 202, 216, 112, 60, 98, 250, // ...a....p + 125, 50, 1, 122, 35, 191, 109, 24, 117, 114, 67, 173, // }2.z#.m.urC. + 59, 9, 124, 211, 116, 139, 218, 153, 100, 81, 97, 91, // ;.|.t...dQa[ + 226, 74, 196, 133, 5, 124, 200, 71, 97, 179, 221, 53, // .J...|.Ga..5 + 244, 165, 1, 63, 96, 146, 27, 54, 214, 76, 106, 44, // ...?`..6.Lj, + 235, 157, 57, 239, 205, 134, 15, 228, 190, 63, 243, 96, // ..9......?.` + 219, 28, 55, 194, 241, 39, 242, 94, 60, 206, 252, 139, // ..7..'.^<... + 170, 90, 198, 209, 255, 215, 9, 160, 100, 63, 116, 245, // .Z......d?t. + 0, 251, 169, 245, 33, 55, 75, 214, 234, 55, 51, 191, // ....!7K..73. + 156, 178, 193, 124, 107, 198, 255, 127, 230, 63, 206, 251, // ...|k....?.. + 143, 186, 218, 246, 239, 224, 124, 205, 251, 244, 32, 239, // ......|... . + 83, 155, 247, 135, 131, 156, 175, 225, 126, 122, 136, 251, // S.......~z.. + 233, 127, 132, 251, 154, 160, 95, 76, 10, 78, 181, 234, // ......_L.N.. + 70, 93, 2, 9, 213, 102, 179, 113, 23, 225, 90, 46, // F]...f.q..Z. + 127, 133, 119, 91, 246, 3, 185, 76, 242, 254, 70, 78, // ..w[...L..FN + 115, 206, 0, 123, 32, 18, 174, 163, 111, 196, 243, 3, // s..{ ...o... + 0, 223, 255, 133, 18, 68, 221, 45, 0, 40, 52, 8, // .....D.-.(4. + 87, 43, 144, 117, 114, 46, 106, 178, 216, 58, 13, 45, // W+.ur.j..:.- + 173, 245, 29, 237, 48, 60, 90, 230, 115, 51, 133, 149, // ....06 + 151, 26, 85, 156, 40, 75, 28, 135, 2, 199, 247, 90, // ..U.(K.....Z + 138, 112, 198, 203, 170, 66, 248, 104, 130, 209, 216, 193, // .p...B.h.... + 191, 38, 121, 107, 130, 143, 145, 56, 186, 93, 186, 70, // .&yk...8.].F + 43, 92, 52, 20, 162, 222, 192, 141, 17, 188, 187, 91, // +.4........[ + 19, 189, 201, 27, 163, 184, 233, 222, 113, 92, 99, 152, // ........q.c. + 208, 103, 115, 20, 181, 84, 101, 217, 253, 98, 192, 251, // .gs..Te..b.. + 82, 77, 31, 12, 138, 75, 101, 230, 40, 181, 28, 210, // RM...Ke.(... + 8, 85, 47, 175, 236, 128, 86, 109, 21, 131, 126, 218, // .U/...Vm..~. + 170, 187, 85, 129, 123, 131, 87, 61, 152, 207, 58, 244, // ..U.{.W=..:. + 225, 136, 91, 29, 79, 212, 103, 36, 80, 144, 250, 120, // ..[.O.g$P..x + 33, 156, 9, 106, 112, 41, 226, 19, 227, 113, 85, 59, // !..jp)...qU; + 106, 119, 108, 66, 157, 45, 205, 177, 165, 208, 21, 81, // jwlB.-.....Q + 157, 115, 73, 35, 136, 41, 87, 157, 242, 216, 193, 124, // .sI#.)W....| + 155, 72, 201, 76, 110, 157, 142, 208, 153, 72, 25, 6, // .H.Ln....H.. + 55, 66, 95, 218, 234, 203, 74, 71, 180, 109, 180, 195, // 7B_...JG.m.. + 94, 187, 184, 245, 132, 192, 247, 203, 130, 94, 19, 240, // ^........^.. + 150, 245, 178, 131, 1, 47, 36, 241, 88, 192, 139, 96, // ...../$.X..` + 183, 174, 124, 104, 161, 145, 160, 44, 121, 194, 222, 42, // ..|h...,y..* + 218, 251, 99, 209, 50, 214, 71, 34, 43, 198, 246, 182, // ..c.2.G"+... + 83, 130, 26, 156, 96, 168, 60, 187, 34, 173, 250, 166, // S...`.<."... + 28, 252, 7, 209, 182, 235, 210, 11, 143, 206, 215, 180, // ............ + 193, 42, 133, 235, 81, 181, 179, 45, 70, 13, 188, 110, // .*..Q..-F..n + 53, 37, 161, 168, 94, 8, 172, 13, 151, 82, 55, 124, // 5%..^....R7| + 117, 172, 123, 58, 240, 7, 207, 7, 143, 197, 186, 76, // u.{:.......L + 113, 185, 33, 236, 248, 86, 155, 45, 203, 2, 11, 205, // q.!..V.-.... + 132, 17, 157, 1, 29, 221, 214, 92, 41, 204, 33, 208, // ........).!. + 193, 32, 65, 31, 183, 80, 182, 78, 238, 142, 138, 145, // . A..P.N.... + 179, 40, 217, 140, 76, 69, 104, 255, 100, 171, 85, 121, // .(..LEh.d.Uy + 88, 93, 91, 210, 52, 96, 247, 27, 250, 220, 165, 151, // X][.4`...... + 58, 149, 130, 194, 128, 57, 102, 83, 64, 23, 77, 115, // :....9fS@.Ms + 209, 233, 20, 191, 45, 98, 121, 122, 192, 98, 166, 58, // ....-byz.b.: + 20, 178, 52, 74, 46, 20, 191, 176, 57, 79, 233, 104, // ..4J....9O.h + 87, 240, 121, 151, 235, 186, 15, 7, 51, 101, 32, 3, // W.y.....3e . + 85, 111, 4, 50, 214, 222, 44, 26, 193, 135, 209, 200, // Uo.2..,..... + 50, 214, 56, 16, 219, 208, 22, 184, 39, 182, 121, 130, // 2.8.....'.y. + 239, 46, 249, 141, 177, 57, 215, 33, 181, 107, 173, 207, // .....9.!.k.. + 5, 196, 58, 244, 248, 248, 128, 206, 75, 100, 108, 247, // ..:.....Kdl. + 16, 209, 240, 156, 8, 229, 18, 198, 71, 93, 182, 74, // ........G].J + 113, 117, 154, 26, 92, 241, 26, 174, 186, 161, 140, 116, // qu.........t + 38, 227, 213, 135, 194, 129, 142, 19, 141, 101, 51, 199, // &........e3. + 213, 123, 231, 19, 119, 3, 128, 61, 191, 78, 148, 214, // .{..w..=.N.. + 101, 230, 251, 188, 37, 146, 209, 239, 183, 169, 222, 164, // e...%....... + 224, 217, 138, 14, 67, 242, 17, 53, 107, 119, 68, 37, // ....C..5kwD% + 119, 44, 32, 36, 15, 34, 221, 185, 43, 46, 197, 229, // w, $."..+... + 240, 197, 217, 243, 211, 23, 195, 211, 179, 147, 174, 24, // ............ + 254, 207, 85, 215, 106, 57, 69, 203, 75, 180, 64, 244, // ..U.j9E.K.@. + 226, 138, 176, 112, 5, 171, 107, 142, 34, 187, 98, 167, // ...p..k.".b. + 16, 54, 2, 213, 214, 124, 239, 16, 35, 208, 167, 183, // .6...|..#... + 69, 27, 63, 111, 241, 108, 60, 220, 197, 95, 255, 247, // E.?o.l<.._.. + 30, 231, 6, 196, 214, 223, 166, 108, 57, 238, 29, 250, // .......l9... + 59, 46, 187, 63, 151, 3, 22, 67, 107, 244, 231, 70, // ;..?...Ck..F + 183, 141, 226, 248, 110, 247, 103, 123, 160, 249, 88, 212, // ....n.g{..X. + 16, 155, 225, 30, 196, 230, 228, 203, 240, 107, 242, 78, // .........k.N + 14, 80, 247, 208, 218, 240, 17, 81, 60, 91, 30, 137, // .P.....Q<[.. + 186, 37, 215, 171, 134, 146, 255, 32, 112, 44, 78, 7, // .%..... p,N. + 93, 34, 108, 44, 240, 189, 160, 134, 151, 93, 154, 115, // ]"l,.....].s + 12, 209, 157, 27, 84, 90, 78, 213, 112, 243, 250, 249, // ....TZN.p... + 179, 120, 94, 202, 174, 234, 219, 86, 125, 103, 229, 104, // .x^....V}g.h + 82, 157, 170, 159, 95, 208, 123, 121, 85, 33, 95, 242, // R..._.{yU!_. + 153, 130, 65, 77, 47, 232, 30, 212, 189, 222, 214, 234, // ..AM/....... + 197, 11, 122, 223, 123, 106, 1, 139, 184, 117, 189, 52, // ..z.{j...u.4 + 141, 118, 78, 188, 138, 162, 46, 79, 195, 102, 50, 165, // .vN....O.f2. + 205, 159, 94, 14, 77, 88, 64, 88, 182, 246, 28, 91, // ..^.MX@X...[ + 51, 135, 198, 18, 198, 15, 98, 25, 52, 176, 88, 180, // 3.....b.4.X. + 108, 191, 132, 22, 141, 69, 11, 239, 151, 158, 183, 197, // l....E...... + 214, 36, 62, 9, 58, 29, 204, 217, 80, 70, 222, 84, // .$>.:...PF.T + 70, 121, 197, 111, 143, 171, 112, 114, 35, 94, 103, 153, // Fy.o..pr#^g. + 183, 115, 12, 199, 143, 197, 176, 211, 113, 103, 97, 20, // .s......qga. + 57, 131, 14, 227, 119, 254, 209, 21, 33, 135, 94, 97, // 9...w...!.^a + 231, 156, 209, 135, 113, 64, 39, 184, 181, 228, 128, 41, // ....q@'....) + 100, 151, 33, 122, 36, 215, 158, 112, 248, 105, 200, 175, // d.!z$..p.i.. + 29, 241, 123, 244, 246, 141, 132, 207, 107, 77, 211, 152, // ..{.....kM.. + 228, 182, 157, 139, 95, 42, 92, 235, 18, 151, 195, 146, // ...._*...... + 232, 177, 236, 246, 80, 84, 192, 84, 85, 219, 213, 193, // ....PT.TU... + 54, 31, 132, 110, 135, 176, 206, 155, 97, 33, 118, 244, // 6..n....a!v. + 176, 43, 196, 246, 132, 26, 240, 126, 162, 223, 203, 208, // .+.....~.... + 25, 168, 90, 125, 178, 74, 37, 54, 69, 12, 217, 117, // ..Z}.J%6E..u + 197, 186, 83, 163, 164, 252, 88, 108, 199, 3, 177, 163, // ..S...Xl.... + 193, 224, 206, 89, 133, 128, 217, 217, 130, 183, 94, 195, // ...Y......^. + 73, 19, 28, 135, 202, 188, 172, 191, 63, 206, 127, 202, // I.......?... + 67, 103, 75, 154, 114, 21, 135, 28, 116, 178, 44, 190, // CgK.r...t.,. + 163, 208, 151, 91, 126, 79, 158, 107, 0, 89, 168, 228, // ...[~O.k.Y.. + 237, 197, 143, 23, 124, 102, 232, 116, 56, 204, 85, 153, // ....|f.t8.U. + 51, 196, 182, 56, 171, 181, 102, 95, 152, 219, 223, 42, // 3..8..f_...* + 204, 109, 45, 76, 236, 220, 99, 225, 108, 32, 130, 13, // .m-L..c.l .. + 9, 114, 83, 9, 114, 187, 47, 200, 61, 97, 254, 189, // .rS.r./.=a.. + 194, 85, 9, 211, 172, 214, 225, 125, 1, 172, 91, 45, // .U.....}..[- + 219, 173, 37, 91, 141, 213, 90, 18, 9, 119, 91, 75, // ..%[..Z..w[K + 34, 197, 38, 16, 193, 184, 245, 30, 33, 203, 182, 232, // ".&.....!... + 30, 221, 46, 32, 227, 119, 213, 11, 171, 90, 209, 186, // ... .w...Z.. + 79, 186, 91, 45, 221, 173, 145, 174, 113, 231, 13, 25, // O.[-....q... + 3, 19, 144, 12, 33, 96, 146, 53, 33, 60, 121, 138, // ....!`.5!.... + 160, 123, 114, 114, 214, 61, 57, 59, 235, 210, 165, 165, // .{rr.=9;.... + 179, 78, 99, 176, 61, 247, 201, 217, 129, 21, 33, 51, // .Nc.=.....!3 + 40, 153, 0, 155, 108, 84, 150, 205, 12, 60, 2, 249, // (...lT...<.. + 49, 39, 236, 232, 68, 229, 78, 183, 50, 221, 20, 23, // 1'..D.N.2... + 174, 45, 176, 173, 13, 6, 211, 67, 6, 212, 234, 230, // .-.....C.... + 141, 161, 53, 26, 162, 221, 3, 86, 6, 152, 226, 20, // ..5....V.... + 141, 147, 210, 205, 54, 83, 90, 26, 173, 163, 91, 86, // ....6SZ...[V + 78, 18, 164, 94, 164, 251, 79, 232, 160, 211, 22, 237, // N..^..O..... + 14, 181, 65, 9, 107, 211, 85, 178, 176, 101, 146, 136, // ..A.k.U..e.. + 61, 28, 131, 131, 72, 246, 70, 243, 88, 240, 105, 61, // =...H.F.X.i= + 223, 63, 221, 132, 200, 212, 195, 5, 28, 90, 44, 87, // .?.......Z,W + 100, 232, 86, 236, 161, 194, 205, 127, 164, 34, 243, 13, // d.V......".. + 87, 100, 248, 54, 110, 187, 99, 246, 196, 121, 89, 225, // Wd.6n.c..yY. + 213, 180, 220, 95, 155, 113, 145, 105, 194, 137, 57, 189, // ..._.q.i..9. + 67, 87, 122, 191, 166, 114, 99, 133, 100, 8, 93, 151, // CWz..rc.d.]. + 97, 158, 235, 218, 198, 193, 171, 195, 61, 97, 233, 9, // a.......=a.. + 33, 226, 5, 154, 49, 19, 49, 232, 148, 168, 44, 19, // !...1.1...,. + 74, 254, 222, 69, 10, 236, 144, 193, 102, 135, 15, 143, // J..E....f... + 96, 198, 124, 117, 145, 66, 250, 167, 143, 85, 40, 136, // `.|u.B...U(. + 124, 173, 20, 135, 142, 223, 30, 41, 41, 84, 74, 87, // |......))TJW + 102, 247, 71, 183, 200, 160, 138, 242, 26, 232, 201, 243, // f.G......... + 129, 206, 198, 198, 47, 6, 3, 118, 66, 20, 71, 129, // ..../..vB.G. + 5, 227, 147, 1, 179, 130, 92, 46, 190, 10, 230, 219, // ............ + 88, 111, 179, 167, 166, 206, 84, 159, 102, 93, 38, 191, // Xo....T.f]&. + 146, 35, 202, 90, 115, 66, 156, 39, 153, 40, 21, 56, // .#.ZsB.'.(.8 + 86, 205, 20, 246, 137, 9, 170, 86, 228, 215, 105, 250, // V......V..i. + 239, 185, 247, 164, 43, 83, 12, 169, 143, 59, 27, 176, // ....+S...;.. + 183, 133, 93, 34, 156, 75, 165, 193, 41, 86, 177, 226, // ..]".K..)V.. + 148, 3, 167, 227, 115, 125, 58, 126, 255, 133, 167, 246, // ....s}:~.... + 111, 189, 208, 84, 17, 250, 224, 77, 38, 251, 64, 153, // o..T...M&.@. + 142, 188, 171, 220, 227, 111, 4, 197, 151, 185, 27, 87, // .....o.....W + 236, 92, 241, 58, 23, 121, 66, 101, 7, 58, 164, 176, // ...:.yBe.:.. + 251, 40, 88, 130, 248, 144, 156, 243, 77, 122, 190, 48, // .(X.....Mz.0 + 170, 113, 153, 67, 6, 171, 76, 81, 95, 146, 175, 152, // .q.C..LQ_... + 198, 194, 180, 101, 85, 90, 24, 186, 75, 78, 209, 200, // ...eUZ..KN.. + 6, 129, 105, 178, 1, 165, 190, 169, 237, 67, 152, 138, // ..i......C.. + 110, 243, 70, 46, 63, 97, 135, 184, 153, 228, 226, 146, // n.F.?a...... + 211, 166, 115, 30, 48, 182, 189, 201, 219, 198, 94, 16, // ..s.0.....^. + 26, 21, 6, 200, 96, 115, 186, 221, 55, 54, 195, 143, // ....`s..76.. + 69, 187, 223, 167, 219, 99, 145, 187, 72, 64, 198, 177, // E....c..H@.. + 185, 149, 198, 228, 180, 171, 145, 153, 44, 47, 228, 29, // ........,/.. + 160, 80, 131, 108, 40, 106, 160, 216, 189, 186, 73, 232, // .P.l(j....I. + 240, 84, 157, 210, 254, 81, 85, 35, 119, 147, 152, 206, // .T...QU#w... + 70, 74, 205, 104, 8, 0, 212, 138, 186, 184, 89, 141, // FJ.h......Y. + 227, 65, 117, 201, 185, 154, 94, 174, 59, 86, 121, 89, // .Au...^.;VyY + 101, 187, 70, 177, 153, 72, 194, 78, 195, 0, 186, 173, // e.F..H.N.... + 232, 166, 94, 150, 75, 170, 112, 89, 119, 239, 245, 159, // ..^.K.pYw... + 177, 160, 230, 94, 63, 219, 118, 187, 155, 50, 130, 251, // ...^?.v..2.. + 45, 252, 30, 249, 189, 9, 152, 222, 196, 128, 224, 155, // -........... + 37, 235, 200, 78, 131, 190, 198, 200, 183, 241, 154, 239, // %..N........ + 2, 129, 1, 124, 5, 121, 4, 52, 21, 173, 76, 131, // ...|.y.4..L. + 204, 145, 129, 169, 158, 41, 234, 241, 101, 217, 122, 10, // .....)..e.z. + 243, 84, 52, 56, 230, 71, 73, 46, 15, 139, 11, 179, // .T48.GI..... + 71, 210, 203, 62, 133, 75, 153, 172, 148, 163, 140, 199, // G..>.K...... + 48, 140, 100, 231, 71, 37, 65, 211, 93, 201, 190, 171, // 0.d.G%A.]... + 77, 123, 13, 186, 47, 188, 70, 113, 186, 130, 51, 100, // M{../.Fq..3d + 21, 165, 223, 50, 32, 142, 246, 82, 150, 221, 136, 246, // ...2 ..R.... + 175, 105, 174, 74, 146, 131, 196, 231, 10, 27, 156, 102, // .i.J.......f + 114, 19, 210, 170, 174, 61, 31, 233, 94, 254, 15, 133, // r....=..^... + 8, 43, 166, 243, 84, 151, 159, 138, 115, 113, 33, 253, // .+..T...sq!. + 85, 38, 187, 226, 7, 108, 129, 31, 227, 104, 135, 22, // U&...l...h.. + 112, 244, 34, 84, 114, 252, 206, 219, 146, 245, 135, 41, // p."Tr......) + 239, 211, 181, 172, 109, 143, 14, 17, 78, 97, 214, 175, // ....m...Na.. + 171, 251, 64, 124, 5, 111, 197, 23, 251, 205, 2, 72, // ..@|.o.....H + 250, 229, 166, 67, 108, 231, 101, 176, 185, 58, 125, 165, // ...Cl.e..:}. + 84, 22, 185, 8, 157, 194, 192, 247, 145, 58, 220, 214, // T........:.. + 170, 254, 118, 38, 126, 93, 241, 117, 113, 6, 164, 187, // ..v&~].uq... + 232, 127, 32, 168, 46, 153, 242, 24, 43, 34, 227, 81, // .. .....+".Q + 170, 59, 153, 136, 234, 248, 213, 21, 127, 34, 243, 47, // .;......."./ + 167, 171, 185, 62, 209, 44, 144, 93, 64, 148, 37, 114, // ...>.,.]@.%r + 222, 154, 224, 30, 205, 242, 230, 192, 248, 110, 89, 251, // .........nY. + 212, 108, 245, 224, 64, 230, 153, 151, 46, 202, 155, 54, // .l..@......6 + 207, 106, 157, 49, 126, 185, 50, 216, 7, 101, 2, 29, // .j.1~.2..e.. + 168, 78, 122, 158, 38, 142, 47, 23, 194, 190, 4, 140, // .Nz.&./..... + 243, 41, 30, 56, 59, 163, 213, 195, 172, 194, 154, 66, // .).8;......B + 215, 37, 221, 90, 14, 99, 170, 34, 67, 107, 159, 89, // .%.Z.c."Ck.Y + 251, 186, 142, 139, 216, 26, 76, 68, 227, 244, 76, 47, // ......LD..L/ + 187, 77, 151, 95, 45, 38, 24, 201, 219, 254, 202, 220, // .M._-&...... + 210, 125, 178, 171, 122, 208, 81, 89, 157, 119, 47, 219, // .}..z.QY.w/. + 54, 29, 148, 197, 144, 253, 168, 142, 20, 147, 111, 45, // 6.........o- + 118, 26, 241, 21, 194, 151, 119, 250, 86, 37, 227, 182, // v.....w.V%.. + 47, 89, 94, 31, 200, 212, 142, 110, 63, 120, 235, 130, // /Y^....n?x.. + 79, 136, 171, 43, 166, 90, 232, 122, 36, 253, 90, 133, // O..+.Z.z$.Z. + 195, 240, 67, 63, 32, 186, 243, 211, 162, 44, 217, 216, // ..C? ....,.. + 191, 38, 170, 224, 35, 10, 224, 122, 47, 90, 19, 204, // .&..#..z/Z.. + 71, 63, 66, 41, 248, 135, 53, 205, 187, 147, 7, 129, // G?B)..5..... + 57, 168, 123, 26, 180, 225, 160, 94, 4, 75, 151, 143, // 9.{....^.K.. + 210, 89, 184, 11, 231, 77, 243, 96, 252, 86, 203, 186, // .Y...M.`.V.. + 48, 73, 219, 147, 104, 41, 79, 87, 11, 115, 202, 62, // 0I..h)OW.s.> + 62, 42, 177, 216, 244, 29, 10, 198, 140, 239, 78, 226, // >*........N. + 40, 241, 130, 202, 247, 233, 31, 7, 58, 11, 7, 81, // (.......:..Q + 26, 242, 174, 106, 87, 209, 41, 39, 68, 252, 127, 231, // ...jW.)'D... + 89, 87, 40, 102, 56, 0, 0, 0 // YW(f8.. }; static const unsigned char v2[] = { - 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| - 101, 120, 40, 63, 58, 115, 124, 103, 124, 110, 124, 112, // ex(?:s|g|n|p - 124, 36, 41, 124, 114, 112, 104, 124, 103, 114, 105, 100, // |$)|rph|grid - 124, 111, 119, 115, 124, 109, 110, 99, 124, 110, 116, 119, // |ows|mnc|ntw - 124, 105, 110, 101, 91, 99, 104, 93, 124, 122, 111, 111, // |ine[ch]|zoo - 124, 94, 111, 114, 100, 124, 105, 116, 101, 114, 97, 47, // |^ord|itera/ - 105, 59, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, // i;function s - 40, 101, 44, 110, 41, 123, 102, 111, 114, 40, 118, 97, // (e,n){for(va - 114, 32, 95, 32, 105, 110, 32, 110, 41, 101, 91, 95, // r _ in n)e[_ - 93, 61, 110, 91, 95, 93, 59, 114, 101, 116, 117, 114, // ]=n[_];retur - 110, 32, 101, 125, 102, 117, 110, 99, 116, 105, 111, 110, // n e}function - 32, 102, 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, // f(e){var n= - 101, 46, 112, 97, 114, 101, 110, 116, 78, 111, 100, 101, // e.parentNode - 59, 110, 38, 38, 110, 46, 114, 101, 109, 111, 118, 101, // ;n&&n.remove - 67, 104, 105, 108, 100, 40, 101, 41, 125, 102, 117, 110, // Child(e)}fun - 99, 116, 105, 111, 110, 32, 97, 40, 110, 44, 95, 44, // ction a(n,_, - 116, 41, 123, 118, 97, 114, 32, 111, 44, 114, 44, 117, // t){var o,r,u - 44, 108, 61, 123, 125, 59, 102, 111, 114, 40, 117, 32, // ,l={};for(u - 105, 110, 32, 95, 41, 34, 107, 101, 121, 34, 61, 61, // in _)"key"== - 117, 63, 111, 61, 95, 91, 117, 93, 58, 34, 114, 101, // u?o=_[u]:"re - 102, 34, 61, 61, 117, 63, 114, 61, 95, 91, 117, 93, // f"==u?r=_[u] - 58, 108, 91, 117, 93, 61, 95, 91, 117, 93, 59, 105, // :l[u]=_[u];i - 102, 40, 97, 114, 103, 117, 109, 101, 110, 116, 115, 46, // f(arguments. - 108, 101, 110, 103, 116, 104, 62, 50, 38, 38, 40, 108, // length>2&&(l - 46, 99, 104, 105, 108, 100, 114, 101, 110, 61, 97, 114, // .children=ar - 103, 117, 109, 101, 110, 116, 115, 46, 108, 101, 110, 103, // guments.leng - 116, 104, 62, 51, 63, 101, 46, 99, 97, 108, 108, 40, // th>3?e.call( - 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 50, 41, // arguments,2) - 58, 116, 41, 44, 34, 102, 117, 110, 99, 116, 105, 111, // :t),"functio - 110, 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, // n"==typeof n - 38, 38, 110, 117, 108, 108, 33, 61, 110, 46, 100, 101, // &&null!=n.de - 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 102, // faultProps)f - 111, 114, 40, 117, 32, 105, 110, 32, 110, 46, 100, 101, // or(u in n.de - 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 118, // faultProps)v - 111, 105, 100, 32, 48, 61, 61, 61, 108, 91, 117, 93, // oid 0===l[u] - 38, 38, 40, 108, 91, 117, 93, 61, 110, 46, 100, 101, // &&(l[u]=n.de - 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 91, 117, // faultProps[u - 93, 41, 59, 114, 101, 116, 117, 114, 110, 32, 112, 40, // ]);return p( - 110, 44, 108, 44, 111, 44, 114, 44, 110, 117, 108, 108, // n,l,o,r,null - 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 112, // )}function p - 40, 101, 44, 116, 44, 111, 44, 114, 44, 117, 41, 123, // (e,t,o,r,u){ - 118, 97, 114, 32, 108, 61, 123, 116, 121, 112, 101, 58, // var l={type: - 101, 44, 112, 114, 111, 112, 115, 58, 116, 44, 107, 101, // e,props:t,ke - 121, 58, 111, 44, 114, 101, 102, 58, 114, 44, 95, 95, // y:o,ref:r,__ - 107, 58, 110, 117, 108, 108, 44, 95, 95, 58, 110, 117, // k:null,__:nu - 108, 108, 44, 95, 95, 98, 58, 48, 44, 95, 95, 101, // ll,__b:0,__e - 58, 110, 117, 108, 108, 44, 95, 95, 100, 58, 118, 111, // :null,__d:vo - 105, 100, 32, 48, 44, 95, 95, 99, 58, 110, 117, 108, // id 0,__c:nul - 108, 44, 95, 95, 104, 58, 110, 117, 108, 108, 44, 99, // l,__h:null,c - 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 58, 118, // onstructor:v - 111, 105, 100, 32, 48, 44, 95, 95, 118, 58, 110, 117, // oid 0,__v:nu - 108, 108, 61, 61, 117, 63, 43, 43, 95, 58, 117, 125, // ll==u?++_:u} - 59, 114, 101, 116, 117, 114, 110, 32, 110, 117, 108, 108, // ;return null - 33, 61, 110, 46, 118, 110, 111, 100, 101, 38, 38, 110, // !=n.vnode&&n - 46, 118, 110, 111, 100, 101, 40, 108, 41, 44, 108, 125, // .vnode(l),l} - 102, 117, 110, 99, 116, 105, 111, 110, 32, 104, 40, 101, // function h(e - 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, 46, 99, // ){return e.c - 104, 105, 108, 100, 114, 101, 110, 125, 102, 117, 110, 99, // hildren}func - 116, 105, 111, 110, 32, 100, 40, 101, 44, 110, 41, 123, // tion d(e,n){ - 116, 104, 105, 115, 46, 112, 114, 111, 112, 115, 61, 101, // this.props=e - 44, 116, 104, 105, 115, 46, 99, 111, 110, 116, 101, 120, // ,this.contex - 116, 61, 110, 125, 102, 117, 110, 99, 116, 105, 111, 110, // t=n}function - 32, 118, 40, 101, 44, 110, 41, 123, 105, 102, 40, 110, // v(e,n){if(n - 117, 108, 108, 61, 61, 110, 41, 114, 101, 116, 117, 114, // ull==n)retur - 110, 32, 101, 46, 95, 95, 63, 118, 40, 101, 46, 95, // n e.__?v(e._ - 95, 44, 101, 46, 95, 95, 46, 95, 95, 107, 46, 105, // _,e.__.__k.i - 110, 100, 101, 120, 79, 102, 40, 101, 41, 43, 49, 41, // ndexOf(e)+1) - 58, 110, 117, 108, 108, 59, 102, 111, 114, 40, 118, 97, // :null;for(va - 114, 32, 95, 59, 110, 60, 101, 46, 95, 95, 107, 46, // r _;n0?p(m. - 116, 121, 112, 101, 44, 109, 46, 112, 114, 111, 112, 115, // type,m.props - 44, 109, 46, 107, 101, 121, 44, 110, 117, 108, 108, 44, // ,m.key,null, - 109, 46, 95, 95, 118, 41, 58, 109, 41, 41, 123, 105, // m.__v):m)){i - 102, 40, 109, 46, 95, 95, 61, 95, 44, 109, 46, 95, // f(m.__=_,m._ - 95, 98, 61, 95, 46, 95, 95, 98, 43, 49, 44, 110, // _b=_.__b+1,n - 117, 108, 108, 61, 61, 61, 40, 121, 61, 72, 91, 97, // ull===(y=H[a - 93, 41, 124, 124, 121, 38, 38, 109, 46, 107, 101, 121, // ])||y&&m.key - 61, 61, 121, 46, 107, 101, 121, 38, 38, 109, 46, 116, // ==y.key&&m.t - 121, 112, 101, 61, 61, 61, 121, 46, 116, 121, 112, 101, // ype===y.type - 41, 72, 91, 97, 93, 61, 118, 111, 105, 100, 32, 48, // )H[a]=void 0 - 59, 101, 108, 115, 101, 32, 102, 111, 114, 40, 100, 61, // ;else for(d= - 48, 59, 100, 60, 69, 59, 100, 43, 43, 41, 123, 105, // 0;d=t.__.len - 103, 116, 104, 38, 38, 116, 46, 95, 95, 46, 112, 117, // gth&&t.__.pu - 115, 104, 40, 123, 125, 41, 44, 116, 46, 95, 95, 91, // sh({}),t.__[ - 101, 93, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // e]}function - 71, 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, // G(e){return - 82, 61, 49, 44, 122, 40, 105, 101, 44, 101, 41, 125, // R=1,z(ie,e)} - 102, 117, 110, 99, 116, 105, 111, 110, 32, 122, 40, 101, // function z(e - 44, 110, 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, // ,n,_){var t= - 106, 40, 76, 43, 43, 44, 50, 41, 59, 114, 101, 116, // j(L++,2);ret - 117, 114, 110, 32, 116, 46, 116, 61, 101, 44, 116, 46, // urn t.t=e,t. - 95, 95, 99, 124, 124, 40, 116, 46, 95, 95, 61, 91, // __c||(t.__=[ - 95, 63, 95, 40, 110, 41, 58, 105, 101, 40, 118, 111, // _?_(n):ie(vo - 105, 100, 32, 48, 44, 110, 41, 44, 102, 117, 110, 99, // id 0,n),func - 116, 105, 111, 110, 40, 101, 41, 123, 118, 97, 114, 32, // tion(e){var - 110, 61, 116, 46, 116, 40, 116, 46, 95, 95, 91, 48, // n=t.t(t.__[0 - 93, 44, 101, 41, 59, 116, 46, 95, 95, 91, 48, 93, // ],e);t.__[0] - 33, 61, 61, 110, 38, 38, 40, 116, 46, 95, 95, 61, // !==n&&(t.__= - 91, 110, 44, 116, 46, 95, 95, 91, 49, 93, 93, 44, // [n,t.__[1]], - 116, 46, 95, 95, 99, 46, 115, 101, 116, 83, 116, 97, // t.__c.setSta - 116, 101, 40, 123, 125, 41, 41, 125, 93, 44, 116, 46, // te({}))}],t. - 95, 95, 99, 61, 78, 41, 44, 116, 46, 95, 95, 125, // __c=N),t.__} - 102, 117, 110, 99, 116, 105, 111, 110, 32, 74, 40, 101, // function J(e - 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, 106, 40, // ,_){var t=j( - 76, 43, 43, 44, 51, 41, 59, 33, 110, 46, 95, 95, // L++,3);!n.__ - 115, 38, 38, 108, 101, 40, 116, 46, 95, 95, 72, 44, // s&&le(t.__H, - 95, 41, 38, 38, 40, 116, 46, 95, 95, 61, 101, 44, // _)&&(t.__=e, - 116, 46, 95, 95, 72, 61, 95, 44, 78, 46, 95, 95, // t.__H=_,N.__ - 72, 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, // H.__h.push(t - 41, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ))}function - 75, 40, 101, 44, 95, 41, 123, 118, 97, 114, 32, 116, // K(e,_){var t - 61, 106, 40, 76, 43, 43, 44, 52, 41, 59, 33, 110, // =j(L++,4);!n - 46, 95, 95, 115, 38, 38, 108, 101, 40, 116, 46, 95, // .__s&&le(t._ - 95, 72, 44, 95, 41, 38, 38, 40, 116, 46, 95, 95, // _H,_)&&(t.__ - 61, 101, 44, 116, 46, 95, 95, 72, 61, 95, 44, 78, // =e,t.__H=_,N - 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, 41, // .__h.push(t) - 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 81, // )}function Q - 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // (e){return R - 61, 53, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =5,Y(functio - 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 123, 99, // n(){return{c - 117, 114, 114, 101, 110, 116, 58, 101, 125, 125, 44, 91, // urrent:e}},[ - 93, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ])}function - 88, 40, 101, 44, 110, 44, 95, 41, 123, 82, 61, 54, // X(e,n,_){R=6 - 44, 75, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, // ,K(function( - 41, 123, 34, 102, 117, 110, 99, 116, 105, 111, 110, 34, // ){"function" - 61, 61, 116, 121, 112, 101, 111, 102, 32, 101, 63, 101, // ==typeof e?e - 40, 110, 40, 41, 41, 58, 101, 38, 38, 40, 101, 46, // (n()):e&&(e. - 99, 117, 114, 114, 101, 110, 116, 61, 110, 40, 41, 41, // current=n()) - 125, 44, 110, 117, 108, 108, 61, 61, 95, 63, 95, 58, // },null==_?_: - 95, 46, 99, 111, 110, 99, 97, 116, 40, 101, 41, 41, // _.concat(e)) - 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 89, 40, // }function Y( - 101, 44, 110, 41, 123, 118, 97, 114, 32, 95, 61, 106, // e,n){var _=j - 40, 76, 43, 43, 44, 55, 41, 59, 114, 101, 116, 117, // (L++,7);retu - 114, 110, 32, 108, 101, 40, 95, 46, 95, 95, 72, 44, // rn le(_.__H, - 110, 41, 38, 38, 40, 95, 46, 95, 95, 61, 101, 40, // n)&&(_.__=e( - 41, 44, 95, 46, 95, 95, 72, 61, 110, 44, 95, 46, // ),_.__H=n,_. - 95, 95, 104, 61, 101, 41, 44, 95, 46, 95, 95, 125, // __h=e),_.__} - 102, 117, 110, 99, 116, 105, 111, 110, 32, 90, 40, 101, // function Z(e - 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // ,n){return R - 61, 56, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =8,Y(functio - 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, // n(){return e - 125, 44, 110, 41, 125, 102, 117, 110, 99, 116, 105, 111, // },n)}functio - 110, 32, 101, 101, 40, 101, 41, 123, 118, 97, 114, 32, // n ee(e){var - 110, 61, 78, 46, 99, 111, 110, 116, 101, 120, 116, 91, // n=N.context[ - 101, 46, 95, 95, 99, 93, 44, 95, 61, 106, 40, 76, // e.__c],_=j(L - 43, 43, 44, 57, 41, 59, 114, 101, 116, 117, 114, 110, // ++,9);return - 32, 95, 46, 99, 61, 101, 44, 110, 63, 40, 110, 117, // _.c=e,n?(nu - 108, 108, 61, 61, 95, 46, 95, 95, 38, 38, 40, 95, // ll==_.__&&(_ - 46, 95, 95, 61, 33, 48, 44, 110, 46, 115, 117, 98, // .__=!0,n.sub - 40, 78, 41, 41, 44, 110, 46, 112, 114, 111, 112, 115, // (N)),n.props - 46, 118, 97, 108, 117, 101, 41, 58, 101, 46, 95, 95, // .value):e.__ - 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 110, 101, // }function ne - 40, 101, 44, 95, 41, 123, 110, 46, 117, 115, 101, 68, // (e,_){n.useD - 101, 98, 117, 103, 86, 97, 108, 117, 101, 38, 38, 110, // ebugValue&&n - 46, 117, 115, 101, 68, 101, 98, 117, 103, 86, 97, 108, // .useDebugVal - 117, 101, 40, 95, 63, 95, 40, 101, 41, 58, 101, 41, // ue(_?_(e):e) - 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 95, 101, // }function _e - 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, 106, 40, // (e){var n=j( - 76, 43, 43, 44, 49, 48, 41, 44, 95, 61, 71, 40, // L++,10),_=G( - 41, 59, 114, 101, 116, 117, 114, 110, 32, 110, 46, 95, // );return n._ - 95, 61, 101, 44, 78, 46, 99, 111, 109, 112, 111, 110, // _=e,N.compon - 101, 110, 116, 68, 105, 100, 67, 97, 116, 99, 104, 124, // entDidCatch| - 124, 40, 78, 46, 99, 111, 109, 112, 111, 110, 101, 110, // |(N.componen - 116, 68, 105, 100, 67, 97, 116, 99, 104, 61, 102, 117, // tDidCatch=fu - 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 110, 46, // nction(e){n. - 95, 95, 38, 38, 110, 46, 95, 95, 40, 101, 41, 44, // __&&n.__(e), - 95, 91, 49, 93, 40, 101, 41, 125, 41, 44, 91, 95, // _[1](e)}),[_ - 91, 48, 93, 44, 102, 117, 110, 99, 116, 105, 111, 110, // [0],function - 40, 41, 123, 95, 91, 49, 93, 40, 118, 111, 105, 100, // (){_[1](void - 32, 48, 41, 125, 93, 125, 102, 117, 110, 99, 116, 105, // 0)}]}functi - 111, 110, 32, 116, 101, 40, 41, 123, 73, 46, 102, 111, // on te(){I.fo - 114, 69, 97, 99, 104, 40, 102, 117, 110, 99, 116, 105, // rEach(functi - 111, 110, 40, 101, 41, 123, 105, 102, 40, 101, 46, 95, // on(e){if(e._ - 95, 80, 41, 116, 114, 121, 123, 101, 46, 95, 95, 72, // _P)try{e.__H - 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach - 40, 114, 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, // (re),e.__H._ - 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, 40, 117, // _h.forEach(u - 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, 95, 104, // e),e.__H.__h - 61, 91, 93, 125, 99, 97, 116, 99, 104, 40, 95, 41, // =[]}catch(_) - 123, 101, 46, 95, 95, 72, 46, 95, 95, 104, 61, 91, // {e.__H.__h=[ - 93, 44, 110, 46, 95, 95, 101, 40, 95, 44, 101, 46, // ],n.__e(_,e. - 95, 95, 118, 41, 125, 125, 41, 44, 73, 61, 91, 93, // __v)}}),I=[] - 125, 110, 46, 95, 95, 98, 61, 102, 117, 110, 99, 116, // }n.__b=funct - 105, 111, 110, 40, 101, 41, 123, 78, 61, 110, 117, 108, // ion(e){N=nul - 108, 44, 79, 38, 38, 79, 40, 101, 41, 125, 44, 110, // l,O&&O(e)},n - 46, 95, 95, 114, 61, 102, 117, 110, 99, 116, 105, 111, // .__r=functio - 110, 40, 101, 41, 123, 86, 38, 38, 86, 40, 101, 41, // n(e){V&&V(e) - 44, 76, 61, 48, 59, 118, 97, 114, 32, 110, 61, 40, // ,L=0;var n=( - 78, 61, 101, 46, 95, 95, 99, 41, 46, 95, 95, 72, // N=e.__c).__H - 59, 110, 38, 38, 40, 110, 46, 95, 95, 104, 46, 102, // ;n&&(n.__h.f - 111, 114, 69, 97, 99, 104, 40, 114, 101, 41, 44, 110, // orEach(re),n - 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach - 40, 117, 101, 41, 44, 110, 46, 95, 95, 104, 61, 91, // (ue),n.__h=[ - 93, 41, 125, 44, 110, 46, 100, 105, 102, 102, 101, 100, // ])},n.diffed - 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, // =function(e) - 123, 113, 38, 38, 113, 40, 101, 41, 59, 118, 97, 114, // {q&&q(e);var - 32, 95, 61, 101, 46, 95, 95, 99, 59, 95, 38, 38, // _=e.__c;_&& - 95, 46, 95, 95, 72, 38, 38, 95, 46, 95, 95, 72, // _.__H&&_.__H - 46, 95, 95, 104, 46, 108, 101, 110, 103, 116, 104, 38, // .__h.length& - 38, 40, 49, 33, 61, 61, 73, 46, 112, 117, 115, 104, // &(1!==I.push - 40, 95, 41, 38, 38, 87, 61, 61, 61, 110, 46, 114, // (_)&&W===n.r - 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, // equestAnimat - 105, 111, 110, 70, 114, 97, 109, 101, 124, 124, 40, 40, // ionFrame||(( - 87, 61, 110, 46, 114, 101, 113, 117, 101, 115, 116, 65, // W=n.requestA - 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, 97, 109, // nimationFram - 101, 41, 124, 124, 102, 117, 110, 99, 116, 105, 111, 110, // e)||function - 40, 101, 41, 123, 118, 97, 114, 32, 110, 44, 95, 61, // (e){var n,_= - 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 123, 99, // function(){c - 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout( - 116, 41, 44, 111, 101, 38, 38, 99, 97, 110, 99, 101, // t),oe&&cance - 108, 65, 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, // lAnimationFr - 97, 109, 101, 40, 110, 41, 44, 115, 101, 116, 84, 105, // ame(n),setTi - 109, 101, 111, 117, 116, 40, 101, 41, 125, 44, 116, 61, // meout(e)},t= - 115, 101, 116, 84, 105, 109, 101, 111, 117, 116, 40, 95, // setTimeout(_ - 44, 49, 48, 48, 41, 59, 111, 101, 38, 38, 40, 110, // ,100);oe&&(n - 61, 114, 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, // =requestAnim - 97, 116, 105, 111, 110, 70, 114, 97, 109, 101, 40, 95, // ationFrame(_ - 41, 41, 125, 41, 40, 116, 101, 41, 41, 44, 78, 61, // ))})(te)),N= - 118, 111, 105, 100, 32, 48, 125, 44, 110, 46, 95, 95, // void 0},n.__ - 99, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // c=function(e - 44, 95, 41, 123, 95, 46, 115, 111, 109, 101, 40, 102, // ,_){_.some(f - 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 116, // unction(e){t - 114, 121, 123, 101, 46, 95, 95, 104, 46, 102, 111, 114, // ry{e.__h.for - 69, 97, 99, 104, 40, 114, 101, 41, 44, 101, 46, 95, // Each(re),e._ - 95, 104, 61, 101, 46, 95, 95, 104, 46, 102, 105, 108, // _h=e.__h.fil - 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ter(function - 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 33, 101, // (e){return!e - 46, 95, 95, 124, 124, 117, 101, 40, 101, 41, 125, 41, // .__||ue(e)}) - 125, 99, 97, 116, 99, 104, 40, 116, 41, 123, 95, 46, // }catch(t){_. - 115, 111, 109, 101, 40, 102, 117, 110, 99, 116, 105, 111, // some(functio - 110, 40, 101, 41, 123, 101, 46, 95, 95, 104, 38, 38, // n(e){e.__h&& - 40, 101, 46, 95, 95, 104, 61, 91, 93, 41, 125, 41, // (e.__h=[])}) - 44, 95, 61, 91, 93, 44, 110, 46, 95, 95, 101, 40, // ,_=[],n.__e( - 116, 44, 101, 46, 95, 95, 118, 41, 125, 125, 41, 44, // t,e.__v)}}), - 66, 38, 38, 66, 40, 101, 44, 95, 41, 125, 44, 110, // B&&B(e,_)},n - 46, 117, 110, 109, 111, 117, 110, 116, 61, 102, 117, 110, // .unmount=fun - 99, 116, 105, 111, 110, 40, 101, 41, 123, 36, 38, 38, // ction(e){$&& - 36, 40, 101, 41, 59, 118, 97, 114, 32, 95, 61, 101, // $(e);var _=e - 46, 95, 95, 99, 59, 105, 102, 40, 95, 38, 38, 95, // .__c;if(_&&_ - 46, 95, 95, 72, 41, 116, 114, 121, 123, 95, 46, 95, // .__H)try{_._ - 95, 72, 46, 95, 95, 46, 102, 111, 114, 69, 97, 99, // _H.__.forEac - 104, 40, 114, 101, 41, 125, 99, 97, 116, 99, 104, 40, // h(re)}catch( - 101, 41, 123, 110, 46, 95, 95, 101, 40, 101, 44, 95, // e){n.__e(e,_ - 46, 95, 95, 118, 41, 125, 125, 59, 118, 97, 114, 32, // .__v)}};var - 111, 101, 61, 34, 102, 117, 110, 99, 116, 105, 111, 110, // oe="function - 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 114, 101, // "==typeof re - 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, 105, // questAnimati - 111, 110, 70, 114, 97, 109, 101, 59, 102, 117, 110, 99, // onFrame;func - 116, 105, 111, 110, 32, 114, 101, 40, 101, 41, 123, 118, // tion re(e){v - 97, 114, 32, 110, 61, 78, 59, 34, 102, 117, 110, 99, // ar n=N;"func - 116, 105, 111, 110, 34, 61, 61, 116, 121, 112, 101, 111, // tion"==typeo - 102, 32, 101, 46, 95, 95, 99, 38, 38, 101, 46, 95, // f e.__c&&e._ - 95, 99, 40, 41, 44, 78, 61, 110, 125, 102, 117, 110, // _c(),N=n}fun - 99, 116, 105, 111, 110, 32, 117, 101, 40, 101, 41, 123, // ction ue(e){ - 118, 97, 114, 32, 110, 61, 78, 59, 101, 46, 95, 95, // var n=N;e.__ - 99, 61, 101, 46, 95, 95, 40, 41, 44, 78, 61, 110, // c=e.__(),N=n - 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 108, 101, // }function le - 40, 101, 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, // (e,n){return - 33, 101, 124, 124, 101, 46, 108, 101, 110, 103, 116, 104, // !e||e.length - 33, 61, 61, 110, 46, 108, 101, 110, 103, 116, 104, 124, // !==n.length| - 124, 110, 46, 115, 111, 109, 101, 40, 102, 117, 110, 99, // |n.some(func - 116, 105, 111, 110, 40, 110, 44, 95, 41, 123, 114, 101, // tion(n,_){re - 116, 117, 114, 110, 32, 110, 33, 61, 61, 101, 91, 95, // turn n!==e[_ - 93, 125, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, // ]})}function - 32, 105, 101, 40, 101, 44, 110, 41, 123, 114, 101, 116, // ie(e,n){ret - 117, 114, 110, 34, 102, 117, 110, 99, 116, 105, 111, 110, // urn"function - 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, 63, // "==typeof n? - 110, 40, 101, 41, 58, 110, 125, 118, 97, 114, 32, 99, // n(e):n}var c - 101, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // e=function(e - 44, 110, 44, 95, 44, 116, 41, 123, 118, 97, 114, 32, // ,n,_,t){var - 111, 59, 110, 91, 48, 93, 61, 48, 59, 102, 111, 114, // o;n[0]=0;for - 40, 118, 97, 114, 32, 114, 61, 49, 59, 114, 60, 110, // (var r=1;r=5&& - 40, 40, 111, 124, 124, 33, 101, 38, 38, 53, 61, 61, // ((o||!e&&5== - 61, 116, 41, 38, 38, 40, 117, 46, 112, 117, 115, 104, // =t)&&(u.push - 40, 116, 44, 48, 44, 111, 44, 95, 41, 44, 116, 61, // (t,0,o,_),t= - 54, 41, 44, 101, 38, 38, 40, 117, 46, 112, 117, 115, // 6),e&&(u.pus - 104, 40, 116, 44, 101, 44, 48, 44, 95, 41, 44, 116, // h(t,e,0,_),t - 61, 54, 41, 41, 44, 111, 61, 34, 34, 125, 44, 105, // =6)),o=""},i - 61, 48, 59, 105, 60, 101, 46, 108, 101, 110, 103, 116, // =0;i"===n?(t=1, - 111, 61, 34, 34, 41, 58, 111, 61, 110, 43, 111, 91, // o=""):o=n+o[ - 48, 93, 58, 114, 63, 110, 61, 61, 61, 114, 63, 114, // 0]:r?n===r?r - 61, 34, 34, 58, 111, 43, 61, 110, 58, 39, 34, 39, // ="":o+=n:'"' - 61, 61, 61, 110, 124, 124, 34, 39, 34, 61, 61, 61, // ===n||"'"=== - 110, 63, 114, 61, 110, 58, 34, 62, 34, 61, 61, 61, // n?r=n:">"=== - 110, 63, 40, 108, 40, 41, 44, 116, 61, 49, 41, 58, // n?(l(),t=1): - 116, 38, 38, 40, 34, 61, 34, 61, 61, 61, 110, 63, // t&&("="===n? - 40, 116, 61, 53, 44, 95, 61, 111, 44, 111, 61, 34, // (t=5,_=o,o=" - 34, 41, 58, 34, 47, 34, 61, 61, 61, 110, 38, 38, // "):"/"===n&& - 40, 116, 60, 53, 124, 124, 34, 62, 34, 61, 61, 61, // (t<5||">"=== - 101, 91, 105, 93, 91, 99, 43, 49, 93, 41, 63, 40, // e[i][c+1])?( - 108, 40, 41, 44, 51, 61, 61, 61, 116, 38, 38, 40, // l(),3===t&&( - 117, 61, 117, 91, 48, 93, 41, 44, 116, 61, 117, 44, // u=u[0]),t=u, - 40, 117, 61, 117, 91, 48, 93, 41, 46, 112, 117, 115, // (u=u[0]).pus - 104, 40, 50, 44, 48, 44, 116, 41, 44, 116, 61, 48, // h(2,0,t),t=0 - 41, 58, 34, 32, 34, 61, 61, 61, 110, 124, 124, 34, // ):" "===n||" - 92, 116, 34, 61, 61, 61, 110, 124, 124, 34, 92, 110, // .t"===n||".n - 34, 61, 61, 61, 110, 124, 124, 34, 92, 114, 34, 61, // "===n||".r"= - 61, 61, 110, 63, 40, 108, 40, 41, 44, 116, 61, 50, // ==n?(l(),t=2 - 41, 58, 111, 43, 61, 110, 41, 44, 51, 61, 61, 61, // ):o+=n),3=== - 116, 38, 38, 34, 33, 45, 45, 34, 61, 61, 61, 111, // t&&"!--"===o - 38, 38, 40, 116, 61, 52, 44, 117, 61, 117, 91, 48, // &&(t=4,u=u[0 - 93, 41, 125, 114, 101, 116, 117, 114, 110, 32, 108, 40, // ])}return l( - 41, 44, 117, 125, 40, 101, 41, 41, 44, 110, 41, 44, // ),u}(e)),n), - 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 91, 93, // arguments,[] - 41, 41, 46, 108, 101, 110, 103, 116, 104, 62, 49, 63, // )).length>1? - 110, 58, 110, 91, 48, 93, 125, 46, 98, 105, 110, 100, // n:n[0]}.bind - 40, 97, 41, 59, 101, 120, 112, 111, 114, 116, 123, 97, // (a);export{a - 32, 97, 115, 32, 104, 44, 102, 101, 32, 97, 115, 32, // as h,fe as - 104, 116, 109, 108, 44, 77, 32, 97, 115, 32, 114, 101, // html,M as re - 110, 100, 101, 114, 44, 100, 32, 97, 115, 32, 67, 111, // nder,d as Co - 109, 112, 111, 110, 101, 110, 116, 44, 70, 32, 97, 115, // mponent,F as - 32, 99, 114, 101, 97, 116, 101, 67, 111, 110, 116, 101, // createConte - 120, 116, 44, 71, 32, 97, 115, 32, 117, 115, 101, 83, // xt,G as useS - 116, 97, 116, 101, 44, 122, 32, 97, 115, 32, 117, 115, // tate,z as us - 101, 82, 101, 100, 117, 99, 101, 114, 44, 74, 32, 97, // eReducer,J a - 115, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // s useEffect, - 75, 32, 97, 115, 32, 117, 115, 101, 76, 97, 121, 111, // K as useLayo - 117, 116, 69, 102, 102, 101, 99, 116, 44, 81, 32, 97, // utEffect,Q a - 115, 32, 117, 115, 101, 82, 101, 102, 44, 88, 32, 97, // s useRef,X a - 115, 32, 117, 115, 101, 73, 109, 112, 101, 114, 97, 116, // s useImperat - 105, 118, 101, 72, 97, 110, 100, 108, 101, 44, 89, 32, // iveHandle,Y - 97, 115, 32, 117, 115, 101, 77, 101, 109, 111, 44, 90, // as useMemo,Z - 32, 97, 115, 32, 117, 115, 101, 67, 97, 108, 108, 98, // as useCallb - 97, 99, 107, 44, 101, 101, 32, 97, 115, 32, 117, 115, // ack,ee as us - 101, 67, 111, 110, 116, 101, 120, 116, 44, 110, 101, 32, // eContext,ne - 97, 115, 32, 117, 115, 101, 68, 101, 98, 117, 103, 86, // as useDebugV - 97, 108, 117, 101, 44, 95, 101, 32, 97, 115, 32, 117, // alue,_e as u - 115, 101, 69, 114, 114, 111, 114, 66, 111, 117, 110, 100, // seErrorBound - 97, 114, 121, 125, 59, 10, 0 // ary};. + 31, 139, 8, 8, 16, 107, 222, 99, 0, 3, 112, 114, // .....k.c..pr + 101, 97, 99, 116, 46, 109, 105, 110, 46, 106, 115, 0, // eact.min.js. + 157, 91, 123, 119, 219, 182, 146, 255, 127, 63, 69, 164, // .[{w.....?E. + 211, 163, 18, 43, 68, 177, 147, 182, 187, 75, 5, 213, // ...+D....K.. + 105, 29, 183, 238, 109, 234, 230, 38, 105, 123, 123, 85, // i...m..&i{{U + 93, 30, 138, 132, 44, 214, 20, 169, 242, 97, 91, 53, // ]...,....a[5 + 245, 221, 247, 55, 3, 128, 164, 108, 185, 247, 236, 158, // ...7...l.... + 36, 34, 30, 131, 1, 48, 47, 204, 12, 144, 155, 176, // $"...0/..... + 120, 166, 101, 38, 3, 89, 201, 92, 22, 178, 150, 169, // x.e&.Y...... + 186, 223, 203, 68, 205, 23, 50, 82, 47, 194, 40, 169, // ...D..2R/.(. + 26, 125, 231, 205, 252, 178, 185, 106, 178, 102, 219, 124, // .}.....j.f.| + 34, 154, 98, 187, 110, 174, 138, 36, 110, 242, 219, 178, // ".b.n..$n... + 217, 100, 81, 147, 85, 183, 77, 146, 233, 121, 180, 94, // .dQ.U.M..y.^ + 52, 127, 230, 121, 243, 175, 188, 136, 155, 164, 210, 69, // 4..y.......E + 248, 34, 153, 174, 234, 44, 170, 146, 60, 123, 86, 122, // ."...,..<{Vz + 152, 72, 220, 175, 242, 194, 187, 193, 172, 193, 179, 36, // .H.........$ + 123, 150, 9, 61, 15, 22, 42, 195, 207, 180, 208, 85, // {..=..*....U + 93, 100, 207, 244, 190, 29, 177, 242, 180, 184, 39, 216, // ]d........'. + 76, 233, 201, 54, 44, 116, 86, 93, 230, 177, 158, 102, // L..6,tV]...f + 163, 81, 54, 41, 244, 38, 191, 209, 103, 235, 36, 141, // .Q6).&..g.$. + 1, 214, 13, 10, 61, 222, 141, 25, 216, 109, 105, 74, // ....=....miJ + 243, 214, 52, 103, 32, 134, 215, 122, 55, 84, 170, 158, // ..4g ..z7T.. + 229, 42, 152, 215, 11, 127, 88, 232, 21, 215, 11, 83, // .*....X....S + 79, 241, 195, 165, 105, 178, 242, 194, 226, 170, 222, 96, // O...i......` + 230, 114, 146, 234, 236, 170, 90, 127, 249, 114, 52, 242, // .r....Z..r4. + 210, 73, 68, 19, 99, 69, 234, 81, 255, 171, 153, 158, // .ID.cE.Q.... + 68, 97, 154, 118, 35, 229, 75, 225, 87, 66, 14, 221, // Da.v#.K.WB.. + 26, 49, 87, 181, 219, 234, 124, 245, 140, 118, 82, 167, // .1W...|..vR. + 233, 64, 101, 147, 88, 175, 194, 58, 173, 222, 21, 249, // .@e.X..:.... + 182, 20, 237, 98, 31, 180, 223, 228, 73, 252, 236, 68, // ...b....I..D + 41, 69, 75, 164, 117, 208, 74, 15, 97, 208, 34, 28, // )EK.u.J.a.". + 45, 183, 160, 69, 202, 124, 165, 89, 122, 68, 218, 130, // -..E.|.YzD.. + 23, 150, 225, 134, 80, 32, 17, 45, 201, 215, 114, 75, // ....P .-..rK + 72, 252, 74, 130, 70, 62, 0, 244, 202, 47, 100, 16, // H.J.F>.../d. + 92, 251, 132, 1, 5, 247, 93, 250, 39, 248, 213, 174, // ......].'... + 26, 251, 102, 105, 40, 70, 174, 109, 109, 10, 81, 158, // ..fi(F.mm.Q. + 149, 85, 81, 71, 85, 94, 116, 64, 55, 220, 71, 52, // .UQGU^t@7.G4 + 31, 143, 3, 191, 222, 187, 21, 59, 106, 220, 100, 96, // .......;j.d` + 52, 177, 153, 11, 94, 42, 100, 218, 173, 126, 77, 114, // 4...^*d..~Mr + 225, 196, 165, 229, 68, 215, 31, 27, 73, 171, 214, 73, // ....D...I..I + 57, 225, 237, 40, 236, 150, 42, 88, 74, 165, 239, 42, // 9..(..*XJ..* + 213, 131, 189, 49, 176, 96, 180, 89, 80, 38, 90, 196, // ...1.`.YP&Z. + 65, 48, 67, 47, 62, 146, 126, 240, 247, 122, 146, 100, // A0C/>.~..z.d + 177, 190, 251, 145, 228, 114, 124, 42, 120, 11, 211, 86, // .....r|*x..V + 158, 167, 217, 107, 205, 64, 70, 14, 166, 217, 120, 44, // ...k.@F...x, + 44, 218, 129, 242, 2, 197, 157, 243, 108, 33, 28, 207, // ,.......l!.. + 9, 165, 118, 211, 113, 197, 82, 225, 136, 160, 232, 9, // ..v.q.R..... + 21, 104, 61, 102, 218, 110, 3, 187, 86, 73, 100, 48, // .h=f.n..VId0 + 237, 230, 211, 60, 95, 59, 23, 85, 34, 163, 124, 84, // ...<_;.U".|T + 52, 189, 209, 100, 25, 150, 90, 49, 151, 50, 117, 242, // 4..d..Z1.2u. + 255, 220, 192, 253, 35, 132, 102, 47, 203, 66, 135, 215, // ....#.f/.B.. + 123, 187, 61, 90, 229, 190, 91, 244, 134, 22, 237, 13, // {.=Z..[..... + 104, 76, 12, 49, 230, 175, 26, 156, 0, 115, 53, 217, // hL.1.....s5. + 214, 37, 49, 120, 52, 26, 92, 161, 185, 24, 143, 155, // .%1x4....... + 166, 24, 40, 150, 242, 101, 14, 4, 250, 189, 6, 23, // ..(..e...... + 138, 36, 187, 2, 140, 231, 21, 71, 123, 154, 38, 23, // .$.....G{.&. + 222, 85, 79, 226, 175, 188, 206, 244, 232, 41, 99, 86, // .UO......)cV + 149, 219, 169, 208, 40, 151, 121, 81, 121, 14, 222, 72, // ....(.yQy..H + 69, 79, 20, 110, 240, 111, 249, 60, 115, 165, 189, 144, // EO.n.o...D....J. + 208, 20, 246, 246, 155, 230, 206, 193, 99, 113, 128, 35, // ........cq.# + 225, 8, 58, 208, 64, 0, 99, 64, 59, 199, 20, 248, // ..:.@.c@;... + 28, 194, 83, 135, 216, 59, 57, 25, 230, 142, 124, 163, // ..S..;9...|. + 209, 48, 51, 229, 211, 133, 128, 11, 2, 250, 227, 104, // .03........h + 167, 168, 100, 155, 134, 145, 246, 94, 156, 133, 91, 176, // ..d....^..[. + 71, 127, 242, 130, 166, 132, 61, 67, 95, 149, 191, 205, // G.....=C_... + 111, 117, 113, 6, 23, 201, 19, 152, 89, 207, 30, 180, // ouq.....Y... + 77, 202, 52, 193, 88, 68, 11, 89, 91, 132, 22, 164, // M.4.XD.Y[... + 176, 163, 248, 69, 16, 195, 181, 121, 54, 46, 16, 158, // ...E...y6... + 200, 96, 86, 53, 13, 4, 47, 142, 207, 111, 32, 139, // .`V5../..o . + 111, 147, 178, 210, 240, 5, 192, 202, 98, 246, 193, 63, // o.......b..? + 135, 152, 192, 54, 153, 40, 233, 41, 128, 86, 1, 134, // ...6.(.).V.. + 113, 152, 93, 233, 34, 175, 203, 116, 247, 65, 87, 223, // q.]."..t.AW. + 101, 128, 187, 248, 248, 195, 91, 50, 134, 198, 59, 206, // e.....[2..;. + 197, 193, 246, 238, 32, 96, 215, 243, 11, 127, 189, 192, // .... `...... + 6, 215, 67, 209, 245, 148, 151, 225, 134, 183, 93, 14, // ..C.......]. + 123, 248, 215, 20, 98, 17, 50, 16, 46, 197, 66, 92, // {...b.2...B. + 25, 108, 216, 184, 114, 21, 46, 191, 35, 255, 218, 213, // .l..r...#... + 99, 248, 54, 105, 30, 198, 182, 206, 220, 210, 162, 42, // c.6i.......* + 118, 247, 15, 5, 53, 152, 90, 101, 217, 71, 97, 21, // v...5.Ze.Ga. + 113, 120, 176, 63, 102, 66, 65, 72, 235, 185, 66, 136, // qx.?fBAH..B. + 6, 167, 3, 214, 249, 97, 216, 99, 106, 209, 50, 213, // .....a.cj.2. + 40, 200, 87, 21, 196, 111, 89, 87, 218, 106, 136, 37, // (.W..oYW.j.% + 104, 175, 89, 244, 253, 218, 115, 154, 154, 67, 141, 116, // h.Y...s..C.t + 110, 92, 246, 241, 224, 116, 225, 101, 19, 77, 28, 152, // n....t.e.M.. + 217, 47, 57, 241, 253, 144, 245, 195, 145, 81, 39, 255, // ./9......Q'. + 118, 20, 29, 203, 189, 176, 93, 38, 50, 50, 90, 183, // v.....]&22Z. + 146, 161, 220, 202, 27, 235, 155, 45, 229, 25, 121, 103, // .......-..yg + 240, 200, 204, 9, 114, 96, 27, 131, 73, 47, 58, 19, // ....r`..I/:. + 189, 24, 108, 106, 232, 68, 254, 220, 26, 180, 138, 76, // ..lj.D.....L + 9, 38, 204, 156, 91, 21, 27, 101, 42, 175, 77, 248, // .&..[..e*.M. + 80, 171, 121, 130, 131, 222, 91, 177, 153, 93, 194, 172, // P.y...[..].. + 145, 146, 77, 153, 89, 108, 2, 30, 115, 227, 156, 229, // ..M.Yl..s... + 138, 252, 31, 227, 45, 157, 41, 140, 62, 119, 49, 218, // ....-.).>w1. + 71, 242, 73, 70, 163, 124, 190, 34, 183, 0, 135, 145, // G.IF.|.".... + 90, 205, 206, 102, 103, 6, 214, 28, 185, 62, 117, 33, // Z..fg....>u! + 70, 165, 197, 68, 179, 43, 133, 19, 141, 86, 100, 214, // F..D.+...Vd. + 26, 145, 255, 172, 66, 252, 156, 251, 222, 16, 163, 170, // ....B....... + 156, 230, 29, 66, 134, 206, 71, 163, 243, 73, 219, 2, // ...B..G..I.. + 142, 82, 208, 48, 51, 67, 67, 149, 233, 91, 176, 113, // .R.03CC..[.q + 41, 239, 132, 239, 245, 219, 98, 110, 147, 97, 159, 98, // ).....bn.a.b + 234, 28, 117, 51, 94, 125, 37, 228, 217, 104, 116, 54, // ..u3^}%..ht6 + 41, 235, 165, 23, 18, 156, 137, 60, 151, 40, 149, 85, // )......<.(.U + 88, 105, 200, 158, 45, 177, 34, 135, 109, 48, 122, 39, // Xi..-.".m0z' + 105, 149, 153, 202, 229, 150, 215, 75, 129, 16, 55, 173, // i......K..7. + 217, 119, 50, 98, 78, 117, 248, 20, 30, 127, 149, 69, // .w2bNu.....E + 228, 220, 164, 243, 201, 149, 174, 222, 32, 240, 185, 209, // ........ ... + 241, 7, 234, 248, 166, 200, 55, 156, 12, 104, 71, 184, // ......7..hG. + 33, 109, 3, 71, 25, 92, 132, 117, 42, 77, 163, 124, // !m.G...u*M.| + 26, 145, 183, 116, 192, 66, 222, 40, 187, 57, 248, 132, // ...t.B.(.9.. + 22, 173, 220, 10, 179, 206, 191, 90, 138, 89, 44, 109, // .......Z.Y,m + 124, 179, 205, 51, 72, 244, 47, 73, 154, 254, 128, 192, // |..3H./I.... + 13, 6, 248, 88, 171, 231, 246, 215, 235, 124, 147, 196, // ...X.....|.. + 237, 8, 80, 200, 248, 142, 71, 250, 69, 123, 128, 252, // ..P...G.E{.. + 251, 117, 45, 161, 8, 55, 79, 44, 239, 189, 142, 52, // .u-..7O,...4 + 198, 88, 200, 191, 232, 52, 210, 49, 8, 141, 83, 230, // .X...4.1..S. + 112, 149, 235, 188, 78, 227, 51, 55, 232, 167, 109, 204, // p...N.37..m. + 60, 24, 156, 42, 245, 84, 175, 163, 52, 208, 53, 77, // <..*.T..4.5M + 192, 65, 160, 98, 137, 190, 17, 247, 143, 132, 202, 200, // .A.b........ + 5, 43, 226, 205, 192, 130, 89, 22, 67, 140, 78, 5, // .+....Y.C.N. + 163, 186, 161, 195, 226, 129, 218, 94, 115, 249, 218, 148, // .......^s... + 39, 176, 194, 231, 33, 236, 102, 63, 140, 213, 54, 46, // '...!.f?..6. + 87, 129, 216, 27, 60, 107, 235, 166, 140, 70, 169, 165, // W...i........ + 117, 155, 249, 75, 196, 194, 174, 156, 164, 71, 155, 51, // u..K.....G.3 + 184, 239, 2, 188, 161, 38, 113, 79, 189, 17, 37, 48, // .....&qO..%0 + 241, 65, 60, 163, 197, 163, 84, 17, 128, 248, 120, 100, // .A<...T...xd + 2, 174, 237, 116, 199, 83, 74, 54, 161, 76, 154, 216, // ...t.SJ6.L.. + 237, 160, 157, 159, 109, 195, 190, 159, 180, 185, 245, 250, // ....m....... + 41, 155, 214, 49, 40, 217, 49, 88, 131, 118, 70, 140, // )..1(.1X.vF. + 227, 246, 236, 221, 89, 231, 64, 110, 16, 163, 176, 215, // ....Y.@n.... + 125, 67, 46, 183, 218, 113, 222, 106, 112, 226, 84, 180, // }C...q.jp.T. + 102, 191, 121, 186, 121, 93, 187, 144, 101, 99, 50, 56, // f.y.y]..ec28 + 136, 109, 235, 249, 134, 67, 189, 146, 60, 40, 136, 232, // .m...C..<(.. + 110, 6, 127, 38, 199, 194, 201, 33, 4, 42, 255, 21, // n..&...!.*.. + 194, 226, 9, 165, 115, 249, 108, 23, 216, 129, 42, 37, // ....s.l...*% + 141, 50, 177, 146, 201, 57, 244, 18, 177, 157, 245, 86, // .2...9.....V + 59, 231, 155, 196, 121, 196, 57, 245, 73, 4, 232, 74, // ;...y.9.I..J + 147, 247, 79, 65, 152, 23, 139, 105, 166, 138, 217, 131, // ..OA...i.... + 110, 155, 20, 187, 252, 0, 7, 180, 170, 182, 254, 139, // n........... + 23, 183, 183, 183, 147, 219, 87, 147, 188, 184, 122, 241, // ......W...z. + 242, 228, 228, 228, 5, 237, 19, 234, 226, 31, 31, 232, // ............ + 237, 100, 12, 69, 24, 141, 98, 23, 209, 201, 136, 100, // .d.E..b....d + 181, 191, 176, 53, 126, 99, 196, 69, 196, 107, 168, 95, // ...5~c.E.k._ + 104, 170, 158, 173, 196, 221, 65, 84, 147, 92, 91, 78, // h.....AT..[N + 102, 70, 231, 104, 233, 37, 116, 64, 121, 45, 83, 154, // fF.h.%t@y-S. + 38, 21, 147, 39, 188, 113, 56, 8, 241, 147, 125, 131, // &..'.q8...}. + 168, 37, 152, 227, 211, 154, 174, 114, 136, 163, 155, 215, // .%.....r.... + 217, 36, 116, 46, 107, 217, 103, 221, 122, 222, 239, 1, // .$t.k.g.z... + 47, 38, 25, 184, 69, 119, 10, 135, 173, 236, 112, 77, // /&..Ew....pM + 61, 216, 166, 144, 120, 188, 37, 85, 30, 141, 182, 36, // =...x.%U...$ + 179, 213, 198, 250, 39, 84, 106, 154, 174, 13, 72, 18, // ....'Tj...H. + 183, 60, 193, 36, 105, 171, 106, 219, 13, 134, 7, 142, // .<.$i.j..... + 8, 137, 104, 218, 79, 190, 30, 134, 145, 180, 155, 194, // ..h.O....... + 94, 222, 56, 107, 69, 242, 137, 88, 220, 94, 230, 112, // ^.8kE..X.^.p + 88, 206, 55, 38, 77, 67, 113, 168, 185, 242, 64, 252, // X.7&MCq...@. + 86, 44, 160, 159, 29, 130, 76, 228, 20, 118, 56, 111, // V,....L..v8o + 180, 13, 109, 51, 0, 2, 217, 211, 200, 135, 76, 2, // ..m3......L. + 87, 137, 214, 58, 186, 214, 177, 173, 210, 44, 28, 55, // W..:.....,.7 + 16, 14, 59, 59, 77, 108, 103, 223, 67, 29, 99, 185, // ..;;Mlg.C.c. + 70, 43, 172, 230, 86, 184, 100, 104, 27, 29, 109, 156, // F+..V.dh..m. + 30, 182, 150, 24, 118, 56, 147, 143, 50, 145, 27, 31, // ....v8..2... + 172, 112, 138, 109, 130, 39, 157, 92, 101, 63, 46, 127, // .p.m.'..e?.. + 215, 17, 71, 84, 59, 214, 246, 122, 86, 35, 152, 241, // ..GT;..zV#.. + 43, 147, 9, 163, 60, 16, 244, 55, 58, 84, 225, 141, // +...<..7:T.. + 234, 52, 184, 203, 62, 145, 50, 146, 161, 100, 85, 158, // .4..>.2..dU. + 194, 44, 122, 118, 215, 32, 92, 12, 84, 46, 108, 192, // .,zv. ..T.l. + 240, 216, 136, 4, 9, 195, 134, 147, 44, 92, 5, 101, // ........,..e + 176, 145, 171, 66, 151, 165, 53, 31, 131, 13, 64, 46, // ...B..5...@. + 176, 27, 139, 9, 49, 201, 218, 192, 74, 242, 79, 90, // ....1...J.OZ + 66, 30, 155, 193, 246, 81, 234, 146, 167, 176, 117, 139, // B....Q....u. + 207, 141, 100, 140, 182, 66, 56, 197, 254, 113, 162, 232, // ..d..B8..q.. + 163, 181, 211, 108, 113, 143, 93, 175, 204, 180, 199, 225, // ...lq.]..... + 93, 84, 23, 148, 216, 81, 193, 99, 59, 123, 96, 229, // ]T...Q.c;{`. + 127, 114, 8, 237, 45, 35, 223, 188, 76, 234, 108, 99, // .r..-#..L.lc + 156, 211, 182, 8, 4, 146, 83, 97, 38, 59, 234, 229, // ......Sa&;.. + 110, 6, 132, 54, 174, 72, 25, 36, 154, 163, 105, 62, // n..6.H.$..i> + 82, 10, 140, 197, 182, 77, 129, 218, 60, 90, 100, 18, // R....M.......| + 163, 48, 87, 7, 57, 241, 128, 239, 43, 140, 99, 193, // .0W.9...+.c. + 151, 222, 239, 160, 46, 129, 242, 6, 208, 175, 28, 29, // ............ + 130, 117, 53, 244, 214, 134, 47, 243, 0, 17, 89, 77, // .u5.../...YM + 121, 240, 180, 187, 132, 169, 30, 93, 194, 240, 232, 217, // y......].... + 60, 95, 248, 181, 153, 170, 154, 172, 146, 162, 52, 190, // <_........4. + 158, 187, 30, 174, 250, 103, 128, 185, 167, 73, 236, 200, // .....g...I.. + 28, 227, 106, 162, 213, 193, 64, 74, 252, 189, 241, 146, // ..j...@J.... + 3, 50, 124, 99, 46, 170, 248, 2, 82, 221, 243, 229, // .2|c....R... + 171, 26, 226, 115, 54, 28, 215, 227, 49, 221, 215, 106, // ...s6...1..j + 9, 231, 178, 196, 225, 86, 248, 79, 92, 110, 57, 163, // .....V.O.n9. + 227, 101, 98, 47, 17, 204, 220, 36, 241, 1, 176, 69, // .eb/...$...E + 47, 171, 105, 159, 53, 15, 92, 87, 216, 10, 119, 129, // /.i.5..W..w. + 133, 240, 150, 242, 51, 4, 37, 143, 129, 170, 158, 31, // ....3.%..... + 239, 48, 238, 13, 228, 209, 136, 72, 245, 151, 210, 93, // .0.....H...] + 234, 26, 43, 194, 202, 195, 37, 114, 26, 217, 115, 66, // ..+...%r..sB + 8, 96, 177, 213, 203, 131, 177, 129, 187, 91, 156, 186, // .`.......[.. + 71, 5, 199, 84, 102, 122, 188, 185, 191, 106, 76, 180, // G..Tfz...jL. + 229, 252, 92, 208, 187, 17, 150, 48, 103, 252, 50, 129, // .......0g.2. + 185, 75, 215, 157, 36, 240, 237, 237, 116, 123, 197, 29, // .K..$...t{.. + 76, 28, 141, 57, 186, 154, 56, 246, 244, 51, 31, 176, // L..9..8..3.. + 63, 112, 65, 77, 18, 80, 102, 196, 88, 253, 128, 123, // ?pAM.Pf.X..{ + 237, 181, 51, 105, 193, 52, 227, 88, 102, 202, 158, 88, // ..3i.4.Xf..X + 192, 229, 136, 46, 80, 233, 164, 97, 227, 64, 237, 213, // ....P..a.@.. + 131, 108, 143, 139, 82, 171, 99, 161, 241, 121, 81, 228, // .l..R.c..yQ. + 5, 59, 195, 37, 162, 12, 106, 245, 158, 134, 195, 102, // .;.%..j....f + 133, 204, 205, 253, 131, 179, 91, 193, 65, 128, 118, 70, // ......[.A.vF + 54, 136, 209, 61, 106, 37, 202, 181, 99, 243, 254, 117, // 6..=j%..c..u + 248, 121, 107, 133, 177, 95, 173, 178, 125, 181, 46, 242, // .yk.._..}... + 91, 4, 155, 123, 104, 232, 9, 60, 179, 46, 135, 227, // [..{h..<.... + 22, 169, 14, 137, 100, 238, 229, 3, 27, 9, 177, 76, // ....d......L + 112, 26, 197, 149, 72, 121, 89, 80, 104, 236, 204, 181, // p...HyYPh... + 250, 174, 96, 146, 36, 29, 196, 209, 235, 39, 142, 147, // ..`.$....'.. + 149, 54, 65, 29, 226, 200, 78, 64, 65, 20, 116, 150, // .6A...N@A.t. + 198, 251, 183, 215, 240, 237, 220, 20, 166, 103, 109, 205, // .........gm. + 6, 184, 153, 144, 27, 143, 154, 112, 136, 29, 236, 15, // .......p.... + 220, 142, 244, 83, 218, 96, 144, 217, 162, 166, 236, 145, // ...S.`...... + 126, 136, 88, 63, 133, 216, 38, 175, 214, 230, 54, 59, // ~.X?..&...6; + 63, 102, 46, 33, 173, 155, 164, 212, 51, 251, 237, 13, // ?f.!....3... + 174, 214, 58, 155, 44, 161, 1, 158, 235, 195, 193, 159, // ..:.,....... + 167, 55, 26, 113, 172, 15, 150, 124, 76, 54, 58, 175, // .7.q...|L6:. + 43, 105, 110, 219, 79, 96, 144, 79, 88, 243, 222, 202, // +in.O`.OX... + 75, 249, 139, 124, 143, 150, 239, 104, 214, 31, 77, 206, // K..|...h..M. + 80, 254, 108, 2, 114, 249, 71, 27, 181, 201, 175, 141, // P.l.r.G..... + 44, 203, 79, 84, 123, 162, 118, 15, 138, 126, 239, 34, // ,.OT{.v..~." + 173, 181, 177, 251, 107, 239, 82, 106, 249, 30, 14, 153, // ....k.Rj.... + 32, 244, 60, 89, 165, 46, 209, 115, 1, 251, 196, 95, // ..!.....m. + 15, 231, 22, 225, 143, 241, 161, 219, 51, 136, 146, 154, // ........3... + 237, 176, 146, 195, 16, 134, 160, 231, 74, 18, 93, 88, // ........J.]X + 167, 169, 242, 88, 109, 146, 160, 4, 68, 65, 93, 127, // ...Xm...DA]. + 14, 199, 25, 230, 26, 220, 73, 56, 226, 67, 89, 208, // ......I8.CY. + 79, 173, 232, 72, 74, 15, 160, 233, 246, 144, 159, 193, // O..HJ....... + 0, 95, 174, 242, 238, 237, 197, 191, 126, 43, 255, 243, // ._......~+.. + 183, 12, 63, 141, 43, 124, 242, 226, 138, 31, 160, 136, // ..?.+|...... + 89, 109, 54, 141, 224, 0, 81, 22, 229, 226, 29, 138, // Ym6...Q..... + 92, 204, 60, 219, 249, 138, 59, 177, 130, 151, 194, 127, // ..<...;..... + 105, 32, 134, 147, 201, 132, 82, 121, 57, 84, 196, 225, // i ....Ry9T.. + 248, 12, 96, 39, 45, 4, 122, 6, 109, 215, 231, 242, // ..`'-.z.m... + 68, 194, 71, 192, 12, 213, 151, 234, 115, 122, 159, 155, // D.G.....sz.. + 55, 205, 0, 166, 145, 88, 95, 145, 163, 99, 1, 43, // 7....X_..c.+ + 0, 230, 28, 47, 169, 47, 56, 78, 234, 58, 128, 220, // ..././8N.:.. + 117, 8, 166, 196, 158, 159, 78, 37, 175, 117, 247, 78, // u.....N%.u.N + 138, 222, 54, 210, 97, 97, 150, 144, 66, 33, 83, 47, // ..6.aa..B!S/ + 17, 162, 21, 241, 8, 3, 162, 215, 122, 158, 44, 220, // ........z.,. + 152, 8, 99, 16, 242, 163, 101, 14, 167, 135, 7, 206, // ..c...e..... + 134, 175, 249, 185, 199, 204, 35, 4, 160, 116, 13, 215, // ......#..t.. + 88, 189, 18, 126, 62, 86, 25, 75, 52, 64, 158, 63, // X..~>V.K4@.? + 183, 219, 31, 126, 105, 129, 29, 131, 0, 167, 178, 113, // ...~i......q + 78, 185, 214, 98, 150, 81, 38, 120, 70, 44, 51, 163, // N..b.Q&xF,3. + 63, 29, 126, 106, 238, 65, 134, 159, 154, 97, 5, 26, // ?.~j.A...a.. + 91, 20, 52, 31, 208, 128, 74, 244, 216, 79, 181, 136, // [.4...J..O.. + 63, 135, 205, 205, 45, 242, 225, 11, 110, 38, 167, 248, // ?...-...n&.. + 245, 231, 192, 195, 99, 205, 250, 199, 244, 62, 133, 145, // ....c....>.. + 56, 62, 214, 138, 114, 190, 132, 180, 150, 174, 98, 232, // 8>..r.....b. + 249, 18, 212, 172, 168, 3, 28, 27, 62, 27, 218, 69, // ........>..E + 253, 86, 181, 165, 172, 45, 21, 7, 171, 123, 105, 232, // .V...-...{i. + 208, 206, 49, 28, 180, 164, 192, 74, 63, 147, 118, 22, // ..1....J?.v. + 167, 67, 76, 194, 61, 167, 2, 48, 166, 251, 191, 15, // .CL.=..0.... + 56, 74, 132, 251, 175, 17, 167, 179, 204, 39, 189, 220, // 8J.......'.. + 155, 168, 49, 20, 83, 125, 183, 205, 139, 234, 62, 124, // ..1.S}....>| + 22, 150, 207, 214, 208, 60, 254, 86, 155, 84, 254, 64, // .....<.V.T.@ + 37, 19, 157, 202, 152, 202, 109, 82, 72, 126, 67, 85, // %.....mRH~CU + 115, 79, 99, 51, 74, 242, 91, 106, 130, 91, 201, 81, // sOc3J.[j.[.Q + 142, 252, 211, 214, 222, 235, 184, 142, 48, 254, 111, 182, // ........0.o. + 126, 14, 239, 36, 170, 228, 247, 182, 250, 54, 220, 225, // ~..$.....6.. + 252, 182, 141, 127, 111, 199, 172, 228, 63, 108, 249, 187, // ....o...?l.. + 205, 86, 23, 56, 84, 110, 244, 69, 152, 197, 169, 150, // .V.8Tn.E.... + 191, 218, 142, 31, 244, 38, 151, 255, 180, 149, 179, 48, // .....&.....0 + 77, 151, 97, 116, 45, 181, 118, 45, 118, 85, 153, 107, // M.at-.v-vU.k + 232, 188, 93, 25, 184, 54, 206, 156, 124, 141, 179, 51, // ..]..6..|..3 + 14, 139, 221, 126, 250, 31, 255, 11, 22, 19, 178, 116, // ...~.......t + 138, 51, 0, 0, 0 // .3.. }; static const unsigned char v3[] = { - 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, 118, 97, 114, 32, // n.js';..var - 100, 101, 118, 97, 100, 100, 114, 32, 61, 32, 34, 97, // devaddr = "a - 100, 100, 114, 101, 115, 115, 58, 112, 111, 114, 116, 34, // ddress:port" - 59, 10, 10, 99, 111, 110, 115, 116, 32, 77, 97, 120, // ;..const Max - 77, 101, 116, 114, 105, 99, 115, 68, 97, 116, 97, 80, // MetricsDataP - 111, 105, 110, 116, 115, 32, 61, 32, 53, 48, 59, 10, // oints = 50;. - 10, 47, 47, 32, 84, 104, 105, 115, 32, 115, 105, 109, // .// This sim - 112, 108, 101, 32, 112, 117, 98, 108, 105, 115, 104, 47, // ple publish/ - 115, 117, 98, 115, 99, 114, 105, 98, 101, 32, 105, 115, // subscribe is - 32, 117, 115, 101, 100, 32, 116, 111, 32, 112, 97, 115, // used to pas - 115, 32, 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, // s notificati - 111, 110, 115, 32, 116, 104, 97, 116, 32, 119, 101, 114, // ons that wer - 101, 10, 47, 47, 32, 114, 101, 99, 101, 105, 118, 101, // e.// receive - 100, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 115, // d from the s - 101, 114, 118, 101, 114, 44, 32, 116, 111, 32, 97, 108, // erver, to al - 108, 32, 99, 104, 105, 108, 100, 32, 99, 111, 109, 112, // l child comp - 111, 110, 101, 110, 116, 115, 32, 111, 102, 32, 116, 104, // onents of th - 101, 32, 97, 112, 112, 46, 10, 118, 97, 114, 32, 80, // e app..var P - 117, 98, 83, 117, 98, 32, 61, 32, 40, 102, 117, 110, // ubSub = (fun - 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, // ction() {. - 118, 97, 114, 32, 104, 97, 110, 100, 108, 101, 114, 115, // var handlers - 32, 61, 32, 123, 125, 44, 32, 105, 100, 32, 61, 32, // = {}, id = - 48, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, // 0;. return - 123, 10, 32, 32, 32, 32, 115, 117, 98, 115, 99, 114, // {. subscr - 105, 98, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, // ibe: functio - 110, 40, 102, 110, 41, 32, 123, 10, 32, 32, 32, 32, // n(fn) {. - 32, 32, 104, 97, 110, 100, 108, 101, 114, 115, 91, 105, // handlers[i - 100, 43, 43, 93, 32, 61, 32, 102, 110, 59, 10, 32, // d++] = fn;. - 32, 32, 32, 125, 44, 10, 32, 32, 32, 32, 117, 110, // },. un - 115, 117, 98, 115, 99, 114, 105, 98, 101, 58, 32, 102, // subscribe: f - 117, 110, 99, 116, 105, 111, 110, 40, 105, 100, 41, 32, // unction(id) - 123, 10, 32, 32, 32, 32, 32, 32, 100, 101, 108, 101, // {. dele - 116, 101, 32, 104, 97, 110, 100, 108, 101, 114, 115, 91, // te handlers[ - 105, 100, 93, 59, 10, 32, 32, 32, 32, 125, 44, 10, // id];. },. - 32, 32, 32, 32, 112, 117, 98, 108, 105, 115, 104, 58, // publish: - 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 100, 97, // function(da - 116, 97, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, // ta) {. - 102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 105, // for (var k i - 110, 32, 104, 97, 110, 100, 108, 101, 114, 115, 41, 32, // n handlers) - 104, 97, 110, 100, 108, 101, 114, 115, 91, 107, 93, 40, // handlers[k]( - 100, 97, 116, 97, 41, 59, 10, 32, 32, 32, 32, 125, // data);. } - 10, 32, 32, 125, 59, 10, 125, 41, 40, 41, 59, 10, // . };.})();. - 10, 99, 111, 110, 115, 116, 32, 78, 97, 118, 32, 61, // .const Nav = - 32, 112, 114, 111, 112, 115, 32, 61, 62, 32, 104, 116, // props => ht - 109, 108, 96, 10, 60, 100, 105, 118, 32, 115, 116, 121, // ml`.
. `; - 10, 10, 10, 99, 111, 110, 115, 116, 32, 72, 101, 114, // ...const Her - 111, 32, 61, 32, 112, 114, 111, 112, 115, 32, 61, 62, // o = props => - 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.
. Interacti - 118, 101, 32, 68, 101, 118, 105, 99, 101, 32, 68, 97, // ve Device Da - 115, 104, 98, 111, 97, 114, 100, 60, 47, 104, 49, 62, // shboard - 10, 10, 32, 32, 60, 112, 62, 10, 32, 32, 84, 104, // ..

. Th - 105, 115, 32, 100, 101, 118, 105, 99, 101, 32, 100, 97, // is device da - 115, 104, 98, 111, 97, 114, 100, 32, 105, 115, 32, 100, // shboard is d - 101, 118, 101, 108, 111, 112, 101, 100, 32, 117, 115, 105, // eveloped usi - 110, 103, 32, 116, 104, 101, 32, 109, 111, 100, 101, 114, // ng the 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, 118, 101, 114, 121, 32, 115, 109, // t on very sm - 97, 108, 108, 32, 100, 101, 118, 105, 99, 101, 115, 46, // all devices. - 32, 84, 104, 105, 115, 32, 105, 115, 10, 32, 32, 97, // This is. a - 32, 60, 97, 32, 104, 114, 101, 102, 61, 34, 104, 116, // hybrid - 32, 115, 101, 114, 118, 101, 114, 60, 47, 97, 62, 32, // server - 119, 104, 105, 99, 104, 10, 32, 32, 112, 114, 111, 118, // which. prov - 105, 100, 101, 115, 32, 98, 111, 116, 104, 32, 115, 116, // ides both st - 97, 116, 105, 99, 32, 97, 110, 100, 32, 100, 121, 110, // atic and dyn - 97, 109, 105, 99, 32, 99, 111, 110, 116, 101, 110, 116, // amic content - 46, 32, 32, 83, 116, 97, 116, 105, 99, 32, 102, 105, // . Static fi - 108, 101, 115, 44, 32, 108, 105, 107, 101, 32, 67, 83, // les, like CS - 83, 47, 74, 83, 47, 72, 84, 77, 76, 10, 32, 32, // S/JS/HTML. - 111, 114, 32, 105, 109, 97, 103, 101, 115, 44, 32, 97, // or images, a - 114, 101, 32, 99, 111, 109, 112, 105, 108, 101, 100, 32, // re compiled - 105, 110, 116, 111, 32, 116, 104, 101, 32, 115, 101, 114, // into the ser - 118, 101, 114, 32, 98, 105, 110, 97, 114, 121, 46, 10, // ver binary.. - 10, 32, 32, 84, 104, 105, 115, 32, 85, 73, 32, 117, // . This UI u - 115, 101, 115, 32, 116, 104, 101, 32, 82, 69, 83, 84, // ses the REST - 32, 65, 80, 73, 32, 105, 109, 112, 108, 101, 109, 101, // API impleme - 110, 116, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, // nted by the - 100, 101, 118, 105, 99, 101, 44, 32, 119, 104, 105, 99, // device, whic - 104, 32, 121, 111, 117, 32, 99, 97, 110, 32, 101, 120, // h you can ex - 97, 109, 105, 110, 101, 10, 32, 32, 117, 115, 105, 110, // amine. usin - 103, 32, 32, 60, 99, 111, 100, 101, 62, 99, 117, 114, // g cur - 108, 60, 47, 99, 111, 100, 101, 62, 32, 99, 111, 109, // l com - 109, 97, 110, 100, 45, 108, 105, 110, 101, 32, 117, 116, // mand-line ut - 105, 108, 105, 116, 121, 58, 10, 32, 32, 60, 47, 112, // ility:.

..
curl -u - 97, 100, 109, 105, 110, 58, 112, 97, 115, 115, 48, 32, // admin:pass0 - 36, 123, 100, 101, 118, 97, 100, 100, 114, 125, 47, 97, // ${devaddr}/a - 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, 103, 101, // pi/config/ge - 116, 60, 47, 99, 111, 100, 101, 62, 32, 60, 47, 100, // t .
< - 99, 111, 100, 101, 62, 99, 117, 114, 108, 32, 45, 117, // code>curl -u - 32, 97, 100, 109, 105, 110, 58, 112, 97, 115, 115, 48, // admin:pass0 - 32, 36, 123, 100, 101, 118, 97, 100, 100, 114, 125, 47, // ${devaddr}/ - 97, 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, 115, // api/config/s - 101, 116, 32, 45, 100, 32, 39, 112, 117, 98, 61, 109, // et -d 'pub=m - 103, 47, 116, 111, 112, 105, 99, 39, 60, 47, 99, 111, // g/topic'
. - 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, 101, 62, //
- 99, 117, 114, 108, 32, 45, 117, 32, 97, 100, 109, 105, // curl -u admi - 110, 58, 112, 97, 115, 115, 48, 32, 36, 123, 100, 101, // n:pass0 ${de - 118, 97, 100, 100, 114, 125, 47, 97, 112, 105, 47, 109, // vaddr}/api/m - 101, 115, 115, 97, 103, 101, 47, 115, 101, 110, 100, 32, // essage/send - 45, 100, 32, 39, 109, 101, 115, 115, 97, 103, 101, 61, // -d 'message= - 104, 101, 108, 108, 111, 39, 60, 47, 99, 111, 100, 101, // hello'
.. - 60, 112, 62, 10, 32, 32, 84, 104, 101, 32, 100, 101, //

. The de - 118, 105, 99, 101, 32, 99, 97, 110, 32, 115, 101, 110, // vice can sen - 100, 32, 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, // d notificati - 111, 110, 115, 32, 116, 111, 32, 116, 104, 105, 115, 32, // ons to this - 100, 97, 115, 104, 98, 111, 97, 114, 100, 32, 97, 116, // dashboard at - 32, 97, 110, 121, 116, 105, 109, 101, 46, 32, 78, 111, // anytime. No - 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, 115, 10, // tifications. - 32, 32, 97, 114, 101, 32, 115, 101, 110, 116, 32, 111, // are sent o - 118, 101, 114, 32, 87, 101, 98, 83, 111, 99, 107, 101, // ver WebSocke - 116, 32, 97, 116, 32, 85, 82, 73, 32, 60, 99, 111, // t at URI /api/watc - 104, 60, 47, 99, 111, 100, 101, 62, 32, 97, 115, 32, // h as - 74, 83, 79, 78, 32, 115, 116, 114, 105, 110, 103, 115, // JSON strings - 58, 32, 60, 99, 111, 100, 101, 62, 123, 34, 110, 97, // : {"na - 109, 101, 34, 58, 32, 34, 46, 46, 34, 44, 32, 34, // me": "..", " - 100, 97, 116, 97, 34, 58, 32, 46, 46, 46, 125, 60, // data": ...}< - 47, 99, 111, 100, 101, 62, 10, 32, 32, 60, 100, 105, // /code>. Try - 119, 115, 99, 97, 116, 32, 45, 45, 97, 117, 116, 104, // wscat --auth - 32, 117, 115, 101, 114, 49, 58, 112, 97, 115, 115, 49, // user1:pass1 - 32, 45, 45, 99, 111, 110, 110, 101, 99, 116, 32, 119, // --connect w - 115, 58, 47, 47, 36, 123, 100, 101, 118, 97, 100, 100, // s://${devadd - 114, 125, 47, 97, 112, 105, 47, 119, 97, 116, 99, 104, // r}/api/watch - 60, 47, 99, 111, 100, 101, 62, 60, 47, 100, 105, 118, //

.

..
`; - 10, 10, 99, 111, 110, 115, 116, 32, 76, 111, 103, 105, // ..const Logi - 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, 115, 101, 114, 44, // const [user, - 32, 115, 101, 116, 85, 115, 101, 114, 93, 32, 61, 32, // setUser] = - 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, 41, // useState('') - 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, 112, // ;. const [p - 97, 115, 115, 44, 32, 115, 101, 116, 80, 97, 115, 115, // ass, setPass - 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, // ] = useState - 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, 115, // ('');. cons - 116, 32, 108, 111, 103, 105, 110, 32, 61, 32, 101, 118, // t login = ev - 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, 102, 101, // =>. fe - 116, 99, 104, 40, 10, 32, 32, 32, 32, 32, 32, 32, // tch(. - 32, 32, 32, 39, 47, 97, 112, 105, 47, 108, 111, 103, // '/api/log - 105, 110, 39, 44, 10, 32, 32, 32, 32, 32, 32, 32, // in',. - 32, 32, 32, 123, 104, 101, 97, 100, 101, 114, 115, 58, // {headers: - 32, 123, 65, 117, 116, 104, 111, 114, 105, 122, 97, 116, // {Authorizat - 105, 111, 110, 58, 32, 39, 66, 97, 115, 105, 99, 32, // ion: 'Basic - 39, 32, 43, 32, 98, 116, 111, 97, 40, 117, 115, 101, // ' + btoa(use - 114, 32, 43, 32, 39, 58, 39, 32, 43, 32, 112, 97, // r + ':' + pa - 115, 115, 41, 125, 125, 41, 10, 32, 32, 32, 32, 32, // ss)}}). - 32, 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, // .then(r - 32, 61, 62, 32, 114, 46, 106, 115, 111, 110, 40, 41, // => r.json() - 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ). - 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, // .then(r => r - 32, 38, 38, 32, 112, 114, 111, 112, 115, 46, 108, 111, // && props.lo - 103, 105, 110, 40, 114, 41, 41, 10, 32, 32, 32, 32, // gin(r)). - 32, 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, // .catch - 40, 101, 114, 114, 32, 61, 62, 32, 101, 114, 114, 41, // (err => err) - 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`.
.
. - 32, 32, 32, 60, 104, 49, 32, 115, 116, 121, 108, 101, //

Device D - 97, 115, 104, 98, 111, 97, 114, 100, 32, 76, 111, 103, // ashboard Log - 105, 110, 32, 60, 47, 104, 49, 62, 10, 32, 32, 32, // in

. - 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, //
. - 32, 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, // - 32, 115, 101, 116, 85, 115, 101, 114, 40, 101, 118, 46, // setUser(ev. - 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, 101, // target.value - 41, 125, 32, 118, 97, 108, 117, 101, 61, 36, 123, 117, // )} value=${u - 115, 101, 114, 125, 32, 47, 62, 10, 32, 32, 32, 32, // ser} />. - 60, 47, 100, 105, 118, 62, 10, 32, 32, 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, 34, 62, 10, 32, 32, 32, 32, 32, 32, // 0;">. - 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // setPa - 115, 115, 40, 101, 118, 46, 116, 97, 114, 103, 101, 116, // ss(ev.target - 46, 118, 97, 108, 117, 101, 41, 125, 32, 118, 97, 108, // .value)} val - 117, 101, 61, 36, 123, 112, 97, 115, 115, 125, 10, 32, // ue=${pass}. - 32, 32, 32, 32, 32, 32, 32, 111, 110, 99, 104, 97, // oncha - 110, 103, 101, 61, 36, 123, 108, 111, 103, 105, 110, 125, // nge=${login} - 32, 47, 62, 10, 32, 32, 32, 32, 60, 47, 100, 105, // />. .
. - 32, 32, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, // Lo - 103, 105, 110, 32, 60, 47, 98, 117, 116, 116, 111, 110, // gin .
- 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 115, 116, // .
- 10, 32, 32, 32, 32, 32, 32, 86, 97, 108, 105, 100, // . Valid - 32, 108, 111, 103, 105, 110, 115, 58, 32, 97, 100, 109, // logins: adm - 105, 110, 58, 112, 97, 115, 115, 48, 44, 32, 117, 115, // in:pass0, us - 101, 114, 49, 58, 112, 97, 115, 115, 49, 44, 32, 117, // er1:pass1, u - 115, 101, 114, 50, 58, 112, 97, 115, 115, 50, 10, 32, // ser2:pass2. - 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, //
. - 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, 118, //
.
`;.};...con - 115, 116, 32, 67, 111, 110, 102, 105, 103, 117, 114, 97, // st Configura - 116, 105, 111, 110, 32, 61, 32, 102, 117, 110, 99, 116, // tion = funct - 105, 111, 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, // ion(props) { - 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, 117, 114, // . const [ur - 108, 44, 32, 115, 101, 116, 85, 114, 108, 93, 32, 61, // l, setUrl] = - 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 112, 114, // useState(pr - 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, 46, 117, // ops.config.u - 114, 108, 32, 124, 124, 32, 39, 39, 41, 59, 10, 32, // rl || '');. - 32, 99, 111, 110, 115, 116, 32, 91, 112, 117, 98, 44, // const [pub, - 32, 115, 101, 116, 80, 117, 98, 93, 32, 61, 32, 117, // setPub] = u - 115, 101, 83, 116, 97, 116, 101, 40, 112, 114, 111, 112, // seState(prop - 115, 46, 99, 111, 110, 102, 105, 103, 46, 112, 117, 98, // s.config.pub - 32, 124, 124, 32, 39, 39, 41, 59, 10, 32, 32, 99, // || '');. c - 111, 110, 115, 116, 32, 91, 115, 117, 98, 44, 32, 115, // onst [sub, s - 101, 116, 83, 117, 98, 93, 32, 61, 32, 117, 115, 101, // etSub] = use - 83, 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, 46, // State(props. - 99, 111, 110, 102, 105, 103, 46, 115, 117, 98, 32, 124, // config.sub | - 124, 32, 39, 39, 41, 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, 115, 101, 116, 85, // > {. setU - 114, 108, 40, 112, 114, 111, 112, 115, 46, 99, 111, 110, // rl(props.con - 102, 105, 103, 46, 117, 114, 108, 41, 59, 10, 32, 32, // fig.url);. - 32, 32, 115, 101, 116, 80, 117, 98, 40, 112, 114, 111, // setPub(pro - 112, 115, 46, 99, 111, 110, 102, 105, 103, 46, 112, 117, // ps.config.pu - 98, 41, 59, 10, 32, 32, 32, 32, 115, 101, 116, 83, // b);. setS - 117, 98, 40, 112, 114, 111, 112, 115, 46, 99, 111, 110, // ub(props.con - 102, 105, 103, 46, 115, 117, 98, 41, 59, 10, 32, 32, // fig.sub);. - 125, 44, 32, 91, 112, 114, 111, 112, 115, 46, 99, 111, // }, [props.co - 110, 102, 105, 103, 93, 41, 59, 10, 10, 32, 32, 99, // nfig]);.. c - 111, 110, 115, 116, 32, 117, 112, 100, 97, 116, 101, 32, // onst update - 61, 32, 40, 110, 97, 109, 101, 44, 32, 118, 97, 108, // = (name, val - 41, 32, 61, 62, 32, 102, 101, 116, 99, 104, 40, 39, // ) => fetch(' - 47, 97, 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, // /api/config/ - 115, 101, 116, 39, 44, 32, 123, 10, 32, 32, 32, 32, // set', {. - 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, // method - 58, 32, 39, 112, 111, 115, 116, 39, 44, 10, 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, 32, 32, 32, 98, 111, 100, 121, // body - 58, 32, 96, 36, 123, 110, 97, 109, 101, 125, 61, 36, // : `${name}=$ - 123, 101, 110, 99, 111, 100, 101, 85, 82, 73, 67, 111, // {encodeURICo - 109, 112, 111, 110, 101, 110, 116, 40, 118, 97, 108, 41, // mponent(val) - 125, 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, 32, 32, 32, 32, 125, // } - 41, 46, 99, 97, 116, 99, 104, 40, 101, 114, 114, 32, // ).catch(err - 61, 62, 32, 101, 114, 114, 41, 59, 10, 32, 32, 99, // => err);. c - 111, 110, 115, 116, 32, 117, 112, 100, 97, 116, 101, 117, // onst updateu - 114, 108, 32, 61, 32, 101, 118, 32, 61, 62, 32, 117, // rl = ev => u - 112, 100, 97, 116, 101, 40, 39, 117, 114, 108, 39, 44, // pdate('url', - 32, 117, 114, 108, 41, 59, 10, 32, 32, 99, 111, 110, // url);. con - 115, 116, 32, 117, 112, 100, 97, 116, 101, 112, 117, 98, // st updatepub - 32, 61, 32, 101, 118, 32, 61, 62, 32, 117, 112, 100, // = ev => upd - 97, 116, 101, 40, 39, 112, 117, 98, 39, 44, 32, 112, // ate('pub', p - 117, 98, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, // ub);. const - 32, 117, 112, 100, 97, 116, 101, 115, 117, 98, 32, 61, // updatesub = - 32, 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, 116, // ev => updat - 101, 40, 39, 115, 117, 98, 39, 44, 32, 115, 117, 98, // e('sub', sub - 41, 59, 10, 10, 32, 32, 47, 47, 32, 99, 111, 110, // );.. // con - 115, 111, 108, 101, 46, 108, 111, 103, 40, 112, 114, 111, // sole.log(pro - 112, 115, 44, 32, 91, 117, 114, 108, 44, 32, 112, 117, // ps, [url, pu - 98, 44, 32, 115, 117, 98, 93, 41, 59, 10, 32, 32, // b, sub]);. - 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, //

. Devi - 99, 101, 32, 67, 111, 110, 102, 105, 103, 117, 114, 97, // ce Configura - 116, 105, 111, 110, 60, 47, 104, 51, 62, 10, 32, 32, // tion

. - 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. - 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // MQTT se - 114, 118, 101, 114, 58, 60, 47, 115, 112, 97, 110, 62, // rver: - 10, 32, 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, // . set - 85, 114, 108, 40, 101, 118, 46, 116, 97, 114, 103, 101, // Url(ev.targe - 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, 62, // t.value)} /> - 10, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, 110, // .
- 10, 32, 32, 60, 100, 105, 118, 62, 10, 32, 32, 32, // .
. - 32, 89, 111, 117, 32, 99, 97, 110, 32, 117, 115, 101, // You can use - 32, 60, 97, 32, 104, 114, 101, 102, 61, 34, 104, 116, // . - 32, 32, 72, 105, 118, 101, 77, 81, 32, 87, 101, 98, // HiveMQ Web - 115, 111, 99, 107, 101, 116, 32, 119, 101, 98, 32, 99, // socket web c - 108, 105, 101, 110, 116, 60, 47, 97, 62, 32, 116, 111, // lient to - 32, 115, 101, 110, 100, 32, 109, 101, 115, 115, 97, 103, // send messag - 101, 115, 32, 116, 111, 32, 116, 104, 105, 115, 32, 99, // es to this c - 111, 110, 115, 111, 108, 101, 46, 10, 32, 32, 60, 47, // onsole.. .
- 10, 32, 32, 32, 32, 84, 104, 101, 32, 100, 101, 118, // . The dev - 105, 99, 101, 32, 107, 101, 101, 112, 115, 32, 97, 32, // ice keeps a - 112, 101, 114, 115, 105, 115, 116, 101, 110, 116, 32, 99, // persistent c - 111, 110, 110, 101, 99, 116, 105, 111, 110, 32, 116, 111, // onnection to - 32, 116, 104, 101, 32, 99, 111, 110, 102, 105, 103, 117, // the configu - 114, 101, 100, 32, 77, 81, 84, 84, 32, 115, 101, 114, // red MQTT ser - 118, 101, 114, 46, 10, 32, 32, 32, 32, 67, 104, 97, // ver.. Cha - 110, 103, 101, 115, 32, 116, 111, 32, 116, 104, 105, 115, // nges to this - 32, 99, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, // configurati - 111, 110, 32, 97, 114, 101, 32, 112, 114, 111, 112, 97, // on are propa - 103, 97, 116, 101, 100, 32, 116, 111, 32, 97, 108, 108, // gated to all - 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, 115, 58, // dashboards: - 32, 116, 114, 121, 10, 32, 32, 32, 32, 99, 104, 97, // try. cha - 110, 103, 105, 110, 103, 32, 116, 104, 101, 109, 32, 105, // nging them i - 110, 32, 116, 104, 105, 115, 32, 100, 97, 115, 104, 98, // n this dashb - 111, 97, 114, 100, 32, 97, 110, 100, 32, 111, 98, 115, // oard and obs - 101, 114, 118, 101, 32, 99, 104, 97, 110, 103, 101, 115, // erve changes - 32, 105, 110, 32, 111, 116, 104, 101, 114, 32, 111, 112, // in other op - 101, 110, 101, 100, 10, 32, 32, 32, 32, 100, 97, 115, // ened. das - 104, 98, 111, 97, 114, 100, 115, 46, 10, 32, 32, 60, // hboards.. < - 47, 100, 105, 118, 62, 60, 100, 105, 118, 32, 99, 108, // /div>
. - 32, 32, 32, 78, 111, 116, 101, 58, 32, 97, 100, 109, // Note: adm - 105, 110, 105, 115, 116, 114, 97, 116, 111, 114, 115, 32, // inistrators - 99, 97, 110, 32, 115, 101, 101, 32, 116, 104, 105, 115, // can see this - 32, 115, 101, 99, 116, 105, 111, 110, 32, 97, 110, 100, // section and - 32, 99, 97, 110, 32, 99, 104, 97, 110, 103, 101, 32, // can change - 100, 101, 118, 105, 99, 101, 10, 32, 32, 32, 32, 99, // device. c - 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, // onfiguration - 44, 32, 119, 104, 105, 108, 115, 116, 32, 117, 115, 101, // , whilst use - 114, 115, 32, 99, 97, 110, 110, 111, 116, 46, 10, 32, // rs cannot.. - 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, //
.`;.};...co - 110, 115, 116, 32, 77, 101, 115, 115, 97, 103, 101, 32, // nst Message - 61, 32, 109, 32, 61, 62, 32, 104, 116, 109, 108, 96, // = m => html` - 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. qos: ${m. - 109, 101, 115, 115, 97, 103, 101, 46, 113, 111, 115, 125, // message.qos} - 32, 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 60, // . < - 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, 34, // span class=" - 116, 111, 112, 105, 99, 34, 62, 116, 111, 112, 105, 99, // topic">topic - 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag - 101, 46, 116, 111, 112, 105, 99, 125, 32, 60, 47, 115, // e.topic} . data: ${m. - 109, 101, 115, 115, 97, 103, 101, 46, 100, 97, 116, 97, // message.data - 125, 60, 47, 115, 112, 97, 110, 62, 10, 60, 47, 100, // }.`;..const - 32, 77, 101, 115, 115, 97, 103, 101, 115, 32, 61, 32, // Messages = - 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, 109, 101, 115, 115, 97, 103, 101, 115, 44, // t [messages, - 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, 101, 115, // setMessages - 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, // ] = useState - 40, 91, 93, 41, 59, 10, 32, 32, 99, 111, 110, 115, // ([]);. cons - 116, 32, 91, 116, 120, 116, 44, 32, 115, 101, 116, 84, // t [txt, setT - 120, 116, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // xt] = useSta - 116, 101, 40, 39, 39, 41, 59, 10, 10, 32, 32, 117, // te('');.. u - 115, 101, 69, 102, 102, 101, 99, 116, 40, 40, 41, 32, // seEffect(() - 61, 62, 32, 123, 10, 32, 32, 32, 32, 99, 111, 110, // => {. con - 115, 116, 32, 105, 100, 32, 61, 32, 80, 117, 98, 83, // st id = PubS - 117, 98, 46, 115, 117, 98, 115, 99, 114, 105, 98, 101, // ub.subscribe - 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 109, 115, // (function(ms - 103, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 105, // g) {. i - 102, 32, 40, 109, 115, 103, 46, 110, 97, 109, 101, 32, // f (msg.name - 61, 61, 32, 39, 109, 101, 115, 115, 97, 103, 101, 39, // == 'message' - 41, 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, 101, // ) setMessage - 115, 40, 120, 32, 61, 62, 32, 120, 46, 99, 111, 110, // s(x => x.con - 99, 97, 116, 40, 91, 109, 115, 103, 46, 100, 97, 116, // cat([msg.dat - 97, 93, 41, 41, 59, 10, 32, 32, 32, 32, 125, 41, // a]));. }) - 59, 10, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, // ;. return - 32, 80, 117, 98, 83, 117, 98, 46, 117, 110, 115, 117, // PubSub.unsu - 98, 115, 99, 114, 105, 98, 101, 40, 105, 100, 41, 59, // bscribe(id); - 10, 32, 32, 125, 44, 32, 91, 93, 41, 59, 10, 10, // . }, []);.. - 32, 32, 99, 111, 110, 115, 116, 32, 115, 101, 110, 100, // const send - 109, 101, 115, 115, 97, 103, 101, 32, 61, 32, 101, 118, // message = ev - 32, 61, 62, 32, 102, 101, 116, 99, 104, 40, 39, 47, // => fetch('/ - 97, 112, 105, 47, 109, 101, 115, 115, 97, 103, 101, 47, // api/message/ - 115, 101, 110, 100, 39, 44, 32, 123, 10, 32, 32, 32, // send', {. - 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, 98, 111, 100, 121, 58, 32, 96, 109, 101, 115, 115, // body: `mess - 97, 103, 101, 61, 36, 123, 101, 110, 99, 111, 100, 101, // age=${encode - 85, 82, 73, 67, 111, 109, 112, 111, 110, 101, 110, 116, // URIComponent - 40, 116, 120, 116, 41, 125, 96, 10, 32, 32, 32, 32, // (txt)}`. - 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, 40, 114, 32, 61, 62, // }).then(r => - 32, 115, 101, 116, 84, 120, 116, 40, 39, 39, 41, 41, // setTxt('')) - 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 114, 111, // ;. const ro - 117, 116, 105, 110, 103, 32, 61, 32, 34, 99, 111, 110, // uting = "con - 110, 101, 99, 116, 101, 100, 34, 32, 105, 110, 32, 112, // nected" in p - 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, 59, // rops.config; - 10, 32, 32, 99, 111, 110, 115, 116, 32, 99, 111, 110, // . const con - 110, 115, 116, 97, 116, 117, 115, 32, 61, 32, 33, 114, // nstatus = !r - 111, 117, 116, 105, 110, 103, 32, 63, 32, 39, 84, 104, // outing ? 'Th - 105, 115, 32, 100, 101, 118, 105, 99, 101, 32, 104, 97, // is device ha - 115, 32, 110, 111, 32, 77, 81, 84, 84, 32, 102, 117, // s no MQTT fu - 110, 99, 116, 105, 111, 110, 97, 108, 105, 116, 121, 39, // nctionality' - 32, 58, 32, 112, 114, 111, 112, 115, 46, 99, 111, 110, // : props.con - 102, 105, 103, 46, 99, 111, 110, 110, 101, 99, 116, 101, // fig.connecte - 100, 32, 63, 32, 39, 99, 111, 110, 110, 101, 99, 116, // d ? 'connect - 101, 100, 39, 32, 58, 32, 39, 100, 105, 115, 99, 111, // ed' : 'disco - 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:. setTxt(e - 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, // v.target.val - 117, 101, 41, 125, 32, 47, 62, 10, 32, 32, 60, 47, // ue)} />. .
- 10, 32, 32, 32, 32, 84, 104, 101, 32, 109, 101, 115, // . The mes - 115, 97, 103, 101, 32, 103, 101, 116, 115, 32, 112, 97, // sage gets pa - 115, 115, 101, 100, 32, 116, 111, 32, 116, 104, 101, 32, // ssed to the - 100, 101, 118, 105, 99, 101, 32, 118, 105, 97, 32, 82, // device via R - 69, 83, 84, 46, 32, 84, 104, 101, 110, 32, 116, 104, // EST. Then th - 101, 32, 100, 101, 118, 105, 99, 101, 32, 115, 101, 110, // e device sen - 100, 115, 32, 105, 116, 32, 116, 111, 10, 32, 32, 32, // ds it to. - 32, 116, 104, 101, 32, 77, 81, 84, 84, 32, 115, 101, // the MQTT se - 114, 118, 101, 114, 32, 111, 118, 101, 114, 32, 77, 81, // rver over MQ - 84, 84, 46, 32, 65, 108, 108, 32, 77, 81, 84, 84, // TT. All MQTT - 32, 109, 101, 115, 115, 97, 103, 101, 115, 32, 111, 110, // messages on - 32, 97, 32, 115, 117, 98, 115, 99, 114, 105, 98, 101, // a subscribe - 100, 32, 116, 111, 112, 105, 99, 10, 32, 32, 32, 32, // d topic. - 114, 101, 99, 101, 105, 118, 101, 100, 32, 98, 121, 32, // received by - 116, 104, 101, 32, 100, 101, 118, 105, 99, 101, 44, 32, // the device, - 97, 114, 101, 32, 112, 114, 111, 112, 97, 103, 97, 116, // are propagat - 101, 100, 32, 116, 111, 32, 116, 104, 105, 115, 32, 100, // ed to this d - 97, 115, 104, 98, 111, 97, 114, 100, 32, 118, 105, 97, // ashboard via - 32, 47, 97, 112, 105, 47, 119, 97, 116, 99, 104, 46, // /api/watch. - 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, // .
.`;.};../ - 47, 32, 69, 120, 112, 101, 99, 116, 101, 100, 32, 97, // / Expected a - 114, 103, 117, 109, 101, 110, 116, 115, 58, 10, 47, 47, // rguments:.// - 32, 100, 97, 116, 97, 58, 32, 116, 105, 109, 101, 115, // data: times - 101, 114, 105, 101, 115, 44, 32, 101, 46, 103, 46, 32, // eries, e.g. - 91, 32, 91, 49, 54, 53, 52, 51, 54, 49, 51, 53, // [ [165436135 - 50, 44, 32, 49, 57, 93, 44, 32, 91, 49, 54, 53, // 2, 19], [165 - 52, 51, 54, 49, 51, 53, 51, 44, 32, 49, 56, 93, // 4361353, 18] - 44, 32, 46, 46, 46, 32, 93, 10, 47, 47, 32, 119, // , ... ].// w - 105, 100, 116, 104, 44, 32, 104, 101, 105, 103, 104, 116, // idth, height - 44, 32, 121, 116, 105, 99, 107, 115, 44, 32, 120, 116, // , yticks, xt - 105, 99, 107, 115, 44, 32, 121, 109, 105, 110, 44, 32, // icks, ymin, - 121, 109, 97, 120, 44, 32, 120, 109, 105, 110, 44, 32, // ymax, xmin, - 120, 109, 97, 120, 10, 99, 111, 110, 115, 116, 32, 83, // xmax.const S - 86, 71, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // VG = functio - 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, // n(props) {. - 32, 47, 47, 32, 32, 32, 32, 32, 32, 32, 32, 32, // // - 32, 32, 32, 119, 10, 32, 32, 47, 47, 32, 32, 32, // w. // - 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, 32, 32, 32, // h1 - 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, // | | h. - 32, 32, 47, 47, 32, 32, 32, 124, 32, 119, 49, 32, // // | w1 - 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // | - 124, 32, 119, 50, 32, 124, 10, 32, 32, 47, 47, 32, // | w2 |. // - 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, // h2 - 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, // --+. //. l - 101, 116, 32, 119, 32, 61, 32, 112, 114, 111, 112, 115, // et w = props - 46, 119, 105, 100, 116, 104, 44, 32, 104, 32, 61, 32, // .width, h = - 112, 114, 111, 112, 115, 46, 104, 101, 105, 103, 104, 116, // props.height - 44, 32, 119, 49, 32, 61, 32, 51, 48, 44, 32, 119, // , w1 = 30, w - 50, 32, 61, 32, 48, 44, 32, 104, 49, 32, 61, 32, // 2 = 0, h1 = - 56, 44, 32, 104, 50, 32, 61, 32, 49, 56, 59, 10, // 8, h2 = 18;. - 32, 32, 108, 101, 116, 32, 121, 116, 105, 99, 107, 115, // let yticks - 32, 61, 32, 112, 114, 111, 112, 115, 46, 121, 116, 105, // = props.yti - 99, 107, 115, 32, 124, 124, 32, 52, 44, 32, 120, 116, // cks || 4, xt - 105, 99, 107, 115, 32, 61, 32, 112, 114, 111, 112, 115, // icks = props - 46, 120, 116, 105, 99, 107, 115, 32, 124, 124, 32, 53, // .xticks || 5 - 59, 10, 32, 32, 108, 101, 116, 32, 100, 97, 116, 97, // ;. let data - 32, 61, 32, 112, 114, 111, 112, 115, 46, 100, 97, 116, // = props.dat - 97, 32, 124, 124, 32, 91, 93, 59, 10, 32, 32, 108, // a || [];. l - 101, 116, 32, 121, 109, 105, 110, 32, 61, 32, 112, 114, // et ymin = pr - 111, 112, 115, 46, 121, 109, 105, 110, 32, 124, 124, 32, // ops.ymin || - 48, 59, 10, 32, 32, 108, 101, 116, 32, 121, 109, 97, // 0;. let yma - 120, 32, 61, 32, 112, 114, 111, 112, 115, 46, 121, 109, // x = props.ym - 97, 120, 32, 124, 124, 32, 77, 97, 116, 104, 46, 109, // ax || Math.m - 97, 120, 46, 97, 112, 112, 108, 121, 40, 110, 117, 108, // ax.apply(nul - 108, 44, 32, 100, 97, 116, 97, 46, 109, 97, 112, 40, // l, data.map( - 112, 32, 61, 62, 32, 112, 91, 49, 93, 41, 41, 59, // p => p[1])); - 10, 32, 32, 108, 101, 116, 32, 120, 109, 105, 110, 32, // . let xmin - 61, 32, 112, 114, 111, 112, 115, 46, 120, 109, 105, 110, // = props.xmin - 32, 124, 124, 32, 77, 97, 116, 104, 46, 109, 105, 110, // || Math.min - 46, 97, 112, 112, 108, 121, 40, 110, 117, 108, 108, 44, // .apply(null, - 32, 100, 97, 116, 97, 46, 109, 97, 112, 40, 112, 32, // data.map(p - 61, 62, 32, 112, 91, 48, 93, 41, 41, 59, 10, 32, // => p[0]));. - 32, 108, 101, 116, 32, 120, 109, 97, 120, 32, 61, 32, // let xmax = - 112, 114, 111, 112, 115, 46, 120, 109, 97, 120, 32, 124, // props.xmax | - 124, 32, 77, 97, 116, 104, 46, 109, 97, 120, 46, 97, // | Math.max.a - 112, 112, 108, 121, 40, 110, 117, 108, 108, 44, 32, 100, // pply(null, d - 97, 116, 97, 46, 109, 97, 112, 40, 112, 32, 61, 62, // ata.map(p => - 32, 112, 91, 48, 93, 41, 41, 59, 10, 10, 32, 32, // p[0]));.. - 47, 47, 32, 89, 45, 97, 120, 105, 115, 32, 116, 105, // // Y-axis ti - 99, 107, 32, 108, 105, 110, 101, 115, 32, 97, 110, 100, // ck lines and - 32, 108, 97, 98, 101, 108, 115, 10, 32, 32, 108, 101, // labels. le - 116, 32, 121, 116, 97, 32, 61, 32, 40, 110, 101, 119, // t yta = (new - 32, 65, 114, 114, 97, 121, 40, 121, 116, 105, 99, 107, // Array(ytick - 115, 32, 43, 32, 49, 41, 41, 46, 102, 105, 108, 108, // s + 1)).fill - 40, 48, 41, 46, 109, 97, 112, 40, 40, 95, 44, 32, // (0).map((_, - 105, 41, 32, 61, 62, 32, 105, 41, 59, 32, 32, 47, // i) => i); / - 47, 32, 105, 110, 100, 105, 99, 101, 115, 10, 32, 32, // / indices. - 108, 101, 116, 32, 121, 116, 105, 32, 61, 32, 105, 32, // let yti = i - 61, 62, 32, 104, 32, 45, 32, 104, 50, 32, 45, 32, // => h - h2 - - 40, 104, 32, 45, 32, 104, 49, 32, 45, 32, 104, 50, // (h - h1 - h2 - 41, 32, 42, 32, 105, 32, 47, 32, 121, 116, 105, 99, // ) * i / ytic - 107, 115, 59, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ks; - 32, 47, 47, 32, 105, 110, 100, 101, 120, 39, 115, 32, // // index's - 89, 10, 32, 32, 108, 101, 116, 32, 121, 116, 118, 32, // Y. let ytv - 61, 32, 105, 32, 61, 62, 32, 40, 121, 109, 97, 120, // = i => (ymax - 32, 45, 32, 121, 109, 105, 110, 41, 32, 42, 32, 105, // - ymin) * i - 32, 47, 32, 121, 116, 105, 99, 107, 115, 59, 10, 32, // / yticks;. - 32, 108, 101, 116, 32, 121, 116, 108, 32, 61, 32, 121, // let ytl = y - 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, 108, 105, // => html`
  • `;. let y - 116, 116, 32, 61, 32, 40, 121, 44, 32, 118, 41, 32, // tt = (y, v) - 61, 62, 32, 104, 116, 109, 108, 96, 60, 116, 101, 120, // => html`${v}< - 47, 116, 101, 120, 116, 62, 96, 59, 10, 10, 32, 32, // /text>`;.. - 47, 47, 32, 88, 45, 97, 120, 105, 115, 32, 116, 105, // // X-axis ti - 99, 107, 32, 108, 105, 110, 101, 115, 32, 97, 110, 100, // ck lines and - 32, 108, 97, 98, 101, 108, 115, 10, 32, 32, 108, 101, // labels. le - 116, 32, 100, 97, 116, 101, 102, 109, 116, 32, 61, 32, // t datefmt = - 117, 110, 105, 120, 32, 61, 62, 32, 40, 110, 101, 119, // unix => (new - 32, 68, 97, 116, 101, 40, 117, 110, 105, 120, 32, 42, // Date(unix * - 32, 49, 48, 48, 48, 41, 41, 46, 116, 111, 73, 83, // 1000)).toIS - 79, 83, 116, 114, 105, 110, 103, 40, 41, 46, 115, 117, // OString().su - 98, 115, 116, 114, 40, 49, 52, 44, 32, 53, 41, 59, // bstr(14, 5); - 10, 32, 32, 108, 101, 116, 32, 120, 116, 97, 32, 61, // . let xta = - 32, 40, 110, 101, 119, 32, 65, 114, 114, 97, 121, 40, // (new Array( - 120, 116, 105, 99, 107, 115, 32, 43, 32, 49, 41, 41, // xticks + 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, 120, 116, 105, // es. let xti - 32, 61, 32, 105, 32, 61, 62, 32, 119, 49, 32, 43, // = i => w1 + - 32, 40, 119, 32, 45, 32, 119, 49, 32, 45, 32, 119, // (w - w1 - w - 50, 41, 32, 42, 32, 105, 32, 47, 32, 120, 116, 105, // 2) * i / xti - 99, 107, 115, 59, 32, 32, 32, 32, 32, 32, 32, 32, // cks; - 32, 32, 32, 32, 32, 32, 47, 47, 32, 105, 110, 100, // // ind - 101, 120, 39, 115, 32, 88, 10, 32, 32, 108, 101, 116, // ex's X. let - 32, 120, 116, 118, 32, 61, 32, 105, 32, 61, 62, 32, // xtv = i => - 100, 97, 116, 101, 102, 109, 116, 40, 120, 109, 105, 110, // datefmt(xmin - 32, 43, 32, 40, 120, 109, 97, 120, 32, 45, 32, 120, // + (xmax - x - 109, 105, 110, 41, 32, 42, 32, 105, 32, 47, 32, 120, // min) * i / x - 116, 105, 99, 107, 115, 41, 59, 10, 32, 32, 108, 101, // ticks);. le - 116, 32, 120, 116, 108, 32, 61, 32, 120, 32, 61, 62, // t xtl = x => - 32, 104, 116, 109, 108, 96, 60, 112, 97, 116, 104, 32, // html` - 96, 59, 10, 32, 32, 108, 101, 116, 32, 120, 116, 116, // `;. let xtt - 32, 61, 32, 40, 120, 44, 32, 118, 41, 32, 61, 62, // = (x, v) => - 10, 32, 32, 32, 32, 32, 32, 104, 116, 109, 108, 96, // . html` - 60, 116, 101, 120, 116, 32, 120, 61, 36, 123, 120, 32, // ${v}< - 47, 116, 101, 120, 116, 62, 96, 59, 10, 10, 32, 32, // /text>`;.. - 47, 47, 32, 84, 114, 97, 110, 115, 102, 111, 114, 109, // // Transform - 32, 100, 97, 116, 97, 32, 112, 111, 105, 110, 116, 115, // data points - 32, 97, 114, 114, 97, 121, 32, 105, 110, 116, 111, 32, // array into - 99, 111, 111, 114, 100, 105, 110, 97, 116, 101, 10, 32, // coordinate. - 32, 108, 101, 116, 32, 100, 120, 32, 61, 32, 118, 32, // let dx = v - 61, 62, 32, 119, 49, 32, 43, 32, 40, 118, 32, 45, // => w1 + (v - - 32, 120, 109, 105, 110, 41, 32, 47, 32, 40, 40, 120, // xmin) / ((x - 109, 97, 120, 32, 45, 32, 120, 109, 105, 110, 41, 32, // max - xmin) - 124, 124, 32, 49, 41, 32, 42, 32, 40, 119, 32, 45, // || 1) * (w - - 32, 119, 49, 32, 45, 32, 119, 50, 41, 59, 10, 32, // w1 - w2);. - 32, 108, 101, 116, 32, 100, 121, 32, 61, 32, 118, 32, // let dy = v - 61, 62, 32, 104, 32, 45, 32, 104, 50, 32, 45, 32, // => h - h2 - - 40, 118, 32, 45, 32, 121, 109, 105, 110, 41, 32, 47, // (v - ymin) / - 32, 40, 40, 121, 109, 97, 120, 32, 45, 32, 121, 109, // ((ymax - ym - 105, 110, 41, 32, 124, 124, 32, 49, 41, 32, 42, 32, // in) || 1) * - 40, 104, 32, 45, 32, 104, 49, 32, 45, 32, 104, 50, // (h - h1 - h2 - 41, 59, 10, 32, 32, 108, 101, 116, 32, 100, 100, 32, // );. let dd - 61, 32, 100, 97, 116, 97, 46, 109, 97, 112, 40, 112, // = data.map(p - 32, 61, 62, 32, 91, 77, 97, 116, 104, 46, 114, 111, // => [Math.ro - 117, 110, 100, 40, 100, 120, 40, 112, 91, 48, 93, 41, // und(dx(p[0]) - 41, 44, 32, 77, 97, 116, 104, 46, 114, 111, 117, 110, // ), Math.roun - 100, 40, 100, 121, 40, 112, 91, 49, 93, 41, 41, 93, // d(dy(p[1]))] - 41, 59, 10, 32, 32, 108, 101, 116, 32, 100, 100, 108, // );. let ddl - 32, 61, 32, 100, 100, 46, 108, 101, 110, 103, 116, 104, // = dd.length - 59, 10, 32, 32, 47, 47, 32, 65, 110, 100, 32, 112, // ;. // And p - 108, 111, 116, 32, 116, 104, 101, 32, 100, 97, 116, 97, // lot the data - 32, 97, 115, 32, 60, 112, 97, 116, 104, 62, 32, 101, // as e - 108, 101, 109, 101, 110, 116, 10, 32, 32, 108, 101, 116, // lement. let - 32, 98, 101, 103, 105, 110, 48, 32, 61, 32, 100, 100, // begin0 = dd - 108, 32, 63, 32, 96, 77, 32, 36, 123, 100, 100, 91, // l ? `M ${dd[ - 48, 93, 91, 48, 93, 125, 44, 36, 123, 100, 100, 91, // 0][0]},${dd[ - 48, 93, 91, 49, 93, 125, 96, 32, 58, 32, 96, 77, // 0][1]}` : `M - 32, 48, 44, 48, 96, 59, 10, 32, 32, 108, 101, 116, // 0,0`;. let - 32, 98, 101, 103, 105, 110, 32, 61, 32, 96, 77, 32, // begin = `M - 36, 123, 119, 49, 125, 44, 36, 123, 104, 32, 45, 32, // ${w1},${h - - 104, 50, 125, 96, 59, 32, 32, 47, 47, 32, 73, 110, // h2}`; // In - 105, 116, 105, 97, 108, 32, 112, 111, 105, 110, 116, 10, // itial point. - 32, 32, 108, 101, 116, 32, 101, 110, 100, 32, 61, 32, // let end = - 100, 100, 108, 32, 63, 32, 96, 76, 32, 36, 123, 100, // ddl ? `L ${d - 100, 91, 100, 100, 108, 32, 45, 32, 49, 93, 91, 48, // d[ddl - 1][0 - 93, 125, 44, 36, 123, 104, 32, 45, 32, 104, 50, 125, // ]},${h - h2} - 96, 32, 58, 32, 96, 76, 32, 36, 123, 119, 49, 125, // ` : `L ${w1} - 44, 36, 123, 104, 32, 45, 32, 104, 50, 125, 96, 59, // ,${h - h2}`; - 10, 32, 32, 108, 101, 116, 32, 115, 101, 114, 105, 101, // . let serie - 115, 32, 61, 32, 100, 100, 108, 32, 63, 32, 100, 100, // s = ddl ? dd - 46, 109, 97, 112, 40, 112, 32, 61, 62, 32, 96, 76, // .map(p => `L - 32, 36, 123, 112, 91, 48, 93, 125, 32, 36, 123, 112, // ${p[0]} ${p - 91, 49, 93, 125, 96, 41, 32, 58, 32, 91, 93, 59, // [1]}`) : []; - 10, 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, // .. return h - 116, 109, 108, 96, 10, 60, 115, 118, 103, 32, 118, 105, // tml`.. - 32, 60, 115, 116, 121, 108, 101, 62, 10, 32, 32, 32, // ` - 59, 10, 125, 59, 10, 10, 10, 99, 111, 110, 115, 116, // ;.};...const - 32, 67, 104, 97, 114, 116, 32, 61, 32, 102, 117, 110, // Chart = fun - 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, 41, // ction(props) - 32, 123, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, // {. const [ - 100, 97, 116, 97, 44, 32, 115, 101, 116, 68, 97, 116, // data, setDat - 97, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, // a] = useStat - 101, 40, 91, 93, 41, 59, 10, 32, 32, 117, 115, 101, // e([]);. use - 69, 102, 102, 101, 99, 116, 40, 40, 41, 32, 61, 62, // Effect(() => - 32, 123, 10, 32, 32, 32, 32, 99, 111, 110, 115, 116, // {. const - 32, 105, 100, 32, 61, 32, 80, 117, 98, 83, 117, 98, // id = PubSub - 46, 115, 117, 98, 115, 99, 114, 105, 98, 101, 40, 102, // .subscribe(f - 117, 110, 99, 116, 105, 111, 110, 40, 109, 115, 103, 41, // unction(msg) - 32, 123, 10, 32, 32, 32, 32, 32, 32, 105, 102, 32, // {. if - 40, 109, 115, 103, 46, 110, 97, 109, 101, 32, 33, 61, // (msg.name != - 32, 39, 109, 101, 116, 114, 105, 99, 115, 39, 41, 32, // 'metrics') - 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, 32, 32, // return;. - 32, 32, 115, 101, 116, 68, 97, 116, 97, 40, 120, 32, // setData(x - 61, 62, 32, 120, 46, 99, 111, 110, 99, 97, 116, 40, // => x.concat( - 91, 109, 115, 103, 46, 100, 97, 116, 97, 93, 41, 46, // [msg.data]). - 115, 112, 108, 105, 99, 101, 40, 45, 77, 97, 120, 77, // splice(-MaxM - 101, 116, 114, 105, 99, 115, 68, 97, 116, 97, 80, 111, // etricsDataPo - 105, 110, 116, 115, 41, 41, 59, 10, 32, 32, 32, 32, // ints));. - 125, 41, 59, 10, 32, 32, 32, 32, 114, 101, 116, 117, // });. retu - 114, 110, 32, 80, 117, 98, 83, 117, 98, 46, 117, 110, // rn PubSub.un - 115, 117, 98, 115, 99, 114, 105, 98, 101, 40, 105, 100, // subscribe(id - 41, 59, 10, 32, 32, 125, 44, 32, 91, 93, 41, 59, // );. }, []); - 10, 10, 32, 32, 108, 101, 116, 32, 120, 109, 97, 120, // .. let xmax - 32, 61, 32, 48, 44, 32, 109, 105, 115, 115, 105, 110, // = 0, missin - 103, 32, 61, 32, 77, 97, 120, 77, 101, 116, 114, 105, // g = MaxMetri - 99, 115, 68, 97, 116, 97, 80, 111, 105, 110, 116, 115, // csDataPoints - 32, 45, 32, 100, 97, 116, 97, 46, 108, 101, 110, 103, // - data.leng - 116, 104, 59, 10, 32, 32, 105, 102, 32, 40, 109, 105, // th;. if (mi - 115, 115, 105, 110, 103, 32, 62, 32, 48, 41, 32, 120, // ssing > 0) x - 109, 97, 120, 32, 61, 32, 77, 97, 116, 104, 46, 114, // max = Math.r - 111, 117, 110, 100, 40, 68, 97, 116, 101, 46, 110, 111, // ound(Date.no - 119, 40, 41, 32, 47, 32, 49, 48, 48, 48, 41, 32, // w() / 1000) - 43, 32, 109, 105, 115, 115, 105, 110, 103, 59, 10, 32, // + missing;. - 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, // `.
    . - 32, 32, 60, 104, 51, 32, 115, 116, 121, 108, 101, 61, //

    Data Chart< - 47, 104, 51, 62, 10, 32, 32, 60, 100, 105, 118, 32, // /h3>.
    . <${SVG - 125, 32, 104, 101, 105, 103, 104, 116, 61, 50, 52, 48, // } height=240 - 32, 119, 105, 100, 116, 104, 61, 54, 48, 48, 32, 121, // width=600 y - 109, 105, 110, 61, 48, 32, 121, 109, 97, 120, 61, 50, // min=0 ymax=2 - 48, 32, 120, 109, 97, 120, 61, 36, 123, 120, 109, 97, // 0 xmax=${xma - 120, 125, 32, 100, 97, 116, 97, 61, 36, 123, 100, 97, // x} data=${da - 116, 97, 125, 32, 47, 62, 10, 32, 32, 60, 47, 100, // ta} />. .
    . - 32, 32, 32, 32, 84, 104, 105, 115, 32, 99, 104, 97, // This cha - 114, 116, 32, 112, 108, 111, 116, 115, 32, 108, 105, 118, // rt plots liv - 101, 32, 115, 101, 110, 115, 111, 114, 32, 100, 97, 116, // e sensor dat - 97, 44, 32, 115, 101, 110, 116, 32, 98, 121, 32, 116, // a, sent by t - 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, 118, 105, // he device vi - 97, 32, 47, 97, 112, 105, 47, 119, 97, 116, 99, 104, // a /api/watch - 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, // ..
    .< - 47, 100, 105, 118, 62, 96, 59, 10, 125, 59, 10, 10, // /div>`;.};.. - 99, 111, 110, 115, 116, 32, 65, 112, 112, 32, 61, 32, // const App = - 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, 117, 115, 101, 114, 44, 32, 115, 101, 116, // t [user, set - 85, 115, 101, 114, 93, 32, 61, 32, 117, 115, 101, 83, // User] = useS - 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, 32, 32, // tate('');. - 99, 111, 110, 115, 116, 32, 91, 99, 111, 110, 102, 105, // const [confi - 103, 44, 32, 115, 101, 116, 67, 111, 110, 102, 105, 103, // g, setConfig - 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, // ] = useState - 40, 123, 125, 41, 59, 10, 10, 32, 32, 99, 111, 110, // ({});.. con - 115, 116, 32, 103, 101, 116, 99, 111, 110, 102, 105, 103, // st getconfig - 32, 61, 32, 40, 41, 32, 61, 62, 10, 32, 32, 32, // = () =>. - 32, 32, 32, 102, 101, 116, 99, 104, 40, 39, 47, 97, // fetch('/a - 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, 103, 101, // pi/config/ge - 116, 39, 44, 32, 123, 104, 101, 97, 100, 101, 114, 115, // t', {headers - 58, 32, 123, 65, 117, 116, 104, 111, 114, 105, 122, 97, // : {Authoriza - 116, 105, 111, 110, 58, 32, 39, 39, 125, 125, 41, 10, // tion: ''}}). - 32, 32, 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, 32, 32, 46, 116, 104, 101, 110, 40, 114, // .then(r - 32, 61, 62, 32, 115, 101, 116, 67, 111, 110, 102, 105, // => setConfi - 103, 40, 114, 41, 41, 10, 32, 32, 32, 32, 32, 32, // g(r)). - 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, // .catch(e - 114, 114, 32, 61, 62, 32, 99, 111, 110, 115, 111, 108, // rr => consol - 101, 46, 108, 111, 103, 40, 101, 114, 114, 41, 41, 59, // e.log(err)); - 10, 10, 32, 32, 47, 47, 32, 87, 97, 116, 99, 104, // .. // Watch - 32, 102, 111, 114, 32, 110, 111, 116, 105, 102, 105, 99, // for notific - 97, 116, 105, 111, 110, 115, 46, 32, 65, 115, 32, 115, // ations. As s - 111, 111, 110, 32, 97, 115, 32, 97, 32, 110, 111, 116, // oon as a not - 105, 102, 105, 99, 97, 116, 105, 111, 110, 32, 97, 114, // ification ar - 114, 105, 118, 101, 115, 44, 32, 112, 97, 115, 115, 32, // rives, pass - 105, 116, 32, 111, 110, 10, 32, 32, 47, 47, 32, 116, // it on. // t - 111, 32, 97, 108, 108, 32, 115, 117, 98, 115, 99, 114, // o all subscr - 105, 98, 101, 100, 32, 99, 111, 109, 112, 111, 110, 101, // ibed compone - 110, 116, 115, 10, 32, 32, 99, 111, 110, 115, 116, 32, // nts. const - 119, 97, 116, 99, 104, 32, 61, 32, 102, 117, 110, 99, // watch = func - 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, 32, // tion() {. - 32, 118, 97, 114, 32, 108, 32, 61, 32, 119, 105, 110, // var l = win - 100, 111, 119, 46, 108, 111, 99, 97, 116, 105, 111, 110, // dow.location - 44, 32, 112, 114, 111, 116, 111, 32, 61, 32, 108, 46, // , proto = l. - 112, 114, 111, 116, 111, 99, 111, 108, 46, 114, 101, 112, // protocol.rep - 108, 97, 99, 101, 40, 39, 104, 116, 116, 112, 39, 44, // lace('http', - 32, 39, 119, 115, 39, 41, 59, 10, 32, 32, 32, 32, // 'ws');. - 118, 97, 114, 32, 116, 105, 100, 44, 32, 119, 115, 85, // var tid, wsU - 82, 73, 32, 61, 32, 112, 114, 111, 116, 111, 32, 43, // RI = proto + - 32, 39, 47, 47, 39, 32, 43, 32, 108, 46, 104, 111, // '//' + l.ho - 115, 116, 32, 43, 32, 39, 47, 97, 112, 105, 47, 119, // st + '/api/w - 97, 116, 99, 104, 39, 10, 32, 32, 32, 32, 118, 97, // atch'. va - 114, 32, 114, 101, 99, 111, 110, 110, 101, 99, 116, 32, // r reconnect - 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // = function() - 32, 123, 10, 32, 32, 32, 32, 32, 32, 118, 97, 114, // {. var - 32, 119, 115, 32, 61, 32, 110, 101, 119, 32, 87, 101, // ws = new We - 98, 83, 111, 99, 107, 101, 116, 40, 119, 115, 85, 82, // bSocket(wsUR - 73, 41, 59, 10, 32, 32, 32, 32, 32, 32, 47, 47, // I);. // - 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, // ;. - 47, 47, 32, 105, 102, 32, 40, 109, 115, 103, 46, 110, // // if (msg.n - 97, 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, 114, // ame != 'metr - 105, 99, 115, 39, 41, 32, 99, 111, 110, 115, 111, 108, // ics') consol - 101, 46, 108, 111, 103, 40, 39, 119, 115, 45, 62, 39, // e.log('ws->' - 44, 32, 109, 115, 103, 41, 59, 10, 32, 32, 32, 32, // , msg);. - 32, 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, 32, // } catch - 40, 101, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, // (e) {. - 32, 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, // console. - 108, 111, 103, 40, 39, 73, 110, 118, 97, 108, 105, 100, // log('Invalid - 32, 119, 115, 32, 102, 114, 97, 109, 101, 58, 39, 44, // ws frame:', - 32, 101, 118, 46, 100, 97, 116, 97, 41, 59, 32, 32, // ev.data); - 47, 47, 32, 101, 115, 108, 105, 110, 116, 45, 100, 105, // // eslint-di - 115, 97, 98, 108, 101, 45, 108, 105, 110, 101, 10, 32, // sable-line. - 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, 61, // ws.onclose = - 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, // function() - 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 108, // {. cl - 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, 116, // earTimeout(t - 105, 100, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, // id);. - 32, 116, 105, 100, 32, 61, 32, 115, 101, 116, 84, 105, // tid = setTi - 109, 101, 111, 117, 116, 40, 114, 101, 99, 111, 110, 110, // meout(reconn - 101, 99, 116, 44, 32, 49, 48, 48, 48, 41, 59, 10, // ect, 1000);. - 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 110, 115, // cons - 111, 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, 32, // ole.log('ws - 100, 105, 115, 99, 111, 110, 110, 101, 99, 116, 101, 100, // disconnected - 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 125, 59, // ');. }; - 10, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, 32, // . };. - 114, 101, 99, 111, 110, 110, 101, 99, 116, 40, 41, 59, // reconnect(); - 10, 32, 32, 125, 59, 10, 10, 32, 32, 99, 111, 110, // . };.. 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}; - 32, 83, 101, 99, 117, 114, 101, 44, 32, 72, 116, 116, // Secure, Htt - 112, 79, 110, 108, 121, 59, 32, 83, 97, 109, 101, 83, // pOnly; SameS - 105, 116, 101, 61, 76, 97, 120, 59, 32, 112, 97, 116, // ite=Lax; pat - 104, 61, 47, 59, 32, 109, 97, 120, 45, 97, 103, 101, // h=/; max-age - 61, 51, 54, 48, 48, 96, 59, 10, 32, 32, 32, 32, // =3600`;. - 115, 101, 116, 85, 115, 101, 114, 40, 117, 46, 117, 115, // setUser(u.us - 101, 114, 41, 59, 10, 32, 32, 32, 32, 105, 102, 32, // er);. if - 40, 108, 111, 99, 97, 116, 105, 111, 110, 46, 115, 101, // (location.se - 97, 114, 99, 104, 46, 115, 117, 98, 115, 116, 114, 105, // arch.substri - 110, 103, 40, 49, 41, 32, 61, 61, 32, 39, 110, 111, // ng(1) == 'no - 119, 115, 39, 41, 32, 123, 10, 32, 32, 32, 32, 32, // ws') {. - 32, 47, 47, 32, 73, 102, 32, 113, 117, 101, 114, 121, // // If query - 32, 115, 116, 114, 105, 110, 103, 32, 105, 115, 32, 63, // string is ? - 110, 111, 119, 115, 44, 32, 116, 104, 101, 110, 32, 100, // nows, then d - 111, 32, 110, 111, 116, 32, 99, 111, 110, 110, 101, 99, // o not connec - 116, 32, 116, 111, 32, 119, 101, 98, 115, 111, 99, 107, // t to websock - 101, 116, 46, 32, 70, 111, 114, 32, 100, 101, 98, 117, // et. For debu - 103, 46, 10, 32, 32, 32, 32, 125, 32, 101, 108, 115, // g.. } els - 101, 32, 123, 10, 32, 32, 32, 32, 32, 32, 119, 97, // e {. wa - 116, 99, 104, 40, 41, 59, 32, 47, 47, 32, 67, 111, // tch(); // Co - 110, 110, 101, 99, 116, 32, 116, 111, 32, 119, 101, 98, // nnect to web - 115, 111, 99, 107, 101, 116, 44, 32, 114, 101, 99, 101, // socket, rece - 105, 118, 101, 32, 99, 111, 110, 115, 116, 97, 110, 116, // ive constant - 32, 103, 114, 97, 112, 104, 32, 117, 112, 100, 97, 116, // graph updat - 101, 115, 10, 32, 32, 32, 32, 125, 10, 32, 32, 32, // es. }. - 32, 114, 101, 116, 117, 114, 110, 32, 103, 101, 116, 99, // return getc - 111, 110, 102, 105, 103, 40, 41, 59, 10, 32, 32, 125, // onfig();. } - 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, // ;.. const l - 111, 103, 111, 117, 116, 32, 61, 32, 101, 118, 32, 61, // ogout = ev = - 62, 32, 123, 10, 32, 32, 32, 32, 100, 111, 99, 117, // > {. docu - 109, 101, 110, 116, 46, 99, 111, 111, 107, 105, 101, 32, // ment.cookie - 61, 32, 96, 97, 99, 99, 101, 115, 115, 95, 116, 111, // = `access_to - 107, 101, 110, 61, 59, 32, 83, 101, 99, 117, 114, 101, // ken=; Secure - 44, 32, 72, 116, 116, 112, 79, 110, 108, 121, 59, 32, // , HttpOnly; - 83, 97, 109, 101, 83, 105, 116, 101, 61, 76, 97, 120, // SameSite=Lax - 59, 32, 112, 97, 116, 104, 61, 47, 59, 32, 109, 97, // ; 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, 117, // );. };.. u - 115, 101, 69, 102, 102, 101, 99, 116, 40, 40, 41, 32, // seEffect(() - 61, 62, 32, 123, 10, 32, 32, 32, 32, 47, 47, 32, // => {. // - 67, 97, 108, 108, 101, 100, 32, 111, 110, 99, 101, 32, // Called once - 97, 116, 32, 105, 110, 105, 116, 32, 116, 105, 109, 101, // at init time - 10, 32, 32, 32, 32, 80, 117, 98, 83, 117, 98, 46, // . PubSub. - 115, 117, 98, 115, 99, 114, 105, 98, 101, 40, 109, 115, // subscribe(ms - 103, 32, 61, 62, 32, 109, 115, 103, 46, 110, 97, 109, // g => msg.nam - 101, 32, 61, 61, 32, 39, 99, 111, 110, 102, 105, 103, // e == 'config - 39, 32, 38, 38, 32, 103, 101, 116, 99, 111, 110, 102, // ' && getconf - 105, 103, 40, 41, 41, 59, 10, 32, 32, 32, 32, 102, // ig());. f - 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 108, // etch('/api/l - 111, 103, 105, 110, 39, 44, 32, 123, 104, 101, 97, 100, // ogin', {head - 101, 114, 115, 58, 32, 123, 65, 117, 116, 104, 111, 114, // ers: {Author - 105, 122, 97, 116, 105, 111, 110, 58, 32, 39, 39, 125, // ization: ''} - 125, 41, 10, 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, 46, 116, 104, 101, 110, 40, 114, 32, // .then(r - 61, 62, 32, 108, 111, 103, 105, 110, 40, 114, 41, 41, // => login(r)) - 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, // . .ca - 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, 115, // tch(err => s - 101, 116, 85, 115, 101, 114, 40, 39, 39, 41, 41, 59, // etUser('')); - 10, 32, 32, 125, 44, 32, 91, 93, 41, 59, 10, 10, // . }, []);.. - 32, 32, 105, 102, 32, 40, 33, 117, 115, 101, 114, 41, // if (!user) - 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, 108, // return html - 96, 60, 36, 123, 76, 111, 103, 105, 110, 125, 32, 108, // `<${Login} l - 111, 103, 105, 110, 61, 36, 123, 108, 111, 103, 105, 110, // ogin=${login - 125, 32, 47, 62, 96, 59, 10, 10, 32, 32, 114, 101, // } />`;.. re - 116, 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, // turn html`.< - 36, 123, 78, 97, 118, 125, 32, 117, 115, 101, 114, 61, // ${Nav} user= - 36, 123, 117, 115, 101, 114, 125, 32, 108, 111, 103, 111, // ${user} logo - 117, 116, 61, 36, 123, 108, 111, 103, 111, 117, 116, 125, // ut=${logout} - 32, 47, 62, 10, 60, 100, 105, 118, 32, 99, 108, 97, // />.
    .
    . - 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, //
    <${Hero} - 47, 62, 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, 67, 104, 97, 114, 116, 125, 32, 47, 62, // <${Chart} /> - 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, //
    . < - 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 99, // div class="c - 111, 108, 32, 99, 111, 108, 45, 54, 34, 62, 10, 32, // ol col-6">. - 32, 32, 32, 32, 32, 36, 123, 117, 115, 101, 114, 32, // ${user - 61, 61, 32, 39, 97, 100, 109, 105, 110, 39, 32, 38, // == 'admin' & - 38, 32, 104, 40, 67, 111, 110, 102, 105, 103, 117, 114, // & h(Configur - 97, 116, 105, 111, 110, 44, 32, 123, 99, 111, 110, 102, // ation, {conf - 105, 103, 125, 41, 125, 10, 32, 32, 32, 32, 60, 47, // ig})}. . <${M - 101, 115, 115, 97, 103, 101, 115, 125, 32, 99, 111, 110, // essages} con - 102, 105, 103, 61, 36, 123, 99, 111, 110, 102, 105, 103, // fig=${config - 125, 32, 47, 62, 60, 47, 100, 105, 118, 62, 10, 32, // } />
    . - 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, //
    .`;.};..win - 100, 111, 119, 46, 111, 110, 108, 111, 97, 100, 32, 61, // dow.onload = - 32, 40, 41, 32, 61, 62, 32, 114, 101, 110, 100, 101, // () => rende - 114, 40, 104, 40, 65, 112, 112, 41, 44, 32, 100, 111, // r(h(App), do - 99, 117, 109, 101, 110, 116, 46, 98, 111, 100, 121, 41, // cument.body) - 59, 10, 0 // ;. + 31, 139, 8, 8, 16, 107, 222, 99, 0, 3, 105, 110, // .....k.c..in + 100, 101, 120, 46, 104, 116, 109, 108, 0, 93, 144, 177, // dex.html.].. + 78, 196, 48, 12, 134, 247, 123, 138, 144, 153, 180, 176, // N.0...{..... + 49, 36, 149, 208, 245, 6, 38, 24, 64, 130, 49, 77, // 1$....&.@.1M + 124, 23, 67, 154, 148, 196, 237, 169, 111, 79, 218, 30, // |.C.....oO.. + 226, 196, 100, 255, 246, 103, 203, 254, 229, 77, 251, 188, // ..d..g...M.. + 127, 253, 120, 57, 48, 71, 189, 111, 118, 114, 9, 204, // ..x90G.ovr.. + 235, 112, 82, 28, 2, 111, 118, 140, 73, 7, 218, 46, // .pR..ov.I... + 73, 73, 9, 201, 67, 211, 194, 132, 6, 88, 171, 179, // II..C....X.. + 235, 162, 78, 86, 214, 91, 125, 99, 122, 32, 205, 140, // ..NV.[}cz .. + 211, 41, 3, 41, 62, 210, 81, 60, 112, 86, 95, 55, // .).)>.Q3 + 47, 244, 6, 21, 115, 235, 205, 228, 31, 137, 226, 92, // /...s....... + 130, 117, 1, 0, 0, 0 // .u... }; static const unsigned char v4[] = { + 31, 139, 8, 8, 16, 107, 222, 99, 0, 3, 117, 115, // .....k.c..us + 101, 114, 46, 112, 110, 103, 0, 1, 16, 15, 239, 240, // er.png...... 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.... @@ -3803,196 +1204,73 @@ static const unsigned char v4[] = { 103, 248, 119, 240, 239, 226, 191, 193, 127, 139, 199, 192, // g.w......... 99, 225, 49, 245, 232, 213, 255, 0, 58, 21, 99, 155, // c.1.....:.c. 126, 121, 49, 188, 0, 0, 0, 0, 73, 69, 78, 68, // ~y1.....IEND - 174, 66, 96, 130, 0 // .B`. + 174, 66, 96, 130, 199, 98, 29, 214, 16, 15, 0, 0, 0 // .B`..b...... }; static const unsigned char v5[] = { - 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, - 98, 111, 100, 121, 32, 123, 32, 109, 97, 114, 103, 105, // body { margi - 110, 58, 32, 48, 59, 32, 112, 97, 100, 100, 105, 110, // n: 0; paddin - 103, 58, 32, 48, 59, 32, 104, 101, 105, 103, 104, 116, // g: 0; height - 58, 32, 49, 48, 48, 37, 59, 32, 102, 111, 110, 116, // : 100%; font - 58, 32, 49, 54, 112, 120, 32, 115, 97, 110, 115, 45, // : 16px sans- - 115, 101, 114, 105, 102, 59, 32, 125, 10, 115, 101, 108, // serif; }.sel - 101, 99, 116, 44, 32, 105, 110, 112, 117, 116, 44, 32, // ect, input, - 108, 97, 98, 101, 108, 58, 58, 98, 101, 102, 111, 114, // label::befor - 101, 44, 32, 116, 101, 120, 116, 97, 114, 101, 97, 32, // e, textarea - 123, 32, 111, 117, 116, 108, 105, 110, 101, 58, 32, 110, // { outline: n - 111, 110, 101, 59, 32, 98, 111, 120, 45, 115, 104, 97, // one; box-sha - 100, 111, 119, 58, 110, 111, 110, 101, 32, 33, 105, 109, // dow:none !im - 112, 111, 114, 116, 97, 110, 116, 59, 32, 98, 111, 114, // portant; bor - 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, // der: 1px sol - 105, 100, 32, 35, 99, 99, 99, 32, 33, 105, 109, 112, // id #ccc !imp - 111, 114, 116, 97, 110, 116, 59, 32, 125, 10, 99, 111, // ortant; }.co - 100, 101, 44, 32, 112, 114, 101, 32, 123, 32, 99, 111, // de, pre { co - 108, 111, 114, 58, 32, 35, 51, 55, 51, 59, 32, 102, // lor: #373; f - 111, 110, 116, 45, 102, 97, 109, 105, 108, 121, 58, 32, // ont-family: - 109, 111, 110, 111, 115, 112, 97, 99, 101, 59, 32, 102, // monospace; f - 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, 32, // ont-weight: - 98, 111, 108, 100, 101, 114, 59, 32, 102, 111, 110, 116, // bolder; font - 45, 115, 105, 122, 101, 58, 32, 115, 109, 97, 108, 108, // -size: small - 101, 114, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // er; backgrou - 110, 100, 58, 32, 35, 100, 100, 100, 59, 32, 112, 97, // nd: #ddd; pa - 100, 100, 105, 110, 103, 58, 32, 48, 46, 49, 101, 109, // dding: 0.1em - 32, 48, 46, 51, 101, 109, 59, 32, 98, 111, 114, 100, // 0.3em; bord - 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0 - 46, 50, 101, 109, 59, 32, 125, 10, 116, 101, 120, 116, // .2em; }.text - 97, 114, 101, 97, 44, 32, 105, 110, 112, 117, 116, 44, // area, input, - 32, 46, 97, 100, 100, 111, 110, 32, 123, 32, 102, 111, // .addon { fo - 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, 53, 112, // nt-size: 15p - 120, 59, 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, // x; border: 1 - 112, 120, 32, 115, 111, 108, 105, 100, 32, 35, 99, 99, // px solid #cc - 99, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // c; padding: - 48, 46, 53, 101, 109, 59, 32, 125, 10, 97, 44, 32, // 0.5em; }.a, - 97, 58, 118, 105, 115, 105, 116, 101, 100, 44, 32, 97, // a:visited, a - 58, 97, 99, 116, 105, 118, 101, 32, 123, 32, 99, 111, // :active { co - 108, 111, 114, 58, 32, 35, 53, 53, 102, 59, 32, 125, // lor: #55f; } - 10, 46, 97, 100, 100, 111, 110, 32, 123, 32, 98, 97, // ..addon { ba - 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, 101, // ckground: #e - 101, 101, 59, 32, 32, 109, 105, 110, 45, 119, 105, 100, // ee; min-wid - 116, 104, 58, 32, 57, 101, 109, 59, 125, 10, 46, 98, // th: 9em;}..b - 116, 110, 32, 123, 10, 32, 32, 98, 97, 99, 107, 103, // tn {. backg - 114, 111, 117, 110, 100, 58, 32, 35, 99, 99, 99, 59, // round: #ccc; - 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi - 117, 115, 58, 32, 48, 46, 51, 101, 109, 59, 32, 98, // us: 0.3em; b - 111, 114, 100, 101, 114, 58, 32, 48, 59, 32, 99, 111, // order: 0; co - 108, 111, 114, 58, 32, 35, 102, 102, 102, 59, 32, 99, // lor: #fff; c - 117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, // ursor: point - 101, 114, 59, 10, 32, 32, 100, 105, 115, 112, 108, 97, // er;. displa - 121, 58, 32, 105, 110, 108, 105, 110, 101, 45, 98, 108, // y: inline-bl - 111, 99, 107, 59, 32, 112, 97, 100, 100, 105, 110, 103, // ock; padding - 58, 32, 48, 46, 54, 101, 109, 32, 50, 101, 109, 59, // : 0.6em 2em; - 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, // font-weight - 58, 32, 98, 111, 108, 100, 101, 114, 59, 10, 125, 10, // : bolder;.}. - 46, 98, 116, 110, 91, 100, 105, 115, 97, 98, 108, 101, // .btn[disable - 100, 93, 32, 123, 32, 111, 112, 97, 99, 105, 116, 121, // d] { opacity - 58, 32, 48, 46, 53, 59, 32, 99, 117, 114, 115, 111, // : 0.5; curso - 114, 58, 32, 97, 117, 116, 111, 59, 125, 10, 46, 115, // r: auto;}..s - 109, 111, 111, 116, 104, 32, 123, 32, 116, 114, 97, 110, // mooth { tran - 115, 105, 116, 105, 111, 110, 58, 32, 97, 108, 108, 32, // sition: all - 46, 50, 115, 59, 32, 125, 10, 46, 99, 111, 110, 116, // .2s; }..cont - 97, 105, 110, 101, 114, 32, 123, 32, 109, 97, 114, 103, // ainer { marg - 105, 110, 58, 32, 48, 32, 50, 48, 112, 120, 59, 32, // in: 0 20px; - 119, 105, 100, 116, 104, 58, 32, 97, 117, 116, 111, 59, // width: auto; - 32, 125, 10, 46, 100, 45, 102, 108, 101, 120, 32, 123, // }..d-flex { - 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 102, 108, // display: fl - 101, 120, 59, 32, 125, 10, 46, 100, 45, 110, 111, 110, // ex; }..d-non - 101, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, // e { display: - 32, 110, 111, 110, 101, 59, 32, 125, 10, 46, 98, 111, // none; }..bo - 114, 100, 101, 114, 32, 123, 32, 98, 111, 114, 100, 101, // rder { borde - 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, 100, // r: 1px solid - 32, 35, 100, 100, 100, 59, 32, 125, 10, 46, 114, 111, // #ddd; }..ro - 117, 110, 100, 101, 100, 32, 123, 32, 98, 111, 114, 100, // unded { bord - 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0 - 46, 53, 101, 109, 59, 32, 125, 10, 46, 110, 111, 119, // .5em; }..now - 114, 97, 112, 32, 123, 32, 119, 104, 105, 116, 101, 45, // rap { white- - 115, 112, 97, 99, 101, 58, 32, 110, 111, 119, 114, 97, // space: nowra - 112, 59, 32, 125, 10, 46, 109, 115, 103, 32, 123, 32, // p; }..msg { - 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, // background: - 35, 100, 101, 102, 59, 32, 98, 111, 114, 100, 101, 114, // #def; border - 45, 108, 101, 102, 116, 58, 32, 53, 112, 120, 32, 115, // -left: 5px s - 111, 108, 105, 100, 32, 35, 53, 57, 100, 59, 32, 112, // olid #59d; p - 97, 100, 100, 105, 110, 103, 58, 32, 48, 46, 53, 101, // adding: 0.5e - 109, 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, // m; font-size - 58, 32, 57, 48, 37, 59, 32, 109, 97, 114, 103, 105, // : 90%; margi - 110, 58, 32, 49, 101, 109, 32, 48, 59, 32, 125, 10, // n: 1em 0; }. - 46, 115, 101, 99, 116, 105, 111, 110, 32, 123, 32, 109, // .section { m - 97, 114, 103, 105, 110, 58, 32, 48, 32, 49, 101, 109, // argin: 0 1em - 59, 32, 125, 10, 46, 116, 111, 112, 105, 99, 44, 32, // ; }..topic, - 46, 100, 97, 116, 97, 44, 32, 46, 113, 111, 115, 32, // .data, .qos - 123, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // { padding: - 48, 46, 50, 101, 109, 32, 48, 46, 53, 101, 109, 59, // 0.2em 0.5em; - 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi - 117, 115, 58, 32, 48, 46, 52, 101, 109, 59, 32, 109, // us: 0.4em; m - 97, 114, 103, 105, 110, 45, 114, 105, 103, 104, 116, 58, // argin-right: - 32, 48, 46, 53, 101, 109, 59, 32, 32, 125, 10, 46, // 0.5em; }.. - 113, 111, 115, 32, 123, 32, 98, 97, 99, 107, 103, 114, // qos { backgr - 111, 117, 110, 100, 58, 32, 35, 101, 102, 97, 59, 32, // ound: #efa; - 125, 10, 46, 116, 111, 112, 105, 99, 32, 123, 32, 98, // }..topic { b - 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, // ackground: # - 102, 101, 97, 59, 32, 125, 10, 46, 100, 97, 116, 97, // fea; }..data - 32, 123, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // { backgroun - 100, 58, 32, 35, 97, 101, 102, 59, 32, 125, 10, 10, // d: #aef; }.. - 47, 42, 32, 71, 114, 105, 100, 32, 42, 47, 10, 46, // /* Grid */.. - 114, 111, 119, 32, 123, 32, 100, 105, 115, 112, 108, 97, // row { displa - 121, 58, 32, 102, 108, 101, 120, 59, 32, 102, 108, 101, // y: flex; fle - 120, 45, 119, 114, 97, 112, 58, 32, 119, 114, 97, 112, // x-wrap: wrap - 59, 32, 125, 10, 46, 99, 111, 108, 32, 123, 32, 109, // ; }..col { m - 97, 114, 103, 105, 110, 58, 32, 48, 59, 32, 112, 97, // argin: 0; pa - 100, 100, 105, 110, 103, 58, 32, 48, 59, 32, 111, 118, // dding: 0; ov - 101, 114, 102, 108, 111, 119, 58, 32, 97, 117, 116, 111, // erflow: auto - 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 50, 32, // ; }..col-12 - 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100 - 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 49, // %; }..col-11 - 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 57, 49, // { width: 91 - 46, 54, 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, // .66%; }..col - 45, 49, 48, 32, 123, 32, 119, 105, 100, 116, 104, 58, // -10 { width: - 32, 56, 51, 46, 51, 51, 37, 59, 32, 125, 10, 46, // 83.33%; }.. - 99, 111, 108, 45, 57, 32, 123, 32, 119, 105, 100, 116, // col-9 { widt - 104, 58, 32, 55, 53, 37, 59, 32, 125, 10, 46, 99, // h: 75%; }..c - 111, 108, 45, 56, 32, 123, 32, 119, 105, 100, 116, 104, // ol-8 { width - 58, 32, 54, 54, 46, 54, 54, 37, 59, 32, 125, 10, // : 66.66%; }. - 46, 99, 111, 108, 45, 55, 32, 123, 32, 119, 105, 100, // .col-7 { wid - 116, 104, 58, 32, 53, 56, 46, 51, 51, 37, 59, 32, // th: 58.33%; - 125, 10, 46, 99, 111, 108, 45, 54, 32, 123, 32, 119, // }..col-6 { w - 105, 100, 116, 104, 58, 32, 53, 48, 37, 59, 32, 125, // idth: 50%; } - 10, 46, 99, 111, 108, 45, 53, 32, 123, 32, 119, 105, // ..col-5 { wi - 100, 116, 104, 58, 32, 52, 49, 46, 54, 54, 37, 59, // dth: 41.66%; - 32, 125, 10, 46, 99, 111, 108, 45, 52, 32, 123, 32, // }..col-4 { - 119, 105, 100, 116, 104, 58, 32, 51, 51, 46, 51, 51, // width: 33.33 - 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 51, 32, // %; }..col-3 - 123, 32, 119, 105, 100, 116, 104, 58, 32, 50, 53, 37, // { width: 25% - 59, 32, 125, 10, 46, 99, 111, 108, 45, 50, 32, 123, // ; }..col-2 { - 32, 119, 105, 100, 116, 104, 58, 32, 49, 54, 46, 54, // width: 16.6 - 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, // 6%; }..col-1 - 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 56, 46, // { width: 8. - 51, 51, 37, 59, 32, 125, 10, 64, 109, 101, 100, 105, // 33%; }.@medi - 97, 32, 40, 109, 105, 110, 45, 119, 105, 100, 116, 104, // a (min-width - 58, 32, 49, 51, 49, 48, 112, 120, 41, 32, 123, 32, // : 1310px) { - 46, 99, 111, 110, 116, 97, 105, 110, 101, 114, 32, 123, // .container { - 32, 109, 97, 114, 103, 105, 110, 58, 32, 97, 117, 116, // margin: aut - 111, 59, 32, 119, 105, 100, 116, 104, 58, 32, 49, 50, // o; width: 12 - 55, 48, 112, 120, 59, 32, 125, 32, 125, 10, 64, 109, // 70px; } }.@m - 101, 100, 105, 97, 32, 40, 109, 97, 120, 45, 119, 105, // edia (max-wi - 100, 116, 104, 58, 32, 57, 50, 48, 112, 120, 41, 32, // dth: 920px) - 123, 32, 46, 114, 111, 119, 32, 46, 99, 111, 108, 32, // { .row .col - 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 v6[] = { - 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, // .. < - 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, // head>. Device - 68, 97, 115, 104, 98, 111, 97, 114, 100, 60, 47, 116, // Dashboard. . - 32, 32, 32, 60, 109, 101, 116, 97, 32, 104, 116, 116, // . - 32, 32, 32, 60, 109, 101, 116, 97, 32, 110, 97, 109, // . . - 10, 32, 32, 60, 98, 111, 100, 121, 62, 60, 47, 98, // .
    . . - 10, 0 // . + 31, 139, 8, 8, 16, 107, 222, 99, 0, 3, 115, 116, // .....k.c..st + 121, 108, 101, 46, 99, 115, 115, 0, 117, 84, 203, 110, // yle.css.uT.n + 219, 48, 16, 188, 251, 43, 88, 4, 5, 218, 32, 82, // .0...+X... R + 44, 41, 178, 99, 249, 210, 91, 63, 162, 232, 129, 18, // ,).c..[?.... + 87, 54, 17, 138, 84, 73, 58, 118, 90, 248, 223, 187, // W6..TI:vZ... + 164, 30, 164, 226, 228, 98, 75, 187, 163, 125, 204, 12, // .....bK..}.. + 121, 79, 254, 145, 90, 93, 18, 195, 255, 114, 121, 168, // yO..Z]...ry. + 240, 89, 51, 208, 9, 134, 246, 228, 186, 58, 218, 78, // .Y3......:.N + 60, 96, 140, 189, 33, 172, 163, 250, 192, 101, 69, 214, // <`..!....eE. + 123, 210, 83, 198, 60, 28, 159, 143, 192, 15, 71, 91, // {.S.<.....G[ + 145, 108, 189, 254, 186, 39, 173, 146, 238, 121, 211, 95, // .l...'...y._ + 136, 161, 210, 36, 6, 52, 111, 93, 41, 3, 2, 26, // ...$.4o])... + 251, 64, 184, 236, 79, 248, 39, 104, 13, 162, 170, 106, // .@..O.'h...j + 104, 149, 134, 7, 98, 225, 98, 169, 6, 138, 109, 212, // h...b.b...m. + 201, 10, 46, 161, 34, 82, 73, 216, 15, 195, 29, 41, // ...."RI....) + 83, 231, 202, 5, 200, 23, 222, 245, 74, 91, 42, 237, // S.......J[*. + 126, 28, 22, 219, 185, 110, 74, 112, 70, 238, 154, 166, // ~....nJpF... + 89, 64, 174, 171, 70, 49, 108, 208, 107, 192, 218, 141, // Y@..F1l.k... + 18, 10, 241, 119, 197, 182, 24, 70, 77, 90, 218, 113, // ...w...FMZ.q + 241, 86, 145, 78, 73, 101, 122, 218, 192, 24, 63, 143, // .V.NIez...?. + 91, 213, 74, 96, 139, 49, 136, 36, 225, 92, 166, 163, // [.J`.1.$.... + 66, 184, 88, 77, 155, 151, 131, 86, 39, 201, 176, 36, // B.XM...V'..$ + 99, 44, 230, 37, 205, 160, 195, 223, 2, 186, 105, 204, // c,.%......i. + 68, 83, 198, 79, 198, 229, 114, 23, 189, 174, 166, 165, // DS.O..r..... + 103, 82, 82, 252, 92, 73, 156, 51, 234, 150, 149, 253, // gRR..I.3.... + 229, 179, 77, 23, 13, 203, 161, 40, 86, 163, 213, 43, // ..M....(V..+ + 55, 220, 2, 115, 143, 180, 177, 252, 53, 222, 189, 44, // 7..s....5.., + 189, 30, 115, 175, 197, 22, 0, 72, 0, 233, 184, 76, // ..s....H...L + 206, 156, 217, 99, 69, 118, 88, 21, 193, 181, 69, 232, // ...cEvX...E. + 138, 44, 193, 126, 130, 155, 229, 162, 149, 189, 63, 166, // .,.~......?. + 190, 109, 139, 125, 155, 147, 54, 238, 173, 87, 92, 90, // .m.}..6..W.Z + 228, 16, 75, 50, 110, 122, 65, 81, 2, 46, 157, 238, // ..K2nzAQ.... + 73, 45, 84, 243, 178, 216, 108, 131, 84, 122, 202, 62, // I-T...l.Tz.> + 82, 102, 53, 76, 247, 11, 203, 208, 90, 0, 251, 237, // Rf5L....Z... + 44, 132, 66, 114, 251, 230, 89, 9, 61, 233, 201, 42, // ,.Br..Y.=..* + 183, 139, 233, 148, 178, 71, 132, 89, 141, 14, 229, 150, // .....G.Y.... + 43, 52, 53, 74, 74, 210, 220, 120, 102, 26, 108, 67, // +45JJ..xf.lC + 113, 20, 29, 155, 158, 228, 107, 39, 196, 72, 139, 175, // q.....k'.H.. + 229, 176, 44, 105, 5, 92, 16, 56, 175, 225, 222, 199, // ..,i...8.... + 148, 55, 108, 148, 26, 28, 237, 6, 246, 244, 248, 163, // .7l......... + 119, 163, 171, 55, 18, 98, 60, 203, 192, 102, 80, 68, // w..7.b<..fPD + 241, 40, 117, 42, 213, 89, 211, 30, 17, 231, 35, 202, // .(u*.Y....#. + 157, 120, 255, 186, 46, 46, 234, 1, 157, 57, 188, 87, // .x.......9.W + 152, 65, 59, 139, 38, 160, 69, 34, 203, 208, 187, 220, // .A;.&.E".... + 177, 91, 79, 69, 102, 220, 185, 35, 62, 81, 226, 29, // .[OEf..#>Q.. + 238, 219, 24, 60, 217, 220, 155, 41, 208, 149, 141, 51, // ...<...)...3 + 90, 213, 243, 6, 173, 205, 168, 69, 107, 166, 127, 148, // Z......Ek... + 65, 88, 220, 35, 247, 7, 165, 252, 240, 160, 60, 185, // AX.#......<. + 232, 80, 51, 209, 131, 236, 35, 212, 149, 30, 106, 45, // .P3...#...j- + 253, 219, 210, 208, 245, 125, 178, 133, 33, 233, 70, 121, // .....}..!.Fy + 159, 163, 224, 79, 197, 234, 241, 158, 252, 212, 72, 197, // ...O......H. + 253, 163, 83, 224, 124, 43, 172, 251, 77, 28, 193, 21, // ..S.|+..M... + 153, 105, 70, 139, 127, 126, 63, 170, 87, 208, 173, 192, // .iF..~?.W... + 235, 43, 152, 6, 241, 73, 150, 59, 221, 6, 55, 13, // .+...I.;..7. + 87, 231, 148, 200, 66, 98, 151, 165, 155, 77, 148, 90, // W...Bb...M.Z + 135, 212, 115, 145, 22, 69, 72, 237, 66, 102, 91, 134, // ..s..EH.Bf[. + 240, 115, 8, 111, 54, 139, 90, 219, 144, 41, 159, 23, // .s.o6.Z..).. + 165, 54, 81, 38, 154, 171, 12, 225, 167, 229, 88, 79, // .6Q&......XO + 33, 83, 44, 167, 42, 66, 38, 143, 166, 138, 87, 95, // !S,.*B&...W_ + 78, 21, 237, 62, 15, 245, 163, 3, 198, 41, 249, 22, // N..>.....).. + 221, 74, 89, 145, 225, 105, 252, 142, 224, 15, 15, 235, // .JY..i...... + 64, 244, 132, 205, 183, 254, 228, 94, 227, 82, 244, 50, // @......^.R.2 + 95, 112, 249, 84, 201, 201, 61, 74, 185, 212, 5, 63, // _p.T..=J...? + 252, 15, 225, 232, 67, 124, 39, 7, 0, 0, 0 // ....C|'... }; static const struct packed_file { @@ -4001,12 +1279,11 @@ static const struct packed_file { size_t size; time_t mtime; } packed_files[] = { - {"/web_root/main.js.orig", v1, sizeof(v1), 1656079031}, - {"/web_root/preact.min.js", v2, sizeof(v2), 1655487950}, - {"/web_root/main.js", v3, sizeof(v3), 1672175471}, - {"/web_root/user.png", v4, sizeof(v4), 1655487950}, - {"/web_root/style.css", v5, sizeof(v5), 1655487950}, - {"/web_root/index.html", v6, sizeof(v6), 1655487950}, + {"/web_root/main.js.gz", v1, sizeof(v1), 1675520784}, + {"/web_root/preact.min.js.gz", v2, sizeof(v2), 1675520784}, + {"/web_root/index.html.gz", v3, sizeof(v3), 1675520784}, + {"/web_root/user.png.gz", v4, sizeof(v4), 1675520784}, + {"/web_root/style.css.gz", v5, sizeof(v5), 1675520784}, {NULL, NULL, 0, 0} }; diff --git a/examples/stm32/nucleo-f429zi-baremetal/Makefile b/examples/stm32/nucleo-f429zi-baremetal/Makefile index f608d958..c0f6e05c 100644 --- a/examples/stm32/nucleo-f429zi-baremetal/Makefile +++ b/examples/stm32/nucleo-f429zi-baremetal/Makefile @@ -1,44 +1,60 @@ -CFLAGS ?= -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion \ - -Wformat-truncation -fno-common -Wconversion \ - -g3 -Os -ffunction-sections -fdata-sections -I. \ - -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 $(EXTRA_CFLAGS) -LDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map -SOURCES = boot.c main.c syscalls.c +# Download CMSIS header files from Github on demand +CMSIS_CORE_VERSION ?= 5.9.0 # ARM Cortex-M definitions +CMSIS_CORE_REPO ?= https://github.com/ARM-software/CMSIS_5 +CMSIS_DEVICE_VERSION ?= v2.6.8 # ST MCU peripheral definitions +CMSIS_DEVICE_REPO ?= https://github.com/STMicroelectronics/cmsis_device_f4 -# Add Mongoose-specific flags and source files +CFLAGS ?= -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion \ + -Wformat-truncation -fno-common -Wconversion \ + -g3 -Os -ffunction-sections -fdata-sections \ + -I . -I cmsis_core/CMSIS/Core/Include -I cmsis_device_f4/Include \ + -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 $(EXTRA_CFLAGS) +LDFLAGS ?= -Tlink.ld -nostdlib -nostartfiles --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map +SOURCES = main.c syscalls.c cmsis_device_f4/Source/Templates/gcc/startup_stm32f429xx.s + +# Mongoose-specific build flags and source code files +# Build options reference: https://mongoose.ws/documentation/#build-options CFLAGS += -I../../.. -DMG_ARCH=MG_ARCH_NEWLIB -DMG_ENABLE_CUSTOM_MILLIS=1 -DMG_ENABLE_MIP=1 -DMG_ENABLE_PACKED_FS=1 SOURCES += ../../../mongoose.c ../../device-dashboard/net.c ../../device-dashboard/packed_fs.c +# Build flashable .bin file all build example: firmware.bin +# .bin file is made from .elf file, by concatenating .text and .data sections firmware.bin: firmware.elf arm-none-eabi-objcopy -O binary $< $@ -firmware.elf: $(SOURCES) mcu.h +# .elf file is produced by compiling sources +firmware.elf: $(SOURCES) hal.h link.ld cmsis_core cmsis_device_f4 arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(LDFLAGS) -o $@ -# Note: on "unknown chip id" flash error, wire BOOT0 to VDD and st-flash erase +# Flash .bin file to the target board via the built-in debugger flash: firmware.bin st-flash --reset write $< 0x8000000 +# Download ST's CMSIS headers with peripheral definitions +cmsis_device_f4/Source/Templates/gcc/startup_stm32f429xx.s: cmsis_device_f4 +cmsis_device_f4: + git clone --depth 1 -b $(CMSIS_DEVICE_VERSION) $(CMSIS_DEVICE_REPO) $@ + +# Download ARM's CMSIS headers with core Cortex-M definitions +cmsis_core: + git clone --depth 1 -b $(CMSIS_CORE_VERSION) $(CMSIS_CORE_REPO) $@ + # Requires env variable VCON_API_KEY set DEVICE_URL ?= https://dash.vcon.io/api/v3/devices/2 # Upload firmware to a remote test device update: firmware.bin - curl --fail -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$< + curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$< # Read serial port on a remote test device for 5 seconds, store in a # temporary file, and check the output for expected patterns test: EXTRA_CFLAGS += -DUART_DEBUG=UART1 test: update - curl --fail -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt + curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt grep 'Ethernet: up' /tmp/output.txt # Check for network init grep 'MQTT connected' /tmp/output.txt # Check for MQTT connection success -# Read serial port on a remote test device for 5 seconds -tx: - curl -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 - clean: - @rm -rf firmware.* *.su + @rm -rf firmware.* *.su cmsis_core cmsis_device_f4 diff --git a/examples/stm32/nucleo-f429zi-baremetal/boot.c b/examples/stm32/nucleo-f429zi-baremetal/boot.c deleted file mode 100644 index 54843c96..00000000 --- a/examples/stm32/nucleo-f429zi-baremetal/boot.c +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 2022 Cesanta Software Limited -// All rights reserved - -// Startup code -__attribute__((naked, noreturn)) void _reset(void) { - // Initialise memory - extern long _sbss, _ebss, _sdata, _edata, _sidata; - for (long *src = &_sbss; src < &_ebss; src++) *src = 0; - for (long *src = &_sdata, *dst = &_sidata; src < &_edata;) *src++ = *dst++; - - // Call main() - extern void main(void); - main(); - for (;;) (void) 0; -} - -void __attribute__((weak)) DefaultIRQHandler(void) { - for (;;) (void) 0; -} - -#define WEAK_ALIAS __attribute__((weak, alias("DefaultIRQHandler"))) - -WEAK_ALIAS void NMI_Handler(void); -WEAK_ALIAS void HardFault_Handler(void); -WEAK_ALIAS void MemManage_Handler(void); -WEAK_ALIAS void BusFault_Handler(void); -WEAK_ALIAS void UsageFault_Handler(void); -WEAK_ALIAS void SVC_Handler(void); -WEAK_ALIAS void DebugMon_Handler(void); -WEAK_ALIAS void PendSV_Handler(void); -WEAK_ALIAS void SysTick_Handler(void); - -WEAK_ALIAS void WWDG_IRQHandler(void); -WEAK_ALIAS void PVD_IRQHandler(void); -WEAK_ALIAS void TAMP_STAMP_IRQHandler(void); -WEAK_ALIAS void RTC_WKUP_IRQHandler(void); -WEAK_ALIAS void FLASH_IRQHandler(void); -WEAK_ALIAS void RCC_IRQHandler(void); -WEAK_ALIAS void EXTI0_IRQHandler(void); -WEAK_ALIAS void EXTI1_IRQHandler(void); -WEAK_ALIAS void EXTI2_IRQHandler(void); -WEAK_ALIAS void EXTI3_IRQHandler(void); -WEAK_ALIAS void EXTI4_IRQHandler(void); -WEAK_ALIAS void EXTI9_5_IRQHandler(void); -WEAK_ALIAS void EXTI15_10_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream0_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream1_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream2_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream3_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream4_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream5_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream6_IRQHandler(void); -WEAK_ALIAS void ADC_IRQHandler(void); -WEAK_ALIAS void CAN1_TX_IRQHandler(void); -WEAK_ALIAS void CAN1_RX0_IRQHandler(void); -WEAK_ALIAS void CAN1_RX1_IRQHandler(void); -WEAK_ALIAS void CAN1_SCE_IRQHandler(void); -WEAK_ALIAS void TIM1_BRK_TIM9_IRQHandler(void); -WEAK_ALIAS void TIM1_UP_TIM10_IRQHandler(void); -WEAK_ALIAS void TIM1_TRG_COM_TIM11_IRQHandler(void); -WEAK_ALIAS void TIM1_CC_IRQHandler(void); -WEAK_ALIAS void TIM2_IRQHandler(void); -WEAK_ALIAS void TIM3_IRQHandler(void); -WEAK_ALIAS void TIM4_IRQHandler(void); -WEAK_ALIAS void I2C1_EV_IRQHandler(void); -WEAK_ALIAS void I2C1_ER_IRQHandler(void); -WEAK_ALIAS void I2C2_EV_IRQHandler(void); -WEAK_ALIAS void I2C2_ER_IRQHandler(void); -WEAK_ALIAS void SPI1_IRQHandler(void); -WEAK_ALIAS void SPI2_IRQHandler(void); -WEAK_ALIAS void USART1_IRQHandler(void); -WEAK_ALIAS void USART2_IRQHandler(void); -WEAK_ALIAS void USART3_IRQHandler(void); -WEAK_ALIAS void RTC_Alarm_IRQHandler(void); -WEAK_ALIAS void OTG_FS_WKUP_IRQHandler(void); -WEAK_ALIAS void TIM8_BRK_TIM12_IRQHandler(void); -WEAK_ALIAS void TIM8_UP_TIM13_IRQHandler(void); -WEAK_ALIAS void TIM8_TRG_COM_TIM14_IRQHandler(void); -WEAK_ALIAS void TIM8_CC_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream7_IRQHandler(void); -WEAK_ALIAS void FMC_IRQHandler(void); -WEAK_ALIAS void SDMMC1_IRQHandler(void); -WEAK_ALIAS void TIM5_IRQHandler(void); -WEAK_ALIAS void SPI3_IRQHandler(void); -WEAK_ALIAS void UART4_IRQHandler(void); -WEAK_ALIAS void UART5_IRQHandler(void); -WEAK_ALIAS void TIM6_DAC_IRQHandler(void); -WEAK_ALIAS void TIM7_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream0_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream1_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream2_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream3_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream4_IRQHandler(void); -WEAK_ALIAS void ETH_IRQHandler(void); -WEAK_ALIAS void ETH_WKUP_IRQHandler(void); -WEAK_ALIAS void CAN2_TX_IRQHandler(void); -WEAK_ALIAS void CAN2_RX0_IRQHandler(void); -WEAK_ALIAS void CAN2_RX1_IRQHandler(void); -WEAK_ALIAS void CAN2_SCE_IRQHandler(void); -WEAK_ALIAS void OTG_FS_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream5_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream6_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream7_IRQHandler(void); -WEAK_ALIAS void USART6_IRQHandler(void); -WEAK_ALIAS void I2C3_EV_IRQHandler(void); -WEAK_ALIAS void I2C3_ER_IRQHandler(void); -WEAK_ALIAS void OTG_HS_EP1_OUT_IRQHandler(void); -WEAK_ALIAS void OTG_HS_EP1_IN_IRQHandler(void); -WEAK_ALIAS void OTG_HS_WKUP_IRQHandler(void); -WEAK_ALIAS void OTG_HS_IRQHandler(void); -WEAK_ALIAS void DCMI_IRQHandler(void); -WEAK_ALIAS void RNG_IRQHandler(void); -WEAK_ALIAS void FPU_IRQHandler(void); -WEAK_ALIAS void UART7_IRQHandler(void); -WEAK_ALIAS void UART8_IRQHandler(void); -WEAK_ALIAS void SPI4_IRQHandler(void); -WEAK_ALIAS void SPI5_IRQHandler(void); -WEAK_ALIAS void SPI6_IRQHandler(void); -WEAK_ALIAS void SAI1_IRQHandler(void); -WEAK_ALIAS void LTDC_IRQHandler(void); -WEAK_ALIAS void LTDC_ER_IRQHandler(void); -WEAK_ALIAS void DMA2D_IRQHandler(void); - -// IRQ table -extern void _estack(); -__attribute__((section(".vectors"))) void (*tab[16 + 91])(void) = { - // Cortex interrupts - _estack, _reset, NMI_Handler, HardFault_Handler, MemManage_Handler, - BusFault_Handler, UsageFault_Handler, 0, 0, 0, 0, SVC_Handler, - DebugMon_Handler, 0, PendSV_Handler, SysTick_Handler, - - // Interrupts from peripherals - WWDG_IRQHandler, PVD_IRQHandler, TAMP_STAMP_IRQHandler, RTC_WKUP_IRQHandler, - FLASH_IRQHandler, RCC_IRQHandler, EXTI0_IRQHandler, EXTI1_IRQHandler, - EXTI2_IRQHandler, EXTI3_IRQHandler, EXTI4_IRQHandler, - DMA1_Stream0_IRQHandler, DMA1_Stream1_IRQHandler, DMA1_Stream2_IRQHandler, - DMA1_Stream3_IRQHandler, DMA1_Stream4_IRQHandler, DMA1_Stream5_IRQHandler, - DMA1_Stream6_IRQHandler, ADC_IRQHandler, CAN1_TX_IRQHandler, - CAN1_RX0_IRQHandler, CAN1_RX1_IRQHandler, CAN1_SCE_IRQHandler, - EXTI9_5_IRQHandler, TIM1_BRK_TIM9_IRQHandler, TIM1_UP_TIM10_IRQHandler, - TIM1_TRG_COM_TIM11_IRQHandler, TIM1_CC_IRQHandler, TIM2_IRQHandler, - TIM3_IRQHandler, TIM4_IRQHandler, I2C1_EV_IRQHandler, I2C1_ER_IRQHandler, - I2C2_EV_IRQHandler, I2C2_ER_IRQHandler, SPI1_IRQHandler, SPI2_IRQHandler, - USART1_IRQHandler, USART2_IRQHandler, USART3_IRQHandler, - EXTI15_10_IRQHandler, RTC_Alarm_IRQHandler, OTG_FS_WKUP_IRQHandler, - TIM8_BRK_TIM12_IRQHandler, TIM8_UP_TIM13_IRQHandler, - TIM8_TRG_COM_TIM14_IRQHandler, TIM8_CC_IRQHandler, DMA1_Stream7_IRQHandler, - FMC_IRQHandler, SDMMC1_IRQHandler, TIM5_IRQHandler, SPI3_IRQHandler, - UART4_IRQHandler, UART5_IRQHandler, TIM6_DAC_IRQHandler, TIM7_IRQHandler, - DMA2_Stream0_IRQHandler, DMA2_Stream1_IRQHandler, DMA2_Stream2_IRQHandler, - DMA2_Stream3_IRQHandler, DMA2_Stream4_IRQHandler, ETH_IRQHandler, - ETH_WKUP_IRQHandler, CAN2_TX_IRQHandler, CAN2_RX0_IRQHandler, - CAN2_RX1_IRQHandler, CAN2_SCE_IRQHandler, OTG_FS_IRQHandler, - DMA2_Stream5_IRQHandler, DMA2_Stream6_IRQHandler, DMA2_Stream7_IRQHandler, - USART6_IRQHandler, I2C3_EV_IRQHandler, I2C3_ER_IRQHandler, - OTG_HS_EP1_OUT_IRQHandler, OTG_HS_EP1_IN_IRQHandler, OTG_HS_WKUP_IRQHandler, - OTG_HS_IRQHandler, DCMI_IRQHandler, 0, RNG_IRQHandler, FPU_IRQHandler, - UART7_IRQHandler, UART8_IRQHandler, SPI4_IRQHandler, SPI5_IRQHandler, - SPI6_IRQHandler, SAI1_IRQHandler, LTDC_IRQHandler, LTDC_ER_IRQHandler, - DMA2D_IRQHandler}; diff --git a/examples/stm32/nucleo-f429zi-baremetal/mcu.h b/examples/stm32/nucleo-f429zi-baremetal/hal.h similarity index 63% rename from examples/stm32/nucleo-f429zi-baremetal/mcu.h rename to examples/stm32/nucleo-f429zi-baremetal/hal.h index 57ed552b..5dc375b8 100644 --- a/examples/stm32/nucleo-f429zi-baremetal/mcu.h +++ b/examples/stm32/nucleo-f429zi-baremetal/hal.h @@ -4,6 +4,8 @@ #pragma once +#include + #include #include #include @@ -26,76 +28,18 @@ enum { PLL_HSI = 16, PLL_M = 8, PLL_N = 180, PLL_P = 2 }; // Run at 180 Mhz #define APB1_FREQUENCY (SYS_FREQUENCY / (BIT(APB1_PRE - 3))) static inline void spin(volatile uint32_t count) { - while (count--) asm("nop"); + while (count--) (void) 0; } -struct rcc { - volatile uint32_t CR, PLLCFGR, CFGR, CIR, AHB1RSTR, AHB2RSTR, AHB3RSTR, - RESERVED0, APB1RSTR, APB2RSTR, RESERVED1[2], AHB1ENR, AHB2ENR, AHB3ENR, - RESERVED2, APB1ENR, APB2ENR, RESERVED3[2], AHB1LPENR, AHB2LPENR, - AHB3LPENR, RESERVED4, APB1LPENR, APB2LPENR, RESERVED5[2], BDCR, CSR, - RESERVED6[2], SSCGR, PLLI2SCFGR; -}; -#define RCC ((struct rcc *) 0x40023800) - -struct pwr { - volatile uint32_t CR, CSR; -}; -#define PWR ((struct pwr *) 0x40007000) - -struct nvic { - volatile uint32_t ISER[8], RESERVED0[24], ICER[8], RSERVED1[24], ISPR[8], - RESERVED2[24], ICPR[8], RESERVED3[24], IABR[8], RESERVED4[56], IP[240], - RESERVED5[644], STIR; -}; -#define NVIC ((struct nvic *) 0xe000e100) -static inline void nvic_set_prio(int irq, uint32_t prio) { - NVIC->IP[irq] = prio << 4; -} -static inline void nvic_enable_irq(int irq) { - NVIC->ISER[irq >> 5] = (uint32_t) (1 << (irq & 31)); -} - -struct systick { - volatile uint32_t CTRL, LOAD, VAL, CALIB; -}; -#define SYSTICK ((struct systick *) 0xe000e010) // 2.2.2 -static inline void systick_init(uint32_t ticks) { - if ((ticks - 1) > 0xffffff) return; // Systick timer is 24 bit - SYSTICK->LOAD = ticks - 1; - SYSTICK->VAL = 0; - SYSTICK->CTRL = BIT(0) | BIT(1) | BIT(2); // Enable systick -} - -struct flash { - volatile uint32_t ACR, KEYR, OPTKEYR, SR, CR, AR, RESERVED, OBR, WRPR; -}; -#define FLASH ((struct flash *) 0x40023c00) - -struct scb { - volatile uint32_t CPUID, ICSR, VTOR, AIRCR, SCR, CCR, SHPR[3], SHCSR, CFSR, - HFSR, DFSR, MMFAR, BFAR, AFSR, ID_PFR[2], ID_DFR, ID_AFR, ID_MFR[4], - ID_ISAR[5], RESERVED0[1], CLIDR, CTR, CCSIDR, CSSELR, CPACR, - RESERVED3[93], STIR, RESERVED4[15], MVFR0, MVFR1, MVFR2, RESERVED5[1], - ICIALLU, RESERVED6[1], ICIMVAU, DCIMVAC, DCISW, DCCMVAU, DCCMVAC, DCCSW, - DCCIMVAC, DCCISW, RESERVED7[6], ITCMCR, DTCMCR, AHBPCR, CACR, AHBSCR, - RESERVED8[1], ABFSR; -}; -#define SCB ((struct scb *) 0xe000ed00) - enum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_AF, GPIO_MODE_ANALOG }; enum { GPIO_OTYPE_PUSH_PULL, GPIO_OTYPE_OPEN_DRAIN }; enum { GPIO_SPEED_LOW, GPIO_SPEED_MEDIUM, GPIO_SPEED_HIGH, GPIO_SPEED_INSANE }; enum { GPIO_PULL_NONE, GPIO_PULL_UP, GPIO_PULL_DOWN }; +#define GPIO(N) ((GPIO_TypeDef *) (0x40020000 + 0x400 * (N))) -struct gpio { - volatile uint32_t MODER, OTYPER, OSPEEDR, PUPDR, IDR, ODR, BSRR, LCKR, AFR[2]; -}; -#define GPIO(N) ((struct gpio *) (0x40020000 + 0x400 * (N))) - -static struct gpio *gpio_bank(uint16_t pin) { return GPIO(PINBANK(pin)); } +static GPIO_TypeDef *gpio_bank(uint16_t pin) { return GPIO(PINBANK(pin)); } static inline void gpio_toggle(uint16_t pin) { - struct gpio *gpio = gpio_bank(pin); + GPIO_TypeDef *gpio = gpio_bank(pin); uint32_t mask = BIT(PINNO(pin)); gpio->BSRR = mask << (gpio->ODR & mask ? 16 : 0); } @@ -103,12 +47,12 @@ static inline int gpio_read(uint16_t pin) { return gpio_bank(pin)->IDR & BIT(PINNO(pin)) ? 1 : 0; } static inline void gpio_write(uint16_t pin, bool val) { - struct gpio *gpio = gpio_bank(pin); + GPIO_TypeDef *gpio = gpio_bank(pin); gpio->BSRR = BIT(PINNO(pin)) << (val ? 0 : 16); } static inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type, uint8_t speed, uint8_t pull, uint8_t af) { - struct gpio *gpio = gpio_bank(pin); + GPIO_TypeDef *gpio = gpio_bank(pin); uint8_t n = (uint8_t) (PINNO(pin)); RCC->AHB1ENR |= BIT(PINBANK(pin)); // Enable GPIO clock SETBITS(gpio->OTYPER, 1UL << n, ((uint32_t) type) << n); @@ -127,6 +71,7 @@ static inline void gpio_output(uint16_t pin) { GPIO_PULL_NONE, 0); } +#if 0 struct syscfg { volatile uint32_t MEMRMP, PMC, EXTICR[4], RESERVED[2], CMPCR; }; @@ -136,6 +81,7 @@ struct exti { volatile uint32_t IMR, EMR, RTSR, FTSR, SWIER, PR; }; #define EXTI ((struct exti *) 0x40013c00) +#endif static inline void irq_exti_attach(uint16_t pin) { uint8_t bank = (uint8_t) (PINBANK(pin)), n = (uint8_t) (PINNO(pin)); @@ -146,22 +92,28 @@ static inline void irq_exti_attach(uint16_t pin) { EXTI->RTSR |= BIT(n); EXTI->FTSR |= BIT(n); int irqvec = n < 5 ? 6 + n : n < 10 ? 23 : 40; // IRQ vector index, 10.1.2 - nvic_set_prio(irqvec, 3); - nvic_enable_irq(irqvec); + NVIC_SetPriority(irqvec, 3); + NVIC_EnableIRQ(irqvec); } -struct uart { +#if 0 +USART_TypeDef { volatile uint32_t SR, DR, BRR, CR1, CR2, CR3, GTPR; }; -#define UART1 ((struct uart *) 0x40011000) -#define UART2 ((struct uart *) 0x40004400) -#define UART3 ((struct uart *) 0x40004800) +#define UART1 ((USART_TypeDef *) 0x40011000) +#define UART2 ((USART_TypeDef *) 0x40004400) +#define UART3 ((USART_TypeDef *) 0x40004800) +#endif + +#define UART1 USART1 +#define UART2 USART2 +#define UART3 USART3 #ifndef UART_DEBUG #define UART_DEBUG UART3 #endif -static inline void uart_init(struct uart *uart, unsigned long baud) { +static inline void uart_init(USART_TypeDef *uart, unsigned long baud) { // https://www.st.com/resource/en/datasheet/stm32f429zi.pdf uint8_t af = 7; // Alternate function uint16_t rx = 0, tx = 0; // pins @@ -181,17 +133,17 @@ static inline void uart_init(struct uart *uart, unsigned long baud) { uart->BRR = freq / baud; // Set baud rate uart->CR1 |= BIT(13) | BIT(2) | BIT(3); // Set UE, RE, TE } -static inline void uart_write_byte(struct uart *uart, uint8_t byte) { +static inline void uart_write_byte(USART_TypeDef *uart, uint8_t byte) { uart->DR = byte; while ((uart->SR & BIT(7)) == 0) spin(1); } -static inline void uart_write_buf(struct uart *uart, char *buf, size_t len) { +static inline void uart_write_buf(USART_TypeDef *uart, char *buf, size_t len) { while (len-- > 0) uart_write_byte(uart, *(uint8_t *) buf++); } -static inline int uart_read_ready(struct uart *uart) { +static inline int uart_read_ready(USART_TypeDef *uart) { return uart->SR & BIT(5); // If RXNE bit is set, data is ready } -static inline uint8_t uart_read_byte(struct uart *uart) { +static inline uint8_t uart_read_byte(USART_TypeDef *uart) { return (uint8_t) (uart->DR & 255); } @@ -199,9 +151,8 @@ static inline void clock_init(void) { // Set clock frequency SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); // Enable FPU asm("DSB"); asm("ISB"); - FLASH->ACR |= FLASH_LATENCY | BIT(8) | - BIT(9); // Flash latency, prefetch, Icache, Dcache - RCC->PLLCFGR &= ~((BIT(17) - 1)); // Clear PLL multipliers + FLASH->ACR |= FLASH_LATENCY | BIT(8) | BIT(9); // Flash latency + RCC->PLLCFGR &= ~((BIT(17) - 1)); // Clear PLL multipliers RCC->PLLCFGR |= (((PLL_P - 2) / 2) & 3) << 16; // Set PLL_P RCC->PLLCFGR |= PLL_M | (PLL_N << 6); // Set PLL_M and PLL_N RCC->CR |= BIT(24); // Enable PLL diff --git a/examples/stm32/nucleo-f429zi-baremetal/link.ld b/examples/stm32/nucleo-f429zi-baremetal/link.ld index b262649d..b973269b 100644 --- a/examples/stm32/nucleo-f429zi-baremetal/link.ld +++ b/examples/stm32/nucleo-f429zi-baremetal/link.ld @@ -1,14 +1,14 @@ -ENTRY(_reset); +ENTRY(Reset_Handler); MEMORY { - flash(rx) : ORIGIN = 0x08000000, LENGTH = 2048k + flash(rx) : ORIGIN = 0x08000000, LENGTH = 2048k sram(rwx) : ORIGIN = 0x20000000, LENGTH = 192k /* remaining 64k in a separate address space */ } _estack = ORIGIN(sram) + LENGTH(sram); /* stack points to end of SRAM */ SECTIONS { - .vectors : { KEEP(*(.vectors)) } > flash - .text : { *(.text*) } > flash - .rodata : { *(.rodata*) } > flash + .vectors : { KEEP(*(.isr_vector)) } > flash + .text : { *(.text* .text.*) } > flash + .rodata : { *(.rodata*) } > flash .data : { _sdata = .; /* for init_ram() */ diff --git a/examples/stm32/nucleo-f429zi-baremetal/main.c b/examples/stm32/nucleo-f429zi-baremetal/main.c index c8bd14e8..4dbfb8fa 100644 --- a/examples/stm32/nucleo-f429zi-baremetal/main.c +++ b/examples/stm32/nucleo-f429zi-baremetal/main.c @@ -1,7 +1,7 @@ -// Copyright (c) 2022 Cesanta Software Limited +// Copyright (c) 2022-2023 Cesanta Software Limited // All rights reserved -#include "mcu.h" +#include "hal.h" #include "mongoose.h" #define LED1 PIN('B', 0) // On-board LED pin (green) @@ -31,20 +31,23 @@ void EXTI15_10_IRQHandler(void) { // External interrupt handler gpio_write(LED1, gpio_read(BTN1)); // No debounce. Turn LED if button pressed } -static void timer_cb(void *arg) { +void SystemInit(void) { // Called automatically by startup code + clock_init(); // Set clock to 180MHz + SysTick_Config(SYS_FREQUENCY / 1000); // Increment s_ticks every ms +} + +static void timer_fn(void *arg) { gpio_toggle(LED2); // Blink LED bool up = ((struct mip_if *) arg)->state == MIP_STATE_READY; MG_INFO(("Ethernet: %s", up ? "up" : "down")); // Show network status } int main(void) { - clock_init(); // Set clock to 180MHz - systick_init(SYS_FREQUENCY / 1000); // Increment s_ticks every ms - gpio_output(LED1); // Setup green LED - gpio_output(LED2); // Setup blue LED - gpio_input(BTN1); // Set button to input - irq_exti_attach(BTN1); // Attach BTN1 to exti - uart_init(UART_DEBUG, 115200); // Initialise debug printf + gpio_output(LED1); // Setup green LED + gpio_output(LED2); // Setup blue LED + gpio_input(BTN1); // Set button to input + irq_exti_attach(BTN1); // Attach BTN1 to exti + uart_init(UART_DEBUG, 115200); // Initialise debug printf MG_INFO(("Starting, CPU freq %g MHz", (double) SYS_FREQUENCY / 1000000)); @@ -57,7 +60,7 @@ int main(void) { gpio_init(pins[i], GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_INSANE, GPIO_PULL_NONE, 11); } - nvic_enable_irq(61); // Setup Ethernet IRQ handler + NVIC_EnableIRQ(ETH_IRQn); // Setup Ethernet IRQ handler RCC->APB2ENR |= BIT(14); // Enable SYSCFG SYSCFG->PMC |= BIT(23); // Use RMII. Goes first! RCC->AHB1ENR |= BIT(25) | BIT(26) | BIT(27); // Enable Ethernet clocks @@ -76,7 +79,7 @@ int main(void) { .driver = &mip_driver_stm32, .driver_data = &driver_data}; mip_init(&mgr, &mif); - mg_timer_add(&mgr, BLINK_PERIOD_MS, MG_TIMER_REPEAT, timer_cb, &mif); + mg_timer_add(&mgr, BLINK_PERIOD_MS, MG_TIMER_REPEAT, timer_fn, &mif); MG_INFO(("Waiting until network is up...")); while (mif.state != MIP_STATE_READY) { diff --git a/examples/stm32/nucleo-f429zi-baremetal/syscalls.c b/examples/stm32/nucleo-f429zi-baremetal/syscalls.c index 4a16522c..f3f67af1 100644 --- a/examples/stm32/nucleo-f429zi-baremetal/syscalls.c +++ b/examples/stm32/nucleo-f429zi-baremetal/syscalls.c @@ -1,6 +1,6 @@ #include -#include "mcu.h" +#include "hal.h" int _fstat(int fd, struct stat *st) { if (fd < 0) return -1; @@ -81,3 +81,5 @@ int mkdir(const char *path, mode_t mode) { (void) path, (void) mode; return -1; } + +void _init(void) {} diff --git a/examples/stm32/nucleo-f746zg-baremetal/Makefile b/examples/stm32/nucleo-f746zg-baremetal/Makefile index 6054bba6..c788c4d5 100644 --- a/examples/stm32/nucleo-f746zg-baremetal/Makefile +++ b/examples/stm32/nucleo-f746zg-baremetal/Makefile @@ -1,37 +1,60 @@ -TARGET = firmware -CFLAGS ?= -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion \ - -Wformat-truncation -fno-common -Wconversion \ - -g3 -Os -ffunction-sections -fdata-sections -I. \ - -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 $(EXTRA_CFLAGS) -LDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map -SOURCES = boot.c main.c syscalls.c +# Download CMSIS header files from Github on demand +CMSIS_CORE_VERSION ?= 5.9.0 # ARM Cortex-M definitions +CMSIS_CORE_REPO ?= https://github.com/ARM-software/CMSIS_5 +CMSIS_DEVICE_VERSION ?= v1.2.8 # ST MCU peripheral definitions +CMSIS_DEVICE_REPO ?= https://github.com/STMicroelectronics/cmsis_device_f7 -# Add Mongoose-specific flags and source files +CFLAGS ?= -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion \ + -Wformat-truncation -fno-common -Wconversion -Wno-sign-conversion\ + -g3 -Os -ffunction-sections -fdata-sections \ + -I . -I cmsis_core/CMSIS/Core/Include -I cmsis_device_f7/Include \ + -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 $(EXTRA_CFLAGS) +LDFLAGS ?= -Tlink.ld -nostdlib -nostartfiles --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map +SOURCES = main.c syscalls.c cmsis_device_f7/Source/Templates/gcc/startup_stm32f746xx.s + +# Mongoose-specific build flags and source code files +# Build options reference: https://mongoose.ws/documentation/#build-options CFLAGS += -I../../.. -DMG_ARCH=MG_ARCH_NEWLIB -DMG_ENABLE_CUSTOM_MILLIS=1 -DMG_ENABLE_MIP=1 -DMG_ENABLE_PACKED_FS=1 SOURCES += ../../../mongoose.c ../../device-dashboard/net.c ../../device-dashboard/packed_fs.c -all build example: $(TARGET).bin +# Build flashable .bin file +all build example: firmware.bin -$(TARGET).bin: $(TARGET).elf +# .bin file is made from .elf file, by concatenating .text and .data sections +firmware.bin: firmware.elf arm-none-eabi-objcopy -O binary $< $@ -$(TARGET).elf: $(SOURCES) mcu.h +# .elf file is produced by compiling sources +firmware.elf: $(SOURCES) hal.h link.ld cmsis_core cmsis_device_f7 arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(LDFLAGS) -o $@ -# Note: on "unknown chip id" flash error, wire BOOT0 to VDD and st-flash erase -flash: $(TARGET).bin - st-flash --reset write $(TARGET).bin 0x8000000 +# Flash .bin file to the target board via the built-in debugger +flash: firmware.bin + st-flash --reset write $< 0x8000000 + +# Download ST's CMSIS headers with peripheral definitions +cmsis_device_f7/Source/Templates/gcc/startup_stm32f746xx.s: cmsis_device_f7 +cmsis_device_f7: + git clone --depth 1 -b $(CMSIS_DEVICE_VERSION) $(CMSIS_DEVICE_REPO) $@ + +# Download ARM's CMSIS headers with core Cortex-M definitions +cmsis_core: + git clone --depth 1 -b $(CMSIS_CORE_VERSION) $(CMSIS_CORE_REPO) $@ # Requires env variable VCON_API_KEY set DEVICE_URL ?= https://dash.vcon.io/api/v3/devices/5 -test: EXTRA_CFLAGS += -DUART_DEBUG=UART1 -test: update - curl --fail -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt - grep 'READY, IP:' /tmp/output.txt - grep 'MQTT connected' /tmp/output.txt -update: $(TARGET).bin +# Upload firmware to a remote test device +update: firmware.bin curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$< +# Read serial port on a remote test device for 5 seconds, store in a +# temporary file, and check the output for expected patterns +test: EXTRA_CFLAGS += -DUART_DEBUG=UART1 +test: update + curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt + grep 'READY, IP:' /tmp/output.txt # Check for network init + grep 'MQTT connected' /tmp/output.txt # Check for MQTT connection success + clean: - @rm -rf $(TARGET).* *.su + @rm -rf firmware.* *.su cmsis_core cmsis_device_f7 diff --git a/examples/stm32/nucleo-f746zg-baremetal/boot.c b/examples/stm32/nucleo-f746zg-baremetal/boot.c deleted file mode 100644 index 9d10305c..00000000 --- a/examples/stm32/nucleo-f746zg-baremetal/boot.c +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright (c) 2022 Cesanta Software Limited -// All rights reserved - -// Startup code -__attribute__((naked, noreturn)) void _reset(void) { - // Initialise memory - extern long _sbss, _ebss, _sdata, _edata, _sidata; - for (long *src = &_sbss; src < &_ebss; src++) *src = 0; - for (long *src = &_sdata, *dst = &_sidata; src < &_edata;) *src++ = *dst++; - - // Call main() - extern void main(void); - main(); - for (;;) (void) 0; -} - -void __attribute__((weak)) DefaultIRQHandler(void) { - for (;;) (void) 0; -} - -#define WEAK_ALIAS __attribute__((weak, alias("DefaultIRQHandler"))) - -WEAK_ALIAS void NMI_Handler(void); -WEAK_ALIAS void HardFault_Handler(void); -WEAK_ALIAS void MemManage_Handler(void); -WEAK_ALIAS void BusFault_Handler(void); -WEAK_ALIAS void UsageFault_Handler(void); -WEAK_ALIAS void SVC_Handler(void); -WEAK_ALIAS void DebugMon_Handler(void); -WEAK_ALIAS void PendSV_Handler(void); -WEAK_ALIAS void SysTick_Handler(void); - -WEAK_ALIAS void WWDG_IRQHandler(void); -WEAK_ALIAS void PVD_IRQHandler(void); -WEAK_ALIAS void TAMP_STAMP_IRQHandler(void); -WEAK_ALIAS void RTC_WKUP_IRQHandler(void); -WEAK_ALIAS void FLASH_IRQHandler(void); -WEAK_ALIAS void RCC_IRQHandler(void); -WEAK_ALIAS void EXTI0_IRQHandler(void); -WEAK_ALIAS void EXTI1_IRQHandler(void); -WEAK_ALIAS void EXTI2_IRQHandler(void); -WEAK_ALIAS void EXTI3_IRQHandler(void); -WEAK_ALIAS void EXTI4_IRQHandler(void); -WEAK_ALIAS void EXTI9_5_IRQHandler(void); -WEAK_ALIAS void EXTI15_10_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream0_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream1_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream2_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream3_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream4_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream5_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream6_IRQHandler(void); -WEAK_ALIAS void ADC_IRQHandler(void); -WEAK_ALIAS void CAN1_TX_IRQHandler(void); -WEAK_ALIAS void CAN1_RX0_IRQHandler(void); -WEAK_ALIAS void CAN1_RX1_IRQHandler(void); -WEAK_ALIAS void CAN1_SCE_IRQHandler(void); -WEAK_ALIAS void TIM1_BRK_TIM9_IRQHandler(void); -WEAK_ALIAS void TIM1_UP_TIM10_IRQHandler(void); -WEAK_ALIAS void TIM1_TRG_COM_TIM11_IRQHandler(void); -WEAK_ALIAS void TIM1_CC_IRQHandler(void); -WEAK_ALIAS void TIM2_IRQHandler(void); -WEAK_ALIAS void TIM3_IRQHandler(void); -WEAK_ALIAS void TIM4_IRQHandler(void); -WEAK_ALIAS void I2C1_EV_IRQHandler(void); -WEAK_ALIAS void I2C1_ER_IRQHandler(void); -WEAK_ALIAS void I2C2_EV_IRQHandler(void); -WEAK_ALIAS void I2C2_ER_IRQHandler(void); -WEAK_ALIAS void SPI1_IRQHandler(void); -WEAK_ALIAS void SPI2_IRQHandler(void); -WEAK_ALIAS void USART1_IRQHandler(void); -WEAK_ALIAS void USART2_IRQHandler(void); -WEAK_ALIAS void USART3_IRQHandler(void); -WEAK_ALIAS void RTC_Alarm_IRQHandler(void); -WEAK_ALIAS void OTG_FS_WKUP_IRQHandler(void); -WEAK_ALIAS void TIM8_BRK_TIM12_IRQHandler(void); -WEAK_ALIAS void TIM8_UP_TIM13_IRQHandler(void); -WEAK_ALIAS void TIM8_TRG_COM_TIM14_IRQHandler(void); -WEAK_ALIAS void TIM8_CC_IRQHandler(void); -WEAK_ALIAS void DMA1_Stream7_IRQHandler(void); -WEAK_ALIAS void FMC_IRQHandler(void); -WEAK_ALIAS void SDMMC1_IRQHandler(void); -WEAK_ALIAS void TIM5_IRQHandler(void); -WEAK_ALIAS void SPI3_IRQHandler(void); -WEAK_ALIAS void UART4_IRQHandler(void); -WEAK_ALIAS void UART5_IRQHandler(void); -WEAK_ALIAS void TIM6_DAC_IRQHandler(void); -WEAK_ALIAS void TIM7_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream0_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream1_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream2_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream3_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream4_IRQHandler(void); -WEAK_ALIAS void ETH_IRQHandler(void); -WEAK_ALIAS void ETH_WKUP_IRQHandler(void); -WEAK_ALIAS void CAN2_TX_IRQHandler(void); -WEAK_ALIAS void CAN2_RX0_IRQHandler(void); -WEAK_ALIAS void CAN2_RX1_IRQHandler(void); -WEAK_ALIAS void CAN2_SCE_IRQHandler(void); -WEAK_ALIAS void OTG_FS_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream5_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream6_IRQHandler(void); -WEAK_ALIAS void DMA2_Stream7_IRQHandler(void); -WEAK_ALIAS void USART6_IRQHandler(void); -WEAK_ALIAS void I2C3_EV_IRQHandler(void); -WEAK_ALIAS void I2C3_ER_IRQHandler(void); -WEAK_ALIAS void OTG_HS_EP1_OUT_IRQHandler(void); -WEAK_ALIAS void OTG_HS_EP1_IN_IRQHandler(void); -WEAK_ALIAS void OTG_HS_WKUP_IRQHandler(void); -WEAK_ALIAS void OTG_HS_IRQHandler(void); -WEAK_ALIAS void DCMI_IRQHandler(void); -WEAK_ALIAS void RNG_IRQHandler(void); -WEAK_ALIAS void FPU_IRQHandler(void); -WEAK_ALIAS void UART7_IRQHandler(void); -WEAK_ALIAS void UART8_IRQHandler(void); -WEAK_ALIAS void SPI4_IRQHandler(void); -WEAK_ALIAS void SPI5_IRQHandler(void); -WEAK_ALIAS void SPI6_IRQHandler(void); -WEAK_ALIAS void SAI1_IRQHandler(void); -WEAK_ALIAS void LTDC_IRQHandler(void); -WEAK_ALIAS void LTDC_ER_IRQHandler(void); -WEAK_ALIAS void DMA2D_IRQHandler(void); -WEAK_ALIAS void SAI2_IRQHandler(void); -WEAK_ALIAS void QUADSPI_IRQHandler(void); -WEAK_ALIAS void LPTIM1_IRQHandler(void); -WEAK_ALIAS void CEC_IRQHandler(void); -WEAK_ALIAS void I2C4_EV_IRQHandler(void); -WEAK_ALIAS void I2C4_ER_IRQHandler(void); -WEAK_ALIAS void SPDIF_RX_IRQHandler(void); - -// IRQ table -extern void _estack(); -__attribute__((section(".vectors"))) void (*tab[16 + 98])(void) = { - // Cortex interrupts - _estack, _reset, NMI_Handler, HardFault_Handler, MemManage_Handler, - BusFault_Handler, UsageFault_Handler, 0, 0, 0, 0, SVC_Handler, - DebugMon_Handler, 0, PendSV_Handler, SysTick_Handler, - - // Interrupts from peripherals - WWDG_IRQHandler, PVD_IRQHandler, TAMP_STAMP_IRQHandler, RTC_WKUP_IRQHandler, - FLASH_IRQHandler, RCC_IRQHandler, EXTI0_IRQHandler, EXTI1_IRQHandler, - EXTI2_IRQHandler, EXTI3_IRQHandler, EXTI4_IRQHandler, - DMA1_Stream0_IRQHandler, DMA1_Stream1_IRQHandler, DMA1_Stream2_IRQHandler, - DMA1_Stream3_IRQHandler, DMA1_Stream4_IRQHandler, DMA1_Stream5_IRQHandler, - DMA1_Stream6_IRQHandler, ADC_IRQHandler, CAN1_TX_IRQHandler, - CAN1_RX0_IRQHandler, CAN1_RX1_IRQHandler, CAN1_SCE_IRQHandler, - EXTI9_5_IRQHandler, TIM1_BRK_TIM9_IRQHandler, TIM1_UP_TIM10_IRQHandler, - TIM1_TRG_COM_TIM11_IRQHandler, TIM1_CC_IRQHandler, TIM2_IRQHandler, - TIM3_IRQHandler, TIM4_IRQHandler, I2C1_EV_IRQHandler, I2C1_ER_IRQHandler, - I2C2_EV_IRQHandler, I2C2_ER_IRQHandler, SPI1_IRQHandler, SPI2_IRQHandler, - USART1_IRQHandler, USART2_IRQHandler, USART3_IRQHandler, - EXTI15_10_IRQHandler, RTC_Alarm_IRQHandler, OTG_FS_WKUP_IRQHandler, - TIM8_BRK_TIM12_IRQHandler, TIM8_UP_TIM13_IRQHandler, - TIM8_TRG_COM_TIM14_IRQHandler, TIM8_CC_IRQHandler, DMA1_Stream7_IRQHandler, - FMC_IRQHandler, SDMMC1_IRQHandler, TIM5_IRQHandler, SPI3_IRQHandler, - UART4_IRQHandler, UART5_IRQHandler, TIM6_DAC_IRQHandler, TIM7_IRQHandler, - DMA2_Stream0_IRQHandler, DMA2_Stream1_IRQHandler, DMA2_Stream2_IRQHandler, - DMA2_Stream3_IRQHandler, DMA2_Stream4_IRQHandler, ETH_IRQHandler, - ETH_WKUP_IRQHandler, CAN2_TX_IRQHandler, CAN2_RX0_IRQHandler, - CAN2_RX1_IRQHandler, CAN2_SCE_IRQHandler, OTG_FS_IRQHandler, - DMA2_Stream5_IRQHandler, DMA2_Stream6_IRQHandler, DMA2_Stream7_IRQHandler, - USART6_IRQHandler, I2C3_EV_IRQHandler, I2C3_ER_IRQHandler, - OTG_HS_EP1_OUT_IRQHandler, OTG_HS_EP1_IN_IRQHandler, OTG_HS_WKUP_IRQHandler, - OTG_HS_IRQHandler, DCMI_IRQHandler, 0, RNG_IRQHandler, FPU_IRQHandler, - UART7_IRQHandler, UART8_IRQHandler, SPI4_IRQHandler, SPI5_IRQHandler, - SPI6_IRQHandler, SAI1_IRQHandler, LTDC_IRQHandler, LTDC_ER_IRQHandler, - DMA2D_IRQHandler, SAI2_IRQHandler, QUADSPI_IRQHandler, LPTIM1_IRQHandler, - CEC_IRQHandler, I2C4_EV_IRQHandler, I2C4_ER_IRQHandler, - SPDIF_RX_IRQHandler}; diff --git a/examples/stm32/nucleo-f746zg-baremetal/mcu.h b/examples/stm32/nucleo-f746zg-baremetal/hal.h similarity index 62% rename from examples/stm32/nucleo-f746zg-baremetal/mcu.h rename to examples/stm32/nucleo-f746zg-baremetal/hal.h index 551cd5db..1b46528b 100644 --- a/examples/stm32/nucleo-f746zg-baremetal/mcu.h +++ b/examples/stm32/nucleo-f746zg-baremetal/hal.h @@ -4,6 +4,8 @@ #pragma once +#include + #include #include #include @@ -18,85 +20,28 @@ /* System clock 5.3.3: APB1 clock <= 54MHz; APB2 clock <= 108MHz 3.3.2, Table 5: configure flash latency (WS) in accordance to clock freq -38.4: The AHB clock frequency must be at least 25 MHz when the Ethernet controller is used */ +38.4: The AHB clock frequency must be at least 25 MHz when the Ethernet +controller is used */ enum { APB1_PRE = 5 /* AHB clock / 4 */, APB2_PRE = 4 /* AHB clock / 2 */ }; enum { PLL_HSI = 16, PLL_M = 8, PLL_N = 216, PLL_P = 2 }; // Run at 216 Mhz -#define FLASH_LATENCY 7 +#define FLASH_LATENCY 7 #define SYS_FREQUENCY ((PLL_HSI * PLL_N / PLL_M / PLL_P) * 1000000) #define APB2_FREQUENCY (SYS_FREQUENCY / (BIT(APB2_PRE - 3))) #define APB1_FREQUENCY (SYS_FREQUENCY / (BIT(APB1_PRE - 3))) static inline void spin(volatile uint32_t count) { - while (count--) asm("nop"); + while (count--) (void) 0; } -struct rcc { - volatile uint32_t CR, PLLCFGR, CFGR, CIR, AHB1RSTR, AHB2RSTR, AHB3RSTR, - RESERVED0, APB1RSTR, APB2RSTR, RESERVED1[2], AHB1ENR, AHB2ENR, AHB3ENR, - RESERVED2, APB1ENR, APB2ENR, RESERVED3[2], AHB1LPENR, AHB2LPENR, - AHB3LPENR, RESERVED4, APB1LPENR, APB2LPENR, RESERVED5[2], BDCR, CSR, - RESERVED6[2], SSCGR, PLLI2SCFGR, PLLSAICFGR, DCKCFGR1, DCKCFGR2; -}; -#define RCC ((struct rcc *) 0x40023800) - -struct pwr { - volatile uint32_t CR1, CSR1, CR2, CSR2; -}; -#define PWR ((struct pwr *) 0x40007000) - -struct nvic { - volatile uint32_t ISER[8], RESERVED0[24], ICER[8], RSERVED1[24], ISPR[8], - RESERVED2[24], ICPR[8], RESERVED3[24], IABR[8], RESERVED4[56], IP[240], - RESERVED5[644], STIR; -}; -#define NVIC ((struct nvic *) 0xe000e100) -static inline void nvic_set_prio(int irq, uint32_t prio) { - NVIC->IP[irq] = prio << 4; -} -static inline void nvic_enable_irq(int irq) { - NVIC->ISER[irq >> 5] = (uint32_t) (1 << (irq & 31)); -} - -struct systick { - volatile uint32_t CTRL, LOAD, VAL, CALIB; -}; -#define SYSTICK ((struct systick *) 0xe000e010) // 2.2.2 -static inline void systick_init(uint32_t ticks) { - if ((ticks - 1) > 0xffffff) return; // Systick timer is 24 bit - SYSTICK->LOAD = ticks - 1; - SYSTICK->VAL = 0; - SYSTICK->CTRL = BIT(0) | BIT(1) | BIT(2); // Enable systick -} - -struct flash { - volatile uint32_t ACR, KEYR, OPTKEYR, SR, CR, AR, RESERVED, OBR, WRPR; -}; -#define FLASH ((struct flash *) 0x40023c00) - -struct scb { - volatile uint32_t CPUID, ICSR, VTOR, AIRCR, SCR, CCR, SHPR[3], SHCSR, CFSR, - HFSR, DFSR, MMFAR, BFAR, AFSR, ID_PFR[2], ID_DFR, ID_AFR, ID_MFR[4], - ID_ISAR[5], RESERVED0[1], CLIDR, CTR, CCSIDR, CSSELR, CPACR, - RESERVED3[93], STIR, RESERVED4[15], MVFR0, MVFR1, MVFR2, RESERVED5[1], - ICIALLU, RESERVED6[1], ICIMVAU, DCIMVAC, DCISW, DCCMVAU, DCCMVAC, DCCSW, - DCCIMVAC, DCCISW, RESERVED7[6], ITCMCR, DTCMCR, AHBPCR, CACR, AHBSCR, - RESERVED8[1], ABFSR; -}; -#define SCB ((struct scb *) 0xe000ed00) - enum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_AF, GPIO_MODE_ANALOG }; enum { GPIO_OTYPE_PUSH_PULL, GPIO_OTYPE_OPEN_DRAIN }; enum { GPIO_SPEED_LOW, GPIO_SPEED_MEDIUM, GPIO_SPEED_HIGH, GPIO_SPEED_INSANE }; enum { GPIO_PULL_NONE, GPIO_PULL_UP, GPIO_PULL_DOWN }; +#define GPIO(N) ((GPIO_TypeDef *) (0x40020000 + 0x400 * (N))) -struct gpio { - volatile uint32_t MODER, OTYPER, OSPEEDR, PUPDR, IDR, ODR, BSRR, LCKR, AFR[2]; -}; -#define GPIO(N) ((struct gpio *) (0x40020000 + 0x400 * (N))) - -static struct gpio *gpio_bank(uint16_t pin) { return GPIO(PINBANK(pin)); } +static GPIO_TypeDef *gpio_bank(uint16_t pin) { return GPIO(PINBANK(pin)); } static inline void gpio_toggle(uint16_t pin) { - struct gpio *gpio = gpio_bank(pin); + GPIO_TypeDef *gpio = gpio_bank(pin); uint32_t mask = BIT(PINNO(pin)); gpio->BSRR = mask << (gpio->ODR & mask ? 16 : 0); } @@ -104,12 +49,12 @@ static inline int gpio_read(uint16_t pin) { return gpio_bank(pin)->IDR & BIT(PINNO(pin)) ? 1 : 0; } static inline void gpio_write(uint16_t pin, bool val) { - struct gpio *gpio = gpio_bank(pin); + GPIO_TypeDef *gpio = gpio_bank(pin); gpio->BSRR = BIT(PINNO(pin)) << (val ? 0 : 16); } static inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type, uint8_t speed, uint8_t pull, uint8_t af) { - struct gpio *gpio = gpio_bank(pin); + GPIO_TypeDef *gpio = gpio_bank(pin); uint8_t n = (uint8_t) (PINNO(pin)); RCC->AHB1ENR |= BIT(PINBANK(pin)); // Enable GPIO clock SETBITS(gpio->OTYPER, 1UL << n, ((uint32_t) type) << n); @@ -128,16 +73,6 @@ static inline void gpio_output(uint16_t pin) { GPIO_PULL_NONE, 0); } -struct syscfg { - volatile uint32_t MEMRMP, PMC, EXTICR[4], RESERVED[2], CMPCR; -}; -#define SYSCFG ((struct syscfg *) 0x40013800) - -struct exti { - volatile uint32_t IMR, EMR, RTSR, FTSR, SWIER, PR; -}; -#define EXTI ((struct exti *) 0x40013c00) - static inline void irq_exti_attach(uint16_t pin) { uint8_t bank = (uint8_t) (PINBANK(pin)), n = (uint8_t) (PINNO(pin)); RCC->APB2ENR |= BIT(14); // Enable SYSCFG @@ -147,22 +82,19 @@ static inline void irq_exti_attach(uint16_t pin) { EXTI->RTSR |= BIT(n); EXTI->FTSR |= BIT(n); int irqvec = n < 5 ? 6 + n : n < 10 ? 23 : 40; // IRQ vector index, 10.1.2 - nvic_set_prio(irqvec, 3); - nvic_enable_irq(irqvec); + NVIC_SetPriority(irqvec, 3); + NVIC_EnableIRQ(irqvec); } -struct uart { - volatile uint32_t CR1, CR2, CR3, BRR, GTPR, RTOR, RQR, ISR, ICR, RDR, TDR; -}; -#define UART1 ((struct uart *) 0x40011000) -#define UART2 ((struct uart *) 0x40004400) -#define UART3 ((struct uart *) 0x40004800) +#define UART1 USART1 +#define UART2 USART2 +#define UART3 USART3 #ifndef UART_DEBUG #define UART_DEBUG UART3 #endif -static inline void uart_init(struct uart *uart, unsigned long baud) { +static inline void uart_init(USART_TypeDef *uart, unsigned long baud) { // https://www.st.com/resource/en/datasheet/stm32f746zg.pdf uint8_t af = 7; // Alternate function uint16_t rx = 0, tx = 0; // pins @@ -179,20 +111,20 @@ static inline void uart_init(struct uart *uart, unsigned long baud) { gpio_init(tx, GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH, 0, af); gpio_init(rx, GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH, 0, af); uart->CR1 = 0; // Disable this UART - uart->BRR = freq / baud; // Set baud rate + uart->BRR = freq / baud; // Set baud rate uart->CR1 |= BIT(0) | BIT(2) | BIT(3); // Set UE, RE, TE } -static inline void uart_write_byte(struct uart *uart, uint8_t byte) { +static inline void uart_write_byte(USART_TypeDef *uart, uint8_t byte) { uart->TDR = byte; while ((uart->ISR & BIT(7)) == 0) spin(1); } -static inline void uart_write_buf(struct uart *uart, char *buf, size_t len) { +static inline void uart_write_buf(USART_TypeDef *uart, char *buf, size_t len) { while (len-- > 0) uart_write_byte(uart, *(uint8_t *) buf++); } -static inline int uart_read_ready(struct uart *uart) { +static inline int uart_read_ready(USART_TypeDef *uart) { return uart->ISR & BIT(5); // If RXNE bit is set, data is ready } -static inline uint8_t uart_read_byte(struct uart *uart) { +static inline uint8_t uart_read_byte(USART_TypeDef *uart) { return (uint8_t) (uart->RDR & 255); } @@ -206,8 +138,8 @@ static inline void clock_init(void) { // Set clock frequency while ((PWR->CSR1 & BIT(17)) == 0) spin(1); // Wait until done #endif SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); // Enable FPU - asm ("DSB"); - asm ("ISB"); + asm("DSB"); + asm("ISB"); FLASH->ACR |= FLASH_LATENCY | BIT(8) | BIT(9); // Flash latency, prefetch RCC->PLLCFGR &= ~((BIT(17) - 1)); // Clear PLL multipliers RCC->PLLCFGR |= (((PLL_P - 2) / 2) & 3) << 16; // Set PLL_P diff --git a/examples/stm32/nucleo-f746zg-baremetal/link.ld b/examples/stm32/nucleo-f746zg-baremetal/link.ld index 87f9375a..330baddd 100644 --- a/examples/stm32/nucleo-f746zg-baremetal/link.ld +++ b/examples/stm32/nucleo-f746zg-baremetal/link.ld @@ -1,14 +1,14 @@ -ENTRY(_reset); +ENTRY(Reset_Handler); MEMORY { - flash(rx) : ORIGIN = 0x08000000, LENGTH = 1024k + flash(rx) : ORIGIN = 0x08000000, LENGTH = 1024k sram(rwx) : ORIGIN = 0x20000000, LENGTH = 320k } _estack = ORIGIN(sram) + LENGTH(sram); /* stack points to end of SRAM */ SECTIONS { - .vectors : { KEEP(*(.vectors)) } > flash - .text : { *(.text*) } > flash - .rodata : { *(.rodata*) } > flash + .vectors : { KEEP(*(.isr_vector)) } > flash + .text : { *(.text* .text.*) } > flash + .rodata : { *(.rodata*) } > flash .data : { _sdata = .; /* for init_ram() */ diff --git a/examples/stm32/nucleo-f746zg-baremetal/main.c b/examples/stm32/nucleo-f746zg-baremetal/main.c index d1f77a49..4dbfb8fa 100644 --- a/examples/stm32/nucleo-f746zg-baremetal/main.c +++ b/examples/stm32/nucleo-f746zg-baremetal/main.c @@ -1,21 +1,17 @@ -// Copyright (c) 2022 Cesanta Software Limited +// Copyright (c) 2022-2023 Cesanta Software Limited // All rights reserved -#include "mcu.h" +#include "hal.h" #include "mongoose.h" -#define LED1 PIN('B', 0) // On-board LED pin (green) -#define LED2 PIN('B', 7) // On-board LED pin (blue) -#define LED3 PIN('B', 14) // On-board LED pin (red) -#define BTN1 PIN('C', 13) // On-board user button +#define LED1 PIN('B', 0) // On-board LED pin (green) +#define LED2 PIN('B', 7) // On-board LED pin (blue) +#define LED3 PIN('B', 14) // On-board LED pin (red) +#define BTN1 PIN('C', 13) // On-board user button +#define BLINK_PERIOD_MS 1000 // LED blinking period in millis static uint64_t s_ticks, s_exti; // Counters, increased by IRQ handlers -static void blink_cb(void *arg) { // Blink periodically - gpio_toggle(LED2); - (void) arg; -} - uint64_t mg_millis(void) { // Declare our own uptime function return s_ticks; // Return number of milliseconds since boot } @@ -35,15 +31,25 @@ void EXTI15_10_IRQHandler(void) { // External interrupt handler gpio_write(LED1, gpio_read(BTN1)); // No debounce. Turn LED if button pressed } +void SystemInit(void) { // Called automatically by startup code + clock_init(); // Set clock to 180MHz + SysTick_Config(SYS_FREQUENCY / 1000); // Increment s_ticks every ms +} + +static void timer_fn(void *arg) { + gpio_toggle(LED2); // Blink LED + bool up = ((struct mip_if *) arg)->state == MIP_STATE_READY; + MG_INFO(("Ethernet: %s", up ? "up" : "down")); // Show network status +} + int main(void) { - static struct uart *uart = UART_DEBUG; // Use UART3 - its attached to debug - clock_init(); // Set clock to 216MHz - systick_init(SYS_FREQUENCY / 1000); // Increment s_ticks every ms - gpio_output(LED1); // Setup green LED - gpio_output(LED2); // Setup blue LED - gpio_input(BTN1); // Set button to input - irq_exti_attach(BTN1); // Attach BTN1 to exti - uart_init(uart, 115200); // It is wired to the debug port + gpio_output(LED1); // Setup green LED + gpio_output(LED2); // Setup blue LED + gpio_input(BTN1); // Set button to input + irq_exti_attach(BTN1); // Attach BTN1 to exti + uart_init(UART_DEBUG, 115200); // Initialise debug printf + + MG_INFO(("Starting, CPU freq %g MHz", (double) SYS_FREQUENCY / 1000000)); // Initialise Ethernet. Enable MAC GPIO pins, see // https://www.farnell.com/datasheets/2014265.pdf section 6.10 @@ -54,7 +60,7 @@ int main(void) { gpio_init(pins[i], GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_INSANE, GPIO_PULL_NONE, 11); } - nvic_enable_irq(61); // Setup Ethernet IRQ handler + NVIC_EnableIRQ(ETH_IRQn); // Setup Ethernet IRQ handler RCC->APB2ENR |= BIT(14); // Enable SYSCFG SYSCFG->PMC |= BIT(23); // Use RMII. Goes first! RCC->AHB1ENR |= BIT(25) | BIT(26) | BIT(27); // Enable Ethernet clocks @@ -64,19 +70,16 @@ int main(void) { struct mg_mgr mgr; // Initialise Mongoose event manager mg_mgr_init(&mgr); // and attach it to the MIP interface mg_log_set(MG_LL_DEBUG); // Set log level - mg_timer_add(&mgr, 500, MG_TIMER_REPEAT, blink_cb, &mgr); // Initialise Mongoose network stack // Specify MAC address, and IP/mask/GW in network byte order for static // IP configuration. If IP/mask/GW are unset, DHCP is going to be used - struct mip_driver_stm32_data driver_data = {.mdc_cr = - 4}; // See driver_stm32.h - struct mip_if mif = { - .mac = {2, 0, 1, 2, 3, 5}, - .driver = &mip_driver_stm32, - .driver_data = &driver_data, - }; + struct mip_driver_stm32_data driver_data = {.mdc_cr = 4}; // driver_stm32.h + struct mip_if mif = {.mac = {2, 0, 1, 2, 3, 5}, + .driver = &mip_driver_stm32, + .driver_data = &driver_data}; mip_init(&mgr, &mif); + mg_timer_add(&mgr, BLINK_PERIOD_MS, MG_TIMER_REPEAT, timer_fn, &mif); MG_INFO(("Waiting until network is up...")); while (mif.state != MIP_STATE_READY) { @@ -88,7 +91,9 @@ int main(void) { mg_http_listen(&mgr, "http://0.0.0.0", device_dashboard_fn, NULL); MG_INFO(("Starting event loop")); - for (;;) mg_mgr_poll(&mgr, 0); // Infinite event loop + for (;;) { + mg_mgr_poll(&mgr, 0); + } return 0; } diff --git a/examples/stm32/nucleo-f746zg-baremetal/syscalls.c b/examples/stm32/nucleo-f746zg-baremetal/syscalls.c index 37d46dc8..be3210aa 100644 --- a/examples/stm32/nucleo-f746zg-baremetal/syscalls.c +++ b/examples/stm32/nucleo-f746zg-baremetal/syscalls.c @@ -1,6 +1,6 @@ #include -#include "mcu.h" +#include "hal.h" int _fstat(int fd, struct stat *st) { if (fd < 0) return -1; @@ -81,3 +81,5 @@ int mkdir(const char *path, mode_t mode) { (void) path, (void) mode; return -1; } + +void _init(void) {}