From 3fbb7de7127738f5ed9775269d9aca689b561e13 Mon Sep 17 00:00:00 2001 From: Sergey Lyubka Date: Fri, 13 May 2022 16:47:10 +0100 Subject: [PATCH] Refactor dashboard example --- examples/complete/Makefile | 8 +- examples/complete/README.md | 11 +- examples/complete/images/1.jpg | Bin 10473 -> 0 bytes examples/complete/images/2.jpg | Bin 9992 -> 0 bytes examples/complete/images/3.jpg | Bin 10520 -> 0 bytes examples/complete/images/4.jpg | Bin 10521 -> 0 bytes examples/complete/images/5.jpg | Bin 9979 -> 0 bytes examples/complete/images/6.jpg | Bin 10693 -> 0 bytes examples/complete/main.c | 130 +- examples/complete/mjson.c | 981 ------- examples/complete/mjson.h | 220 -- examples/complete/packed_fs.c | 2360 +++++++++++++++++ examples/complete/web_root/app.js | 312 --- examples/complete/web_root/axios.min.js | 3 - examples/complete/web_root/bootstrap.min.css | 7 - examples/complete/web_root/history.min.js | 1 - examples/complete/web_root/htm.min.js | 1 - examples/complete/web_root/images/logo.png | Bin 3257 -> 0 bytes examples/complete/web_root/index.html | 11 +- examples/complete/web_root/linkstate.min.js | 18 - examples/complete/web_root/main.js | 249 ++ .../complete/web_root/preact-router.min.js | 1 - examples/complete/web_root/preact.min.js | 3 +- examples/complete/web_root/style.css | 41 +- .../complete/web_root/{images => }/user.png | Bin src/fs.h | 4 + src/fs_packed.c | 3 - test/pack.c | 2 +- 28 files changed, 2692 insertions(+), 1674 deletions(-) delete mode 100644 examples/complete/images/1.jpg delete mode 100644 examples/complete/images/2.jpg delete mode 100644 examples/complete/images/3.jpg delete mode 100644 examples/complete/images/4.jpg delete mode 100644 examples/complete/images/5.jpg delete mode 100644 examples/complete/images/6.jpg delete mode 100644 examples/complete/mjson.c delete mode 100644 examples/complete/mjson.h create mode 100644 examples/complete/packed_fs.c delete mode 100644 examples/complete/web_root/app.js delete mode 100644 examples/complete/web_root/axios.min.js delete mode 100644 examples/complete/web_root/bootstrap.min.css delete mode 100644 examples/complete/web_root/history.min.js delete mode 100644 examples/complete/web_root/htm.min.js delete mode 100644 examples/complete/web_root/images/logo.png delete mode 100644 examples/complete/web_root/linkstate.min.js create mode 100644 examples/complete/web_root/main.js delete mode 100644 examples/complete/web_root/preact-router.min.js rename examples/complete/web_root/{images => }/user.png (100%) diff --git a/examples/complete/Makefile b/examples/complete/Makefile index d4cb59a6..eeececa6 100644 --- a/examples/complete/Makefile +++ b/examples/complete/Makefile @@ -1,7 +1,7 @@ PROG ?= example -SOURCES ?= ../../mongoose.c main.c mjson.c packed_fs.c +SOURCES ?= ../../mongoose.c main.c packed_fs.c CFLAGS ?= -I../.. -DMG_ENABLE_PACKED_FS=1 $(EXTRA) -FILES_TO_EMBED ?= $(wildcard web_root/*.js) $(wildcard web_root/*.css) $(wildcard web_root/*.html) $(wildcard web_root/images/*.png) $(wildcard images/*.jpg) +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 @@ -13,7 +13,7 @@ all: $(PROG) $(PROG): $(CC) ../../test/pack.c -o pack ./pack $(FILES_TO_EMBED) > packed_fs.c - $(CC) -W -Wall -Wextra -Os -g3 $(CFLAGS) -o $(PROG) $(SOURCES) + $(CC) -W -Wall -Wextra -O0 -g3 $(CFLAGS) -o $(PROG) $(SOURCES) mingw: @@ -29,4 +29,4 @@ vc98: $(VC98) $(PROG).exe clean: - rm -rf $(PROG) *.o *.dSYM *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb log.txt packed_fs.c pack + rm -rf $(PROG) *.o *.dSYM *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb log.txt pack diff --git a/examples/complete/README.md b/examples/complete/README.md index 4c4a9ea9..313f96d1 100644 --- a/examples/complete/README.md +++ b/examples/complete/README.md @@ -7,16 +7,13 @@ following features: - Multiple logins with different permissions (admin and user) - Login screen for non-authenticated connections - A [preact](https://preactjs.com/)-based dashboard with multiple pages -- Internal variables -- A form that changes those variables +- Web UI is fully embedded into the server/firmware binary, and does not + need a filesystem to serve it +- View and change server settings - All changes are propagates to all connected clients -- Live log stream -- Live video stream +- Live interactive chat that demonstrates bi-directional data exchange -In essence, this example is a combination of several other examples -pulled together (multiple-logins, dashboard, live-log, video-stream). - # Screenshots This is a login screen that prompts for user/password diff --git a/examples/complete/images/1.jpg b/examples/complete/images/1.jpg deleted file mode 100644 index bdff39c7947e4b2ca40960c67014929c28f61ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10473 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 diff --git a/examples/complete/images/2.jpg b/examples/complete/images/2.jpg deleted file mode 100644 index 8cf645e0e3294d0569f1ffa1739ddeacdccfd6ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9992 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 diff --git a/examples/complete/images/3.jpg b/examples/complete/images/3.jpg deleted file mode 100644 index 478ff3303f76895a1dfbe0ed1bf30a10592f922c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10520 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 V{fpl7|LfB#@b8Ee|G(HZ_8*6KLZJWv diff --git a/examples/complete/images/4.jpg b/examples/complete/images/4.jpg deleted file mode 100644 index 4b74cfa8aec1ffae8afb60e2dcb93e6525b6cbf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10521 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 diff --git a/examples/complete/images/5.jpg b/examples/complete/images/5.jpg deleted file mode 100644 index 236816d35fdbaefb203956dff9cfb8630301c2a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9979 zcmd5?XH-+o);%Rv;Zn9 z0Ju)M05Tdd*9>rW004b`KokG~dVrdW4FFMURFn&da0Y08)dAo<?3# z-$NK)t`o1p$;|*OJyi&`28fCepk}24u~L!S0Vu^HTB=|2s~e@Dq6X2>(t+t27?~(H zRGpxh4gyirfM{ud{tQ(xr5&JQrDfxlRHI`zvH|mXaY#K*%%SJM_MruGYX~PGZR;J% zz<83A>lC-(c_CpDQ5o6Ga#!RP)HO7ss5|J370%dp-@1jE;>@ zOioRs7ch(8mX=q(ui`hiws#1-#J&BWxG2x_U$7|UzmWYOT&xsa)HF088t_kCRMZcC z0%xV6<&~skQ!@hFc(L~b^L+u*>huSsq2kiRLpuQjuZnYF#j#4rzv~spI&0V03SzJ3aENm{1V$Yr#t?Y2ZmIX-( z4KJIgZ){HAd-XOETKP>&U4i9O7_I(i)v}6o6ZcObLLexUX#vq5YL_HE?!GZpYl$O%9G;mZ77h7<7 z^NeoWQA%YJjq!$2L{;!0?lp1wM^Qdy}8KsYv3M+tgk?f-Jh?cjtYGUP>@Bz(5AVQ?(Kw zh_AU+7qem%y@y${ss|f0B{RkJT40>0vq9>g-489$Jm%I;m+haXRX*!?{cA?Lp~K5F zu}kVay<=>-$b5A`+0L!wQ_>j6koL}t-UR~575;&QolRxYXdE;gQJK~HBNlc-NqZg| zz8^Bd5?1QAj2gwhA3rYGR!5(mO0t4X>M1O#Ts5_;_h>SHijfVd&y_USope69pmE3k z-ukw`%NmYRIJa<_QiS|nRsG$)s*HWX;4KC#(K4|MJ?0yu@7P|Ft4J@)lvO?@5ZCqE zlMDoOaqUH)n_XsPTrA)9+fv0QVCu8N$v_2XyDG=zC!4yvyd~m`#u4#u1{&qs#z%|J zZJ^26albct3_9D|{ub9v@Xrf7&VLg~3RJ9jbybA+EqB4^vS!L@c=x;lr z^N!fnv5$>IC6}zFrQ|r?FM4Km_in$Eq^M_6V!c!$C>s=g;ELWoWS?0`h%^-&ndYv{7$EIdqxvc@rq+JLHfqV?M-$EPjB$|3=Xqd z^omxTtbro`9zvnN*dbv0qyz8^y6mj3if%&b{LjsF>^0z;qepS<_;mH0v=NpYWG$$W!^jP2S2$9?Tg0r@w^|| zR>=#^ew&FlCixLv5DLCVnnChM0Y9NY4n7>PA71*b1i?A#;BTD7SJx~=#$mBjK+j^u z`*4VR4um?XarVP@7g`yi*;HYjrSb~L((FG0M7Xhy2c4~V=j?|a`gJ_CXh?gLv^vP7 z`ua9M$F5_|MB$AabxoLFkIVpn z9Eab9zN?_wv=JPk*j>W+$hI?J`AL6tz_+L;dHHIe%9H5%Kdy@P_DbGrv$eVFi->?V zA0EiHba6g;7m<1!yEcMX`IH+iMi|*!6wZwXen-i_8G#`mtIp@2fcKLB~*KwNckp)PNEL&kP*s$G?dM`Dha zZ2)6=xukMPiR78DpYGI8c5x1_3-vUvTeG^>} zx+N+d2xYM1G%ew0j3=lV9+ktH0wyrXRvBFCV+q@uQE|U3vUJrSpS2xd_Y#P-aRfrt zulRl0+)zvR)ci38p8pXG2Osi0X@Ors#s9dKL|P!K(}bJf&r3gda%K4xkdycx_==6) zQ8l_1yZmhpYZ>fcFh(jRc=!zLmnhfNthqv+@~;WIe>_!SCW~gM5=&sV&?|O7(Bqwj zMTmV|7tj3W8NBuuIgQ&fu{0`tQIigj1{XyByqfY?!pCi9_Y^apj-c{lb4!pp! zj>o)4(h^sD#z6JX`$_yv`dX9F6sI#dZ^>Hey32d!4k%-}mO4M>60G`e}3GN_wyoM!9xOm2eq0v?D^hkKWJ?rYg7pBBrey|VpDg*R0OItz& zoQr6IW`fcM=uTQqP6_pO(OE2=^GGu#iJXZ|{_II1C{&E0akuk&SfWVaFH5yaIZ#La zgF&34n5)x$Y;I-s-Dk})XIzu~bB|FaCpSYrxtQ)syD&Qn6!Q1-gb>O;MeiklyEGZ0 zWuSBC13DObbNq`8@f1ym4otrF9&?*gGIrwZ*gA;{XI=2t)!2o*UB#$c|NUXh6PZ`E zk7;n6{CMOA94P{UTotjmr9T(`5D_j*!mD;aklpcnQCMCX{#o%8@733fwgZzqI?DaQ zNJe|#H62?Q%>$%%@agRu{U1JCaJhk^A;aUku5*^fE~%yaSl5$Fl3Y_4KJ^=my6t5OXXjoGQZZt~f;csUznpv3zIUlJEMr z^Ra>zR#}(t9CCXcvkFdb8Bggg&`##5s&sZYR*B5Hd8Ea#jg*}5Q1z7Hh=+MjYj*<4XQExe%&EvWJJHRNJdWAt9_JU=Q@*=A&%ln@ZF?9K*Ko-?gVRC! zj=azJ-|NRNRViA+KKlF8k0wkh31WGV?#V_6k<6Wy83Ax{= zA=wopwyXuFcD=PbcC%z4(X!GA)?{43?R7J>TpI_mtSFYdl~*5FP1*e|UK(j~0KcJB zg*aA{h+k%Z*=Ac@M89Zhrhj5-2 zz6Nj$f?+*KSw^9(SfqZGkN2~dZU;MyL0CdObLCbV|sPRH=s`*|} zN{#A}DqT68zYX_X>g%OwAG2tKJHrGwXYP!PW#e%N)dv02`wwubQNBM;1;BLh4$o#v zb^@sl&qc4eqE#m)7HG>#amFOp##@`h8%oOWW-YHJbr&s7|5ZZ| zw@U)`@FiT$MGcNCX}@)<3v`i_7Rzqdj170R>t-4Z3YLVSzCC;+DIcul`z1Nrqi5&P za7#Vzie;Hz`^$#tG;iNkUC9khV8`LYh@2Br1vl7!8p>)NCtvz?9Nos%^4BU_>-qp4 zGu*gl3w3mO1e+_Eb@eS?}d$CkDGeV zO}f;ekDmF#w7TVN)+WfjvIt@laNPK~zq>6DSz40u{P$n;d(Ga>EYE2_le5e5 z)J48ChA%ph#RDR}>ji>hTGqy~_tI9&>azT)x#*0aJz~|fmc%{jgicR8<94=R)qjA^ zrYQ9Q^DITa`;=+OYuYK`FNFTY*!!NaXY3ZpeG&lL@j`_u=B*kpS zjPzTSa?8gB&VxI$;!{uJgM@I4B;ML#*6E#dDO|Be1GlvdGX(xx%<~;=3|2pYz&qzE z9owL>aTM^8aQcQ}nMvQk?uCqks@Hz)NH)>?;m%M&xy-9vJi+iXO5Eb^P6nPfb-p}k znyP-azc-k$1}lRcAn1(t2bo)+W+X4c_M}w@2Hz-ahT_E_(fMT)Q&kLw=8Spc^5>B z6)gmZ&QX$y&r0uqgG~pK{{*8IEeu+QO}BOOx4?h~D|kZr0%_zxbk^}0?4}LKZP$Ei zjs$}B4<;y`_E^&K)Ws3nP5v2n$t3inQR$XjFe}LO-Ng>FO>SHRO^yh$pFp7$m}ffz~rxMC67$%&bEK3 z^*^jeF2joaa0%-W^cOijoNBCJ9B)G}6B%ItqGrdt+*eVdaROziv==uqjM_jB1&BV$ zOZptMJ~wxMur(;S50ilDYi+pPz+bkOlFm1>Rrg?vLcE{~4}E_-M*B18EFcUSn9(Cx zj38VPVM1;14XRayJ})MbfwtXvuM@Q*RoJEZtn>3giMHscgzj6VhZ#gR1$B{wr&y0?->75|;)Op>mn42LyLQULfSx}G`~mVEE=U~0 zdvsowbj}pU$Je}@zQ%EZlXFDI!a6L~|5U{8OZFdk5K)Jc3lg-%P%_Ypx-e2ElL5Q& zs&r$$3?r$3ta!}AaEav_{kdm8<|gSYt#0xiiVrTvpRW=-5RqM(RxKJNp3khE$2t-W zaHH0c`pl(`&V|k6UhZ$D3{Mu?OI`*tc?Ue!_`9f71vw>6AX9E3uEMM{Qr_=5O#q@$^N7n^|W zny2sYLy1oa=!qIDl^?x7bEdL-bLmqNss~B2S;yZf)fK`uH#TmCpwpt1_CVxhq6DKcOC7^ z5+Wj1=i^~?9x_DZHtWmyv#Id+xq7n0mS1NYin3)wA@Sgw{mC^0R|cq%sSWm&SKNo# zmG6<<{Pi-9(8#?Q))bA=d)1YF+v?-i&NG%rwC@(6l`w1!E{0G%%=dahsEwgP7IT`b zp+kNH{l? zvIeuMe?wV*mouX*KhOdTQ5YG0Xo6OqlIUa$P;)qNC>vLhDYq(?Nt|(!V{N%a_3&s_ zGJ-ViH6WHki41~C-OotM0wqt@pmM9i=+W7gQ_b5C9L%jbOC>OYHWFD zc+=I3ZsH!cC#==a;3ML%CKdY4v4gc*XzY2^MOL|}-hf_9d|4Ck$FU&w!r4{18&VGpAMjsq(N?m5 zpZC6*gP~&EjKolSz)w^pMB*i)4o&bd-C(m860|ygK+L1k(4|HpqldYvu_j4Gl15ms z(55dcJ@&~F`=K1s0`~(A4qw0}wCPj#woTvGkV|wtJ0cds*_U?hMzZczpod>N-CI9k zZrv59rUJkRtxw{_N2z%noK&l1QJ1=mQPesnjW@)qfxr@5R9-e4#j!jN<1o5P3A_Kc zLjM4F_3!^PfHv7lj97dgi4_sX&Djzs8eH>Ly5Yb*x9B0aL)xd+62*r#T2cic!#dzL zlsHEL1xB>4Qapu@tQbO34d<_<`EKJ>Tz@fg%0_;EFIAAicsI{%TXq$OGr>xCNW(|A zRww*x%AHwPEbSXJdNs&^gC^A!Mn|&Z$hG1G^8?u+OUdOw~A8mQ;z zUQ~`I=6$@~W0J{J%CYh$>7<7J@>`n5K`dkRp%RgY;;qDva>T<>srW4P`HF==n=m)4 zwmSQc#tpD(psBit7*r#GbGqrS3RjR7Zm=Vc|G=z`kT#y)o!#$T<}8pwGnsz1Tz{M;`7u!8;&lkn&5`ZIaspSNr3e*pN~BHsW2 diff --git a/examples/complete/images/6.jpg b/examples/complete/images/6.jpg deleted file mode 100644 index 30e13a5fa2daf70288618323eb394f5d2ce168fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10693 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 BkE#Fw diff --git a/examples/complete/main.c b/examples/complete/main.c index c875dd12..c041c2a2 100644 --- a/examples/complete/main.c +++ b/examples/complete/main.c @@ -1,7 +1,6 @@ -// Copyright (c) 2020 Cesanta Software Limited +// Copyright (c) 2020-2022 Cesanta Software Limited // All rights reserved -#include "mjson.h" #include "mongoose.h" // Authenticated user. @@ -22,25 +21,15 @@ static struct config { char *value2; } s_config = {123, NULL}; -// Stringifies the config. A caller must free() it. -static char *stringify_config(struct config *cfg) { - char *s = NULL; - mjson_printf(mjson_print_dynamic_buf, &s, "{%Q:%d,%Q:%Q}", "value1", - cfg->value1, "value2", cfg->value2); - return s; -} - // Update config structure. Return true if changed, false otherwise static bool update_config(struct mg_http_message *hm, struct config *cfg) { bool changed = false; char buf[256]; - double dv; - if (mjson_get_number(hm->body.ptr, hm->body.len, "$.value1", &dv)) { - cfg->value1 = dv; + if (mg_http_get_var(&hm->body, "value1", buf, sizeof(buf)) > 0) { + cfg->value1 = atoi(buf); changed = true; } - if (mjson_get_string(hm->body.ptr, hm->body.len, "$.value2", buf, - sizeof(buf)) > 0) { + if (mg_http_get_var(&hm->body, "value2", buf, sizeof(buf)) > 0) { free(cfg->value2); cfg->value2 = strdup(buf); changed = true; @@ -54,7 +43,7 @@ static struct user *getuser(struct mg_http_message *hm) { // In this example, user list is kept in RAM. In production, it can // be backed by file, database, or some other method. static struct user users[] = { - {"admin", "admin", "admin_token"}, + {"admin", "pass0", "admin_token"}, {"user1", "pass1", "user1_token"}, {"user2", "pass2", "user2_token"}, {NULL, NULL, NULL}, @@ -75,17 +64,18 @@ static struct user *getuser(struct mg_http_message *hm) { } // Notify all config watchers about the config change -static void notify_config_change(struct mg_mgr *mgr) { +static void send_notification(struct mg_mgr *mgr, const char *name, + const char *data) { struct mg_connection *c; - char *s = stringify_config(&s_config); for (c = mgr->conns; c != NULL; c = c->next) { - if (c->label[0] == 'W') mg_http_printf_chunk(c, "%s\n", s); + if (c->label[0] == 'W') + mg_http_printf_chunk(c, "{\"name\": \"%s\", \"data\": \"%s\"}", name, + data == NULL ? "" : data); } - free(s); } // HTTP request handler function -static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { +static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { if (ev == MG_EV_HTTP_MSG) { struct mg_http_message *hm = (struct mg_http_message *) ev_data; struct user *u = getuser(hm); @@ -95,35 +85,27 @@ static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { // All URIs starting with /api/ must be authenticated mg_printf(c, "%s", "HTTP/1.1 403 Denied\r\nContent-Length: 0\r\n\r\n"); } else if (mg_http_match_uri(hm, "/api/config/get")) { - char *s = stringify_config(&s_config); - mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s\n", - (int) strlen(s) + 1, s); - free(s); + mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); + mg_http_printf_chunk(c, "{\"%s\":%d,\"%s\":\"%s\"}", "value1", + s_config.value1, "value2", s_config.value2); + mg_http_printf_chunk(c, ""); } else if (mg_http_match_uri(hm, "/api/config/set")) { // Admins only if (strcmp(u->name, "admin") == 0) { - if (update_config(hm, &s_config)) notify_config_change(fn_data); + if (update_config(hm, &s_config)) + send_notification(fn_data, "config", NULL); mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); } else { mg_printf(c, "%s", "HTTP/1.1 403 Denied\r\nContent-Length: 0\r\n\r\n"); } - } else if (mg_http_match_uri(hm, "/api/config/watch")) { - c->label[0] = 'W'; // Mark ourselves as a config watcher - mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); - } else if (mg_http_match_uri(hm, "/api/video1")) { - c->label[0] = 'S'; // Mark that connection as live streamer - mg_printf( - c, "%s", - "HTTP/1.0 200 OK\r\n" - "Cache-Control: no-cache\r\n" - "Pragma: no-cache\r\nExpires: Thu, 01 Dec 1994 16:00:00 GMT\r\n" - "Content-Type: multipart/x-mixed-replace; boundary=--foo\r\n\r\n"); - } else if (mg_http_match_uri(hm, "/api/log/static")) { - struct mg_http_serve_opts opts; - memset(&opts, 0, sizeof(opts)); - mg_http_serve_file(c, hm, "log.txt", &opts); - } else if (mg_http_match_uri(hm, "/api/log/live")) { - c->label[0] = 'L'; // Mark that connection as live log listener + } else if (mg_http_match_uri(hm, "/api/message/send")) { + char buf[256]; + if (mg_http_get_var(&hm->body, "message", buf, sizeof(buf)) > 0) { + send_notification(fn_data, "message", buf); + } + mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + } else if (mg_http_match_uri(hm, "/api/watch")) { + c->label[0] = 'W'; // Mark ourselves as a event listener mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); } else if (mg_http_match_uri(hm, "/api/login")) { mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); @@ -132,71 +114,23 @@ static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { mg_http_printf_chunk(c, ""); } else { struct mg_http_serve_opts opts = {0}; +#if 1 + opts.root_dir = "/web_root"; + opts.fs = &mg_fs_packed; +#else opts.root_dir = "web_root"; +#endif mg_http_serve_dir(c, ev_data, &opts); } } } -// The image stream is simulated by sending MJPEG frames specified by the -// "files" array of file names. -static void broadcast_mjpeg_frame(struct mg_mgr *mgr) { - const char *files[] = {"images/1.jpg", "images/2.jpg", "images/3.jpg", - "images/4.jpg", "images/5.jpg", "images/6.jpg"}; - size_t nfiles = sizeof(files) / sizeof(files[0]); - static size_t i; - const char *path = files[i++ % nfiles]; - size_t size = 0; - char *data = mg_file_read(&mg_fs_posix, path, &size); // Read next file - struct mg_connection *c; - for (c = mgr->conns; c != NULL; c = c->next) { - if (c->label[0] != 'S') continue; // Skip non-stream connections - if (data == NULL || size == 0) continue; // Skip on file read error - mg_printf(c, - "--foo\r\nContent-Type: image/jpeg\r\n" - "Content-Length: %lu\r\n\r\n", - (unsigned long) size); - mg_send(c, data, size); - mg_send(c, "\r\n", 2); - } - free(data); -} - -static void mjpeg_cb(void *arg) { - broadcast_mjpeg_frame(arg); -} - -static void log_message(const char *filename, const char *message) { - FILE *fp = fopen(filename, "a"); - if (fp != NULL) { - fprintf(fp, "%s", message); - fclose(fp); - } -} - -static void broadcast_message(struct mg_mgr *mgr, const char *message) { - struct mg_connection *c; - for (c = mgr->conns; c != NULL; c = c->next) { - if (c->label[0] == 'L') mg_http_printf_chunk(c, "%s", message); - } -} - -// Timer function - called periodically. -// Prepare log message. Save it to a file, and broadcast. -static void log_cb(void *arg) { - char buf[64]; - snprintf(buf, sizeof(buf), "Time is: %lu\n", (unsigned long) time(NULL)); - log_message("log.txt", buf); - broadcast_message(arg, buf); -} - int main(void) { struct mg_mgr mgr; + s_config.value2 = strdup("hello"); mg_mgr_init(&mgr); - mg_http_listen(&mgr, "http://localhost:8000", cb, &mgr); - mg_timer_add(&mgr, 500, MG_TIMER_REPEAT, mjpeg_cb, &mgr); - mg_timer_add(&mgr, 1000, MG_TIMER_REPEAT, log_cb, &mgr); + mg_http_listen(&mgr, "http://0.0.0.0:8000", fn, &mgr); for (;;) mg_mgr_poll(&mgr, 50); mg_mgr_free(&mgr); diff --git a/examples/complete/mjson.c b/examples/complete/mjson.c deleted file mode 100644 index a0377eb6..00000000 --- a/examples/complete/mjson.c +++ /dev/null @@ -1,981 +0,0 @@ -// Copyright (c) 2018-2020 Cesanta Software Limited -// All rights reserved -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -#include "mjson.h" - -#if !defined(_MSC_VER) || _MSC_VER >= 1700 -#else -#define va_copy(x, y) (x) = (y) -#define snprintf _snprintf -#define alloca _alloca -#endif - -static int mjson_esc(int c, int esc) { - const char *p, *esc1 = "\b\f\n\r\t\\\"", *esc2 = "bfnrt\\\""; - for (p = esc ? esc1 : esc2; *p != '\0'; p++) { - if (*p == c) return esc ? esc2[p - esc1] : esc1[p - esc2]; - } - return 0; -} - -static int mjson_pass_string(const char *s, int len) { - int i; - for (i = 0; i < len; i++) { - if (s[i] == '\\' && i + 1 < len && mjson_esc(s[i + 1], 1)) { - i++; - } else if (s[i] == '\0') { - return MJSON_ERROR_INVALID_INPUT; - } else if (s[i] == '"') { - return i; - } - } - return MJSON_ERROR_INVALID_INPUT; -} - -int mjson(const char *s, int len, mjson_cb_t cb, void *ud) { - enum { S_VALUE, S_KEY, S_COLON, S_COMMA_OR_EOO } expecting = S_VALUE; - unsigned char nesting[MJSON_MAX_DEPTH]; - int i, depth = 0; -#define MJSONCALL(ev) \ - if (cb != NULL && cb(ev, s, start, i - start + 1, ud)) return i + 1; - -// In the ascii table, the distance between `[` and `]` is 2. -// Ditto for `{` and `}`. Hence +2 in the code below. -#define MJSONEOO() \ - do { \ - if (c != nesting[depth - 1] + 2) return MJSON_ERROR_INVALID_INPUT; \ - depth--; \ - if (depth == 0) { \ - MJSONCALL(tok); \ - return i + 1; \ - } \ - } while (0) - - for (i = 0; i < len; i++) { - int start = i; - unsigned char c = ((unsigned char *) s)[i]; - int tok = c; - if (c == ' ' || c == '\t' || c == '\n' || c == '\r') continue; - // printf("- %c [%.*s] %d %d\n", c, i, s, depth, expecting); - switch (expecting) { - case S_VALUE: - if (c == '{') { - if (depth >= (int) sizeof(nesting)) return MJSON_ERROR_TOO_DEEP; - nesting[depth++] = c; - expecting = S_KEY; - break; - } else if (c == '[') { - if (depth >= (int) sizeof(nesting)) return MJSON_ERROR_TOO_DEEP; - nesting[depth++] = c; - break; - } else if (c == ']' && depth > 0) { // Empty array - MJSONEOO(); - } else if (c == 't' && i + 3 < len && memcmp(&s[i], "true", 4) == 0) { - i += 3; - tok = MJSON_TOK_TRUE; - } else if (c == 'n' && i + 3 < len && memcmp(&s[i], "null", 4) == 0) { - i += 3; - tok = MJSON_TOK_NULL; - } else if (c == 'f' && i + 4 < len && memcmp(&s[i], "false", 5) == 0) { - i += 4; - tok = MJSON_TOK_FALSE; - } else if (c == '-' || ((c >= '0' && c <= '9'))) { - char *end = NULL; - strtod(&s[i], &end); - if (end != NULL) i += end - &s[i] - 1; - tok = MJSON_TOK_NUMBER; - } else if (c == '"') { - int n = mjson_pass_string(&s[i + 1], len - i - 1); - if (n < 0) return n; - i += n + 1; - tok = MJSON_TOK_STRING; - } else { - return MJSON_ERROR_INVALID_INPUT; - } - if (depth == 0) { - MJSONCALL(tok); - return i + 1; - } - expecting = S_COMMA_OR_EOO; - break; - - case S_KEY: - if (c == '"') { - int n = mjson_pass_string(&s[i + 1], len - i - 1); - if (n < 0) return n; - i += n + 1; - tok = MJSON_TOK_KEY; - expecting = S_COLON; - } else if (c == '}') { // Empty object - MJSONEOO(); - expecting = S_COMMA_OR_EOO; - } else { - return MJSON_ERROR_INVALID_INPUT; - } - break; - - case S_COLON: - if (c == ':') { - expecting = S_VALUE; - } else { - return MJSON_ERROR_INVALID_INPUT; - } - break; - - case S_COMMA_OR_EOO: - if (depth <= 0) return MJSON_ERROR_INVALID_INPUT; - if (c == ',') { - expecting = (nesting[depth - 1] == '{') ? S_KEY : S_VALUE; - } else if (c == ']' || c == '}') { - MJSONEOO(); - } else { - return MJSON_ERROR_INVALID_INPUT; - } - break; - } - MJSONCALL(tok); - } - return MJSON_ERROR_INVALID_INPUT; -} - -struct msjon_get_data { - const char *path; // Lookup json path - int pos; // Current path index - int d1; // Current depth of traversal - int d2; // Expected depth of traversal - int i1; // Index in an array - int i2; // Expected index in an array - int obj; // If the value is array/object, offset where it starts - const char **tokptr; // Destination - int *toklen; // Destination length - int tok; // Returned token -}; - -static int mjson_plen(const char *s) { - int i = 0; - while (s[i] != '\0' && s[i] != '.' && s[i] != '[') i++; - return i; -} - -static int mjson_get_cb(int tok, const char *s, int off, int len, void *ud) { - struct msjon_get_data *data = (struct msjon_get_data *) ud; - // printf("--> %2x %2d %2d %2d %2d\t'%s'\t'%.*s'\t\t'%.*s'\n", tok, data->d1, - // data->d2, data->i1, data->i2, data->path + data->pos, off, s, len, - // s + off); - if (data->tok != MJSON_TOK_INVALID) return 1; // Found - - if (tok == '{') { - if (!data->path[data->pos] && data->d1 == data->d2) data->obj = off; - data->d1++; - } else if (tok == '[') { - if (data->d1 == data->d2 && data->path[data->pos] == '[') { - data->i1 = 0; - data->i2 = (int) strtod(&data->path[data->pos + 1], NULL); - if (data->i1 == data->i2) { - data->d2++; - data->pos += 3; - } - } - if (!data->path[data->pos] && data->d1 == data->d2) data->obj = off; - data->d1++; - } else if (tok == ',') { - if (data->d1 == data->d2 + 1) { - data->i1++; - if (data->i1 == data->i2) { - while (data->path[data->pos] != ']') data->pos++; - data->pos++; - data->d2++; - } - } - } else if (tok == MJSON_TOK_KEY && data->d1 == data->d2 + 1 && - data->path[data->pos] == '.' && s[off] == '"' && - s[off + len - 1] == '"' && - mjson_plen(&data->path[data->pos + 1]) == len - 2 && - !memcmp(s + off + 1, &data->path[data->pos + 1], len - 2)) { - data->d2++; - data->pos += len - 1; - } else if (tok == MJSON_TOK_KEY && data->d1 == data->d2) { - return 1; // Exhausted path, not found - } else if (tok == '}' || tok == ']') { - data->d1--; - // data->d2--; - if (!data->path[data->pos] && data->d1 == data->d2 && data->obj != -1) { - data->tok = tok - 2; - if (data->tokptr) *data->tokptr = s + data->obj; - if (data->toklen) *data->toklen = off - data->obj + 1; - return 1; - } - } else if (MJSON_TOK_IS_VALUE(tok)) { - // printf("TOK --> %d\n", tok); - if (data->d1 == data->d2 && !data->path[data->pos]) { - data->tok = tok; - if (data->tokptr) *data->tokptr = s + off; - if (data->toklen) *data->toklen = len; - return 1; - } - } - return 0; -} - -enum mjson_tok mjson_find(const char *s, int len, const char *jp, - const char **tokptr, int *toklen) { - struct msjon_get_data data = {jp, 1, 0, 0, 0, - 0, -1, tokptr, toklen, MJSON_TOK_INVALID}; - if (jp[0] != '$') return MJSON_TOK_INVALID; - if (mjson(s, len, mjson_get_cb, &data) < 0) return MJSON_TOK_INVALID; - return (enum mjson_tok) data.tok; -} - -int mjson_get_number(const char *s, int len, const char *path, double *v) { - const char *p; - int tok, n; - if ((tok = mjson_find(s, len, path, &p, &n)) == MJSON_TOK_NUMBER) { - if (v != NULL) *v = strtod(p, NULL); - } - return tok == MJSON_TOK_NUMBER ? 1 : 0; -} - -int mjson_get_bool(const char *s, int len, const char *path, int *v) { - int tok = mjson_find(s, len, path, NULL, NULL); - if (tok == MJSON_TOK_TRUE && v != NULL) *v = 1; - if (tok == MJSON_TOK_FALSE && v != NULL) *v = 0; - return tok == MJSON_TOK_TRUE || tok == MJSON_TOK_FALSE ? 1 : 0; -} - -static int mjson_unescape(const char *s, int len, char *to, int n) { - int i, j; - for (i = 0, j = 0; i < len && j < n; i++, j++) { - if (s[i] == '\\' && i + 1 < len) { - int c = mjson_esc(s[i + 1], 0); - if (c == 0) return -1; - to[j] = c; - i++; - } else { - to[j] = s[i]; - } - } - if (j >= n) return -1; - if (n > 0) to[j] = '\0'; - return j; -} - -int mjson_get_string(const char *s, int len, const char *path, char *to, - int n) { - const char *p; - int sz; - if (mjson_find(s, len, path, &p, &sz) != MJSON_TOK_STRING) return -1; - return mjson_unescape(p + 1, sz - 2, to, n); -} - -int mjson_get_hex(const char *s, int len, const char *x, char *to, int n) { - const char *p; - int i, j, sz; - if (mjson_find(s, len, x, &p, &sz) != MJSON_TOK_STRING) return -1; - for (i = j = 0; i < sz - 3 && j < n; i += 2, j++) { -#define HEXTOI(x) (x >= '0' && x <= '9' ? x - '0' : x - 'W') - unsigned char a = *(const unsigned char *) (p + i + 1); - unsigned char b = *(const unsigned char *) (p + i + 2); - ((unsigned char *) to)[j] = (HEXTOI(a) << 4) | HEXTOI(b); - } - if (j < n) to[j] = '\0'; - return j; -} - -#if MJSON_ENABLE_BASE64 -static int mjson_base64rev(int c) { - if (c >= 'A' && c <= 'Z') { - return c - 'A'; - } else if (c >= 'a' && c <= 'z') { - return c + 26 - 'a'; - } else if (c >= '0' && c <= '9') { - return c + 52 - '0'; - } else if (c == '+') { - return 62; - } else if (c == '/') { - return 63; - } else { - return 64; - } -} - -int mjson_base64_dec(const char *src, int n, char *dst, int dlen) { - const char *end = src + n; - int len = 0; - while (src + 3 < end && len < dlen) { - int a = mjson_base64rev(src[0]), b = mjson_base64rev(src[1]), - c = mjson_base64rev(src[2]), d = mjson_base64rev(src[3]); - dst[len++] = (a << 2) | (b >> 4); - if (src[2] != '=' && len < dlen) { - dst[len++] = (b << 4) | (c >> 2); - if (src[3] != '=' && len < dlen) { - dst[len++] = (c << 6) | d; - } - } - src += 4; - } - if (len < dlen) dst[len] = '\0'; - return len; -} - -int mjson_get_base64(const char *s, int len, const char *path, char *to, - int n) { - const char *p; - int sz; - if (mjson_find(s, len, path, &p, &sz) != MJSON_TOK_STRING) return 0; - return mjson_base64_dec(p + 1, sz - 2, to, n); -} -#endif // MJSON_ENABLE_BASE64 - -#if MJSON_ENABLE_NEXT -struct nextdata { - int off, len, depth, t, vo, arrayindex; - int *koff, *klen, *voff, *vlen, *vtype; -}; - -static int next_cb(int tok, const char *s, int off, int len, void *ud) { - struct nextdata *d = (struct nextdata *) ud; - // int i; - switch (tok) { - case '{': - case '[': - if (d->depth == 0 && tok == '[') d->arrayindex = 0; - if (d->depth == 1 && off > d->off) { - d->vo = off; - d->t = tok == '{' ? MJSON_TOK_OBJECT : MJSON_TOK_ARRAY; - if (d->voff) *d->voff = off; - if (d->vtype) *d->vtype = d->t; - } - d->depth++; - break; - case '}': - case ']': - d->depth--; - if (d->depth == 1 && d->vo) { - d->len = off + len; - if (d->vlen) *d->vlen = d->len - d->vo; - if (d->arrayindex >= 0) { - if (d->koff) *d->koff = d->arrayindex; // koff holds array index - if (d->klen) *d->klen = 0; // klen holds 0 - } - return 1; - } - if (d->depth == 1 && d->arrayindex >= 0) d->arrayindex++; - break; - case ',': - case ':': - break; - case MJSON_TOK_KEY: - if (d->depth == 1 && d->off < off) { - if (d->koff) *d->koff = off; // And report back to the user - if (d->klen) *d->klen = len; // If we have to - } - break; - default: - if (d->depth != 1) break; - // If we're iterating over the array - if (off > d->off) { - d->len = off + len; - if (d->vlen) *d->vlen = len; // value length - if (d->voff) *d->voff = off; // value offset - if (d->vtype) *d->vtype = tok; // value type - if (d->arrayindex >= 0) { - if (d->koff) *d->koff = d->arrayindex; // koff holds array index - if (d->klen) *d->klen = 0; // klen holds 0 - } - return 1; - } - if (d->arrayindex >= 0) d->arrayindex++; - break; - } - (void) s; - return 0; -} - -int mjson_next(const char *s, int n, int off, int *koff, int *klen, int *voff, - int *vlen, int *vtype) { - struct nextdata d = {off, 0, 0, 0, 0, -1, koff, klen, voff, vlen, vtype}; - mjson(s, n, next_cb, &d); - return d.len; -} -#endif - -#if MJSON_ENABLE_PRINT -int mjson_print_fixed_buf(const char *ptr, int len, void *fndata) { - struct mjson_fixedbuf *fb = (struct mjson_fixedbuf *) fndata; - int i, left = fb->size - 1 - fb->len; - if (left < len) len = left; - for (i = 0; i < len; i++) fb->ptr[fb->len + i] = ptr[i]; - fb->len += len; - fb->ptr[fb->len] = '\0'; - return len; -} - -int mjson_print_dynamic_buf(const char *ptr, int len, void *fndata) { - char *s, *buf = *(char **) fndata; - int curlen = buf == NULL ? 0 : strlen(buf); - if ((s = (char *) realloc(buf, curlen + len + 1)) == NULL) { - return 0; - } else { - memcpy(s + curlen, ptr, len); - s[curlen + len] = '\0'; - *(char **) fndata = s; - return len; - } -} - -int mjson_print_null(const char *ptr, int len, void *userdata) { - (void) ptr; - (void) userdata; - return len; -} - -int mjson_print_file(const char *ptr, int len, void *userdata) { - return fwrite(ptr, 1, len, (FILE *) userdata); -} - -int mjson_print_buf(mjson_print_fn_t fn, void *fndata, const char *buf, - int len) { - return fn(buf, len, fndata); -} - -int mjson_print_int(mjson_print_fn_t fn, void *fndata, int value, - int is_signed) { - char buf[20]; - int len = snprintf(buf, sizeof(buf), is_signed ? "%d" : "%u", value); - return fn(buf, len, fndata); -} - -int mjson_print_long(mjson_print_fn_t fn, void *fndata, long value, - int is_signed) { - char buf[20]; - const char *fmt = (is_signed ? "%ld" : "%lu"); - int len = snprintf(buf, sizeof(buf), fmt, value); - return fn(buf, len, fndata); -} - -int mjson_print_dbl(mjson_print_fn_t fn, void *fndata, double d, - const char *fmt) { - char buf[40]; - int n = snprintf(buf, sizeof(buf), fmt, d); - return fn(buf, n, fndata); -} - -int mjson_print_str(mjson_print_fn_t fn, void *fndata, const char *s, int len) { - int i, n = fn("\"", 1, fndata); - for (i = 0; i < len; i++) { - char c = mjson_esc(s[i], 1); - if (c) { - n += fn("\\", 1, fndata); - n += fn(&c, 1, fndata); - } else { - n += fn(&s[i], 1, fndata); - } - } - return n + fn("\"", 1, fndata); -} - -#if MJSON_ENABLE_BASE64 -int mjson_print_b64(mjson_print_fn_t fn, void *fndata, const unsigned char *s, - int n) { - const char *t = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - int i, len = fn("\"", 1, fndata); - for (i = 0; i < n; i += 3) { - int a = s[i], b = i + 1 < n ? s[i + 1] : 0, c = i + 2 < n ? s[i + 2] : 0; - char buf[4] = {t[a >> 2], t[(a & 3) << 4 | (b >> 4)], '=', '='}; - if (i + 1 < n) buf[2] = t[(b & 15) << 2 | (c >> 6)]; - if (i + 2 < n) buf[3] = t[c & 63]; - len += fn(buf, sizeof(buf), fndata); - } - return len + fn("\"", 1, fndata); -} -#endif /* MJSON_ENABLE_BASE64 */ - -int mjson_vprintf(mjson_print_fn_t fn, void *fndata, const char *fmt, - va_list xap) { - int i = 0, n = 0; - va_list ap; - va_copy(ap, xap); - while (fmt[i] != '\0') { - if (fmt[i] == '%') { - char fc = fmt[++i]; - int is_long = 0; - if (fc == 'l') { - is_long = 1; - fc = fmt[i + 1]; - } - if (fc == 'Q') { - char *buf = va_arg(ap, char *); - n += mjson_print_str(fn, fndata, buf ? buf : "", buf ? strlen(buf) : 0); - } else if (strncmp(&fmt[i], ".*Q", 3) == 0) { - int len = va_arg(ap, int); - char *buf = va_arg(ap, char *); - n += mjson_print_str(fn, fndata, buf, len); - i += 2; - } else if (fc == 'd' || fc == 'u') { - int is_signed = (fc == 'd'); - if (is_long) { - long val = va_arg(ap, long); - n += mjson_print_long(fn, fndata, val, is_signed); - i++; - } else { - int val = va_arg(ap, int); - n += mjson_print_int(fn, fndata, val, is_signed); - } - } else if (fc == 'B') { - const char *s = va_arg(ap, int) ? "true" : "false"; - n += mjson_print_buf(fn, fndata, s, strlen(s)); - } else if (fc == 's') { - char *buf = va_arg(ap, char *); - n += mjson_print_buf(fn, fndata, buf, strlen(buf)); - } else if (strncmp(&fmt[i], ".*s", 3) == 0) { - int len = va_arg(ap, int); - char *buf = va_arg(ap, char *); - n += mjson_print_buf(fn, fndata, buf, len); - i += 2; - } else if (fc == 'g') { - n += mjson_print_dbl(fn, fndata, va_arg(ap, double), "%g"); - } else if (fc == 'f') { - n += mjson_print_dbl(fn, fndata, va_arg(ap, double), "%f"); -#if MJSON_ENABLE_BASE64 - } else if (fc == 'V') { - int len = va_arg(ap, int); - const char *buf = va_arg(ap, const char *); - n += mjson_print_b64(fn, fndata, (unsigned char *) buf, len); -#endif - } else if (fc == 'H') { - const char *hex = "0123456789abcdef"; - int i, len = va_arg(ap, int); - const unsigned char *p = va_arg(ap, const unsigned char *); - n += fn("\"", 1, fndata); - for (i = 0; i < len; i++) { - n += fn(&hex[(p[i] >> 4) & 15], 1, fndata); - n += fn(&hex[p[i] & 15], 1, fndata); - } - n += fn("\"", 1, fndata); - } else if (fc == 'M') { - mjson_vprint_fn_t vfn = va_arg(ap, mjson_vprint_fn_t); - n += vfn(fn, fndata, &ap); - } - i++; - } else { - n += mjson_print_buf(fn, fndata, &fmt[i++], 1); - } - } - va_end(xap); - va_end(ap); - return n; -} - -int mjson_printf(mjson_print_fn_t fn, void *fndata, const char *fmt, ...) { - va_list ap; - int len; - va_start(ap, fmt); - len = mjson_vprintf(fn, fndata, fmt, ap); - va_end(ap); - return len; -} -#endif /* MJSON_ENABLE_PRINT */ - -#if MJSON_IMPLEMENT_STRTOD -static inline int is_digit(int c) { - return c >= '0' && c <= '9'; -} - -/* NOTE: strtod() implementation by Yasuhiro Matsumoto. */ -double strtod(const char *str, char **end) { - double d = 0.0; - int sign = 1, n = 0; - const char *p = str, *a = str; - - /* decimal part */ - if (*p == '-') { - sign = -1; - ++p; - } else if (*p == '+') - ++p; - if (is_digit(*p)) { - d = (double) (*p++ - '0'); - while (*p && is_digit(*p)) { - d = d * 10.0 + (double) (*p - '0'); - ++p; - ++n; - } - a = p; - } else if (*p != '.') - goto done; - d *= sign; - - /* fraction part */ - if (*p == '.') { - double f = 0.0; - double base = 0.1; - ++p; - - if (is_digit(*p)) { - while (*p && is_digit(*p)) { - f += base * (*p - '0'); - base /= 10.0; - ++p; - ++n; - } - } - d += f * sign; - a = p; - } - - /* exponential part */ - if ((*p == 'E') || (*p == 'e')) { - int e = 0; - ++p; - - sign = 1; - if (*p == '-') { - sign = -1; - ++p; - } else if (*p == '+') - ++p; - - if (is_digit(*p)) { - while (*p == '0') ++p; - e = (int) (*p++ - '0'); - while (*p && is_digit(*p)) { - e = e * 10 + (int) (*p - '0'); - ++p; - } - e *= sign; - } else if (!is_digit(*(a - 1))) { - a = str; - goto done; - } else if (*p == 0) - goto done; - - if (d == 2.2250738585072011 && e == -308) { - d = 0.0; - a = p; - goto done; - } - if (d == 2.2250738585072012 && e <= -308) { - d *= 1.0e-308; - a = p; - goto done; - } - { - int i; - for (i = 0; i < 10; i++) d *= 10; - } - a = p; - } else if (p > str && !is_digit(*(p - 1))) { - a = str; - goto done; - } - -done: - if (end) *end = (char *) a; - return d; -} -#endif - -#if MJSON_ENABLE_MERGE -int mjson_merge(const char *s, int n, const char *s2, int n2, - mjson_print_fn_t fn, void *userdata) { - int koff, klen, voff, vlen, t, t2, k, off = 0, len = 0, comma = 0; - if (n < 2) return len; - len += fn("{", 1, userdata); - while ((off = mjson_next(s, n, off, &koff, &klen, &voff, &vlen, &t)) != 0) { -#if !defined(_MSC_VER) || _MSC_VER >= 1700 - char path[klen + 1]; -#else - char *path = (char *) alloca(klen + 1); -#endif - const char *val; - memcpy(path, "$.", 2); - memcpy(path + 2, s + koff + 1, klen - 2); - path[klen] = '\0'; - if ((t2 = mjson_find(s2, n2, path, &val, &k)) != MJSON_TOK_INVALID) { - if (t2 == MJSON_TOK_NULL) continue; // null deletes the key - } else { - val = s + voff; // Key is not found in the update. Copy the old value. - } - if (comma) len += fn(",", 1, userdata); - len += fn(s + koff, klen, userdata); - len += fn(":", 1, userdata); - if (t == MJSON_TOK_OBJECT && t2 == MJSON_TOK_OBJECT) { - len += mjson_merge(s + voff, vlen, val, k, fn, userdata); - } else { - if (t2 != MJSON_TOK_INVALID) vlen = k; - len += fn(val, vlen, userdata); - } - comma = 1; - } - // Add missing keys - off = 0; - while ((off = mjson_next(s2, n2, off, &koff, &klen, &voff, &vlen, &t)) != 0) { -#if !defined(_MSC_VER) || _MSC_VER >= 1700 - char path[klen + 1]; -#else - char *path = (char *) alloca(klen + 1); -#endif - const char *val; - if (t == MJSON_TOK_NULL) continue; - memcpy(path, "$.", 2); - memcpy(path + 2, s2 + koff + 1, klen - 2); - path[klen] = '\0'; - if (mjson_find(s, n, path, &val, &vlen) != MJSON_TOK_INVALID) continue; - if (comma) len += fn(",", 1, userdata); - len += fn(s2 + koff, klen, userdata); - len += fn(":", 1, userdata); - len += fn(s2 + voff, vlen, userdata); - comma = 1; - } - len += fn("}", 1, userdata); - return len; -} -#endif // MJSON_ENABLE_MERGE - -#if MJSON_ENABLE_PRETTY -struct prettydata { - int level; - int len; - int prev; - const char *pad; - int padlen; - mjson_print_fn_t fn; - void *userdata; -}; - -static int pretty_cb(int ev, const char *s, int off, int len, void *ud) { - struct prettydata *d = (struct prettydata *) ud; - int i; - switch (ev) { - case '{': - case '[': - d->level++; - d->len += d->fn(s + off, len, d->userdata); - break; - case '}': - case ']': - d->level--; - if (d->prev != '[' && d->prev != '{' && d->padlen > 0) { - d->len += d->fn("\n", 1, d->userdata); - for (i = 0; i < d->level; i++) - d->len += d->fn(d->pad, d->padlen, d->userdata); - } - d->len += d->fn(s + off, len, d->userdata); - break; - case ',': - d->len += d->fn(s + off, len, d->userdata); - if (d->padlen > 0) { - d->len += d->fn("\n", 1, d->userdata); - for (i = 0; i < d->level; i++) - d->len += d->fn(d->pad, d->padlen, d->userdata); - } - break; - case ':': - d->len += d->fn(s + off, len, d->userdata); - if (d->padlen > 0) d->len += d->fn(" ", 1, d->userdata); - break; - case MJSON_TOK_KEY: - if (d->prev == '{' && d->padlen > 0) { - d->len += d->fn("\n", 1, d->userdata); - for (i = 0; i < d->level; i++) - d->len += d->fn(d->pad, d->padlen, d->userdata); - } - d->len += d->fn(s + off, len, d->userdata); - break; - default: - if (d->prev == '[' && d->padlen > 0) { - d->len += d->fn("\n", 1, d->userdata); - for (i = 0; i < d->level; i++) - d->len += d->fn(d->pad, d->padlen, d->userdata); - } - d->len += d->fn(s + off, len, d->userdata); - break; - } - d->prev = ev; - return 0; -} - -int mjson_pretty(const char *s, int n, const char *pad, mjson_print_fn_t fn, - void *userdata) { - struct prettydata d = {0, 0, 0, pad, strlen(pad), fn, userdata}; - if (mjson(s, n, pretty_cb, &d) < 0) return -1; - return d.len; -} -#endif // MJSON_ENABLE_PRETTY - -#if MJSON_ENABLE_RPC -struct jsonrpc_ctx jsonrpc_default_context; -struct jsonrpc_userdata { - mjson_print_fn_t fn; - void *fndata; -}; - -int mjson_globmatch(const char *s1, int n1, const char *s2, int n2) { - int i = 0, j = 0, ni = 0, nj = 0; - while (i < n1 || j < n2) { - if (i < n1 && j < n2 && (s1[i] == '?' || s2[j] == s1[i])) { - i++, j++; - } else if (i < n1 && (s1[i] == '*' || s1[i] == '#')) { - ni = i, nj = j + 1, i++; - } else if (nj > 0 && nj <= n2 && (s1[i - 1] == '#' || s2[j] != '/')) { - i = ni, j = nj; - } else { - return 0; - } - } - return 1; -} - -static int jsonrpc_printer(const char *buf, int len, void *userdata) { - struct jsonrpc_userdata *u = (struct jsonrpc_userdata *) userdata; - return u->fn(buf, len, u->fndata); -} - -void jsonrpc_return_errorv(struct jsonrpc_request *r, int code, - const char *message, const char *data_fmt, - va_list ap) { - if (r->id_len == 0) return; - mjson_printf(r->fn, r->fndata, - "{\"id\":%.*s,\"error\":{\"code\":%d,\"message\":%Q", r->id_len, - r->id, code, message == NULL ? "" : message); - if (data_fmt != NULL) { - mjson_printf(r->fn, r->fndata, ",\"data\":"); - mjson_vprintf(r->fn, r->fndata, data_fmt, ap); - } - mjson_printf(r->fn, r->fndata, "}}\n"); -} - -void jsonrpc_return_error(struct jsonrpc_request *r, int code, - const char *message, const char *data_fmt, ...) { - va_list ap; - va_start(ap, data_fmt); - jsonrpc_return_errorv(r, code, message, data_fmt, ap); - va_end(ap); -} - -void jsonrpc_return_successv(struct jsonrpc_request *r, const char *result_fmt, - va_list ap) { - if (r->id_len == 0) return; - mjson_printf(r->fn, r->fndata, "{\"id\":%.*s,\"result\":", r->id_len, r->id); - if (result_fmt != NULL) { - mjson_vprintf(r->fn, r->fndata, result_fmt, ap); - } else { - mjson_printf(r->fn, r->fndata, "%s", "null"); - } - mjson_printf(r->fn, r->fndata, "}\n"); -} - -void jsonrpc_return_success(struct jsonrpc_request *r, const char *result_fmt, - ...) { - va_list ap; - va_start(ap, result_fmt); - jsonrpc_return_successv(r, result_fmt, ap); - va_end(ap); -} - -void jsonrpc_ctx_process(struct jsonrpc_ctx *ctx, const char *req, int req_sz, - mjson_print_fn_t fn, void *fndata) { - const char *result = NULL, *error = NULL; - int result_sz = 0, error_sz = 0; - struct jsonrpc_method *m = NULL; - struct jsonrpc_userdata d; - struct jsonrpc_request r = {req, req_sz, 0, 0, 0, 0, 0, - 0, &jsonrpc_printer, NULL, NULL}; - - d.fn = fn; - d.fndata = fndata; - r.fndata = &d; - - // Is is a response frame? - mjson_find(req, req_sz, "$.result", &result, &result_sz); - if (result == NULL) mjson_find(req, req_sz, "$.error", &error, &error_sz); - if (result_sz > 0 || error_sz > 0) { - if (ctx->response_cb != NULL) ctx->response_cb(req, req_sz, ctx->userdata); - return; - } - - // Method must exist and must be a string - if (mjson_find(req, req_sz, "$.method", &r.method, &r.method_len) != - MJSON_TOK_STRING) { - mjson_printf(fn, fndata, "{\"error\":{\"code\":-32700,\"message\":%.*Q}}\n", - req_sz, req); - ctx->in_len = 0; - return; - } - - // id and params are optional - mjson_find(req, req_sz, "$.id", &r.id, &r.id_len); - mjson_find(req, req_sz, "$.params", &r.params, &r.params_len); - - for (m = ctx->methods; m != NULL; m = m->next) { - if (mjson_globmatch(m->method, m->method_sz, r.method + 1, - r.method_len - 2) > 0) { - if (r.params == NULL) r.params = ""; - r.userdata = m->cbdata; - m->cb(&r); - break; - } - } - if (m == NULL) { - jsonrpc_return_error(&r, JSONRPC_ERROR_NOT_FOUND, "method not found", NULL); - } -} - -static int jsonrpc_print_methods(mjson_print_fn_t fn, void *fndata, - va_list *ap) { - struct jsonrpc_ctx *ctx = va_arg(*ap, struct jsonrpc_ctx *); - struct jsonrpc_method *m; - int len = 0; - for (m = ctx->methods; m != NULL; m = m->next) { - if (m != ctx->methods) len += mjson_print_buf(fn, fndata, ",", 1); - len += mjson_print_str(fn, fndata, m->method, strlen(m->method)); - } - return len; -} - -static void rpclist(struct jsonrpc_request *r) { - jsonrpc_return_success(r, "[%M]", jsonrpc_print_methods, r->userdata); -} - -void jsonrpc_ctx_init(struct jsonrpc_ctx *ctx, mjson_print_fn_t response_cb, - void *userdata) { - ctx->response_cb = response_cb; - ctx->userdata = userdata; - jsonrpc_ctx_export(ctx, MJSON_RPC_LIST_NAME, rpclist, ctx); -} - -void jsonrpc_ctx_process_byte(struct jsonrpc_ctx *ctx, unsigned char ch, - mjson_print_fn_t fn, void *p) { - if (ctx->in_len >= (int) sizeof(ctx->in)) ctx->in_len = 0; // Overflow - if (ch == '\n') { // If new line, parse frame - if (ctx->in_len > 1) jsonrpc_ctx_process(ctx, ctx->in, ctx->in_len, fn, p); - ctx->in_len = 0; - } else { - ctx->in[ctx->in_len] = ch; // Append to the buffer - ctx->in_len++; - } -} - -void jsonrpc_init(mjson_print_fn_t response_cb, void *userdata) { - jsonrpc_ctx_init(&jsonrpc_default_context, response_cb, userdata); -} -#endif // MJSON_ENABLE_RPC diff --git a/examples/complete/mjson.h b/examples/complete/mjson.h deleted file mode 100644 index 93788ac0..00000000 --- a/examples/complete/mjson.h +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) 2018-2020 Cesanta Software Limited -// All rights reserved -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -#ifndef MJSON_H -#define MJSON_H - -#include -#include -#include -#include - -#ifndef MJSON_ENABLE_PRINT -#define MJSON_ENABLE_PRINT 1 -#endif - -#ifndef MJSON_ENABLE_RPC -#define MJSON_ENABLE_RPC 1 -#endif - -#ifndef MJSON_ENABLE_BASE64 -#define MJSON_ENABLE_BASE64 1 -#endif - -#ifndef MJSON_ENABLE_MERGE -#define MJSON_ENABLE_MERGE 0 -#elif MJSON_ENABLE_MERGE -#define MJSON_ENABLE_NEXT 1 -#endif - -#ifndef MJSON_ENABLE_PRETTY -#define MJSON_ENABLE_PRETTY 0 -#elif MJSON_ENABLE_PRETTY -#define MJSON_ENABLE_NEXT 1 -#endif - -#ifndef MJSON_ENABLE_NEXT -#define MJSON_ENABLE_NEXT 0 -#endif - - -#ifndef MJSON_RPC_IN_BUF_SIZE -#define MJSON_RPC_IN_BUF_SIZE 256 -#endif - -#ifndef MJSON_RPC_LIST_NAME -#define MJSON_RPC_LIST_NAME "rpc.list" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - MJSON_ERROR_INVALID_INPUT = -1, - MJSON_ERROR_TOO_DEEP = -2, -}; - -enum mjson_tok { - MJSON_TOK_INVALID = 0, - MJSON_TOK_KEY = 1, - MJSON_TOK_STRING = 11, - MJSON_TOK_NUMBER = 12, - MJSON_TOK_TRUE = 13, - MJSON_TOK_FALSE = 14, - MJSON_TOK_NULL = 15, - MJSON_TOK_ARRAY = 91, - MJSON_TOK_OBJECT = 123, -}; -#define MJSON_TOK_IS_VALUE(t) ((t) > 10 && (t) < 20) - -typedef int (*mjson_cb_t)(int ev, const char *s, int off, int len, void *ud); - -#ifndef MJSON_MAX_DEPTH -#define MJSON_MAX_DEPTH 20 -#endif - -int mjson(const char *s, int len, mjson_cb_t cb, void *ud); -enum mjson_tok mjson_find(const char *s, int len, const char *jp, - const char **tokptr, int *toklen); -int mjson_get_number(const char *s, int len, const char *path, double *v); -int mjson_get_bool(const char *s, int len, const char *path, int *v); -int mjson_get_string(const char *s, int len, const char *path, char *to, int n); -int mjson_get_hex(const char *s, int len, const char *path, char *to, int n); - -#if MJSON_ENABLE_NEXT -int mjson_next(const char *s, int n, int off, int *koff, int *klen, int *voff, - int *vlen, int *vtype); -#endif - -#if MJSON_ENABLE_BASE64 -int mjson_get_base64(const char *s, int len, const char *path, char *to, int n); -int mjson_base64_dec(const char *src, int n, char *dst, int dlen); -#endif - -#if MJSON_ENABLE_PRINT -typedef int (*mjson_print_fn_t)(const char *buf, int len, void *userdata); -typedef int (*mjson_vprint_fn_t)(mjson_print_fn_t, void *, va_list *); - -struct mjson_fixedbuf { - char *ptr; - int size, len; -}; - -int mjson_printf(mjson_print_fn_t, void *, const char *fmt, ...); -int mjson_vprintf(mjson_print_fn_t, void *, const char *fmt, va_list ap); -int mjson_print_str(mjson_print_fn_t, void *, const char *s, int len); -int mjson_print_int(mjson_print_fn_t, void *, int value, int is_signed); -int mjson_print_long(mjson_print_fn_t, void *, long value, int is_signed); -int mjson_print_buf(mjson_print_fn_t fn, void *, const char *buf, int len); - -int mjson_print_null(const char *ptr, int len, void *userdata); -int mjson_print_file(const char *ptr, int len, void *userdata); -int mjson_print_fixed_buf(const char *ptr, int len, void *userdata); -int mjson_print_dynamic_buf(const char *ptr, int len, void *userdata); - -#if MJSON_ENABLE_PRETTY -int mjson_pretty(const char *, int, const char *, mjson_print_fn_t, void *); -#endif - -#if MJSON_ENABLE_MERGE -int mjson_merge(const char *, int, const char *, int, mjson_print_fn_t, void *); -#endif - -#endif // MJSON_ENABLE_PRINT - -#if MJSON_ENABLE_RPC - -void jsonrpc_init(mjson_print_fn_t, void *userdata); -int mjson_globmatch(const char *s1, int n1, const char *s2, int n2); - -struct jsonrpc_request { - const char *frame; // Points to the whole frame - int frame_len; // Frame length - const char *params; // Points to the "params" in the request frame - int params_len; // Length of the "params" - const char *id; // Points to the "id" in the request frame - int id_len; // Length of the "id" - const char *method; // Points to the "method" in the request frame - int method_len; // Length of the "method" - mjson_print_fn_t fn; // Printer function - void *fndata; // Printer function data - void *userdata; // Callback's user data as specified at export time -}; - -struct jsonrpc_method { - const char *method; - int method_sz; - void (*cb)(struct jsonrpc_request *); - void *cbdata; - struct jsonrpc_method *next; -}; - -// Main RPC context, stores current request information and a list of -// exported RPC methods. -struct jsonrpc_ctx { - struct jsonrpc_method *methods; - void *userdata; - mjson_print_fn_t response_cb; - int in_len; - char in[MJSON_RPC_IN_BUF_SIZE]; -}; - -// Registers function fn under the given name within the given RPC context -#define jsonrpc_ctx_export(ctx, name, fn, ud) \ - do { \ - static struct jsonrpc_method m = {(name), sizeof(name) - 1, (fn), 0, 0}; \ - m.cbdata = (ud); \ - m.next = (ctx)->methods; \ - (ctx)->methods = &m; \ - } while (0) - -void jsonrpc_ctx_init(struct jsonrpc_ctx *ctx, mjson_print_fn_t, void *); -void jsonrpc_return_error(struct jsonrpc_request *r, int code, - const char *message, const char *data_fmt, ...); -void jsonrpc_return_success(struct jsonrpc_request *r, const char *result_fmt, - ...); -void jsonrpc_ctx_process(struct jsonrpc_ctx *ctx, const char *req, int req_sz, - mjson_print_fn_t fn, void *fndata); -void jsonrpc_ctx_process_byte(struct jsonrpc_ctx *ctx, unsigned char ch, - mjson_print_fn_t fn, void *fndata); - -extern struct jsonrpc_ctx jsonrpc_default_context; - -#define jsonrpc_export(name, fn, ud) \ - jsonrpc_ctx_export(&jsonrpc_default_context, (name), (fn), (ud)) - -#define jsonrpc_process(buf, len, fn, data) \ - jsonrpc_ctx_process(&jsonrpc_default_context, (buf), (len), (fn), (data)) - -#define jsonrpc_process_byte(x, fn, data) \ - jsonrpc_ctx_process_byte(&jsonrpc_default_context, (x), (fn), (data)) - -#define JSONRPC_ERROR_INVALID -32700 /* Invalid JSON was received */ -#define JSONRPC_ERROR_NOT_FOUND -32601 /* The method does not exist */ -#define JSONRPC_ERROR_BAD_PARAMS -32602 /* Invalid params passed */ -#define JSONRPC_ERROR_INTERNAL -32603 /* Internal JSON-RPC error */ - -#endif // MJSON_ENABLE_RPC -#ifdef __cplusplus -} -#endif -#endif // MJSON_H diff --git a/examples/complete/packed_fs.c b/examples/complete/packed_fs.c new file mode 100644 index 00000000..c88c17de --- /dev/null +++ b/examples/complete/packed_fs.c @@ -0,0 +1,2360 @@ +#include +#include +#include + +static const unsigned char v1[] = { + 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 // . +}; +static const unsigned char v2[] = { + 39, 117, 115, 101, 32, 115, 116, 114, 105, 99, 116, 39, // 'use strict' + 59, 10, 105, 109, 112, 111, 114, 116, 32, 123, 67, 111, // ;.import {Co + 109, 112, 111, 110, 101, 110, 116, 44, 32, 104, 44, 32, // mponent, h, + 104, 116, 109, 108, 44, 32, 114, 101, 110, 100, 101, 114, // html, render + 44, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // , useEffect, + 32, 117, 115, 101, 83, 116, 97, 116, 101, 125, 32, 102, // useState} f + 114, 111, 109, 32, 39, 46, 47, 112, 114, 101, 97, 99, // rom './preac + 116, 46, 109, 105, 110, 46, 106, 115, 39, 59, 10, 10, // t.min.js';.. + 99, 111, 110, 115, 116, 32, 78, 97, 118, 32, 61, 32, // const Nav = + 112, 114, 111, 112, 115, 32, 61, 62, 32, 104, 116, 109, // props => htm + 108, 96, 10, 60, 100, 105, 118, 32, 115, 116, 121, 108, // l`.
.
+ 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 115, 116, // .
. + 32, 32, 32, 32, 32, 60, 98, 62, 89, 111, 117, 114, // Your + 32, 80, 114, 111, 100, 117, 99, 116, 60, 47, 98, 62, // Product + 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, 32, 32, 60, 115, 112, 97, 110, 62, 76, // L + 111, 103, 103, 101, 100, 32, 105, 110, 32, 97, 115, 58, // ogged in as: + 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, // . + 32, 32, 60, 115, 112, 97, 110, 32, 115, 116, 121, 108, // . ${props. + 117, 115, 101, 114, 125, 60, 47, 115, 112, 97, 110, 62, // user} + 10, 32, 32, 32, 32, 32, 32, 60, 97, 32, 99, 108, // . logo + 117, 116, 60, 47, 97, 62, 10, 32, 32, 32, 32, 60, // ut. < + 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, 100, 105, // /div>. .
`;. + 10, 99, 111, 110, 115, 116, 32, 70, 111, 111, 116, 101, // .const Foote + 114, 32, 61, 32, 112, 114, 111, 112, 115, 32, 61, 62, // r = props => + 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
. Copy + 114, 105, 103, 104, 116, 32, 40, 99, 41, 32, 89, 111, // right (c) Yo + 117, 114, 32, 67, 111, 109, 112, 97, 110, 121, 10, 60, // ur Company.< + 47, 100, 105, 118, 62, 10, 96, 59, 10, 10, 10, 99, // /div>.`;...c + 111, 110, 115, 116, 32, 72, 101, 114, 111, 32, 61, 32, // onst Hero = + 112, 114, 111, 112, 115, 32, 61, 62, 32, 104, 116, 109, // props => htm + 108, 96, 10, 60, 100, 105, 118, 32, 115, 116, 121, 108, // l`.
.

Interactive + 32, 68, 101, 118, 105, 99, 101, 32, 68, 97, 115, 104, // Device Dash + 98, 111, 97, 114, 100, 60, 47, 104, 49, 62, 10, 10, // board

.. + 32, 32, 84, 104, 105, 115, 32, 100, 101, 118, 105, 99, // This devic + 101, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, 32, // e dashboard + 105, 115, 32, 100, 101, 118, 101, 108, 111, 112, 101, 100, // is developed + 32, 119, 105, 116, 104, 32, 109, 111, 100, 101, 114, 110, // with modern + 32, 97, 110, 100, 32, 99, 111, 109, 112, 97, 99, 116, // and compact + 32, 80, 114, 101, 97, 99, 116, 32, 102, 114, 97, 109, // Preact fram + 101, 119, 111, 114, 107, 44, 10, 32, 32, 105, 110, 32, // ework,. in + 111, 114, 100, 101, 114, 32, 116, 111, 32, 102, 105, 116, // order to fit + 32, 111, 110, 32, 97, 32, 118, 101, 114, 121, 32, 115, // on a very s + 109, 97, 108, 108, 32, 100, 101, 118, 105, 99, 101, 115, // mall devices + 46, 32, 84, 104, 105, 115, 32, 105, 115, 10, 32, 32, // . This is. + 97, 32, 60, 97, 32, 104, 114, 101, 102, 61, 34, 104, // a hybri + 100, 32, 115, 101, 114, 118, 101, 114, 60, 47, 97, 62, // d server + 32, 119, 104, 105, 99, 104, 10, 32, 32, 112, 114, 111, // which. pro + 118, 105, 100, 101, 115, 32, 98, 111, 116, 104, 32, 115, // vides both s + 116, 97, 116, 105, 99, 32, 97, 110, 100, 32, 100, 121, // tatic and dy + 110, 97, 109, 105, 99, 32, 99, 111, 110, 116, 101, 110, // namic conten + 116, 46, 32, 32, 83, 116, 97, 116, 105, 99, 32, 102, // t. Static f + 105, 108, 101, 115, 44, 32, 108, 105, 107, 101, 32, 67, // iles, like C + 83, 83, 47, 74, 83, 47, 72, 84, 77, 76, 10, 32, // SS/JS/HTML. + 32, 111, 114, 32, 105, 109, 97, 103, 101, 115, 44, 32, // or images, + 97, 114, 101, 32, 99, 111, 109, 112, 105, 108, 101, 100, // are compiled + 32, 105, 110, 116, 111, 32, 116, 104, 101, 32, 115, 101, // into the se + 114, 118, 101, 114, 32, 98, 105, 110, 97, 114, 121, 46, // rver binary. + 32, 68, 121, 110, 97, 109, 105, 99, 32, 99, 111, 110, // Dynamic con + 116, 101, 110, 116, 32, 105, 115, 10, 32, 32, 115, 101, // tent is. se + 114, 118, 101, 100, 32, 118, 105, 97, 32, 116, 104, 101, // rved via the + 32, 82, 69, 83, 84, 32, 65, 80, 73, 46, 32, 10, // REST API. . + 10, 32, 32, 84, 104, 105, 115, 32, 100, 97, 115, 104, // . This dash + 98, 111, 97, 114, 100, 32, 115, 104, 111, 119, 115, 32, // board shows + 118, 97, 108, 117, 101, 115, 32, 107, 101, 112, 116, 32, // values kept + 105, 110, 32, 115, 101, 114, 118, 101, 114, 32, 109, 101, // in server me + 109, 111, 114, 121, 46, 32, 77, 97, 110, 121, 32, 99, // mory. Many c + 108, 105, 101, 110, 116, 115, 32, 99, 97, 110, 32, 111, // lients can o + 112, 101, 110, 10, 32, 32, 116, 104, 105, 115, 32, 112, // pen. this p + 97, 103, 101, 46, 32, 32, 84, 104, 101, 32, 74, 83, // age. The JS + 32, 99, 111, 100, 101, 32, 116, 104, 97, 116, 32, 119, // code that w + 97, 116, 99, 104, 101, 115, 32, 115, 116, 97, 116, 101, // atches state + 32, 99, 104, 97, 110, 103, 101, 115, 44, 32, 114, 101, // changes, re + 99, 111, 110, 110, 101, 99, 116, 115, 32, 111, 110, 32, // connects on + 110, 101, 116, 119, 111, 114, 107, 10, 32, 32, 102, 97, // network. fa + 105, 108, 117, 114, 101, 115, 46, 32, 32, 84, 104, 97, // ilures. Tha + 116, 32, 109, 101, 97, 110, 115, 32, 105, 102, 32, 115, // t means if s + 101, 114, 118, 101, 114, 32, 114, 101, 115, 116, 97, 114, // erver restar + 116, 115, 44, 32, 100, 97, 115, 104, 98, 111, 97, 114, // ts, dashboar + 100, 32, 111, 110, 32, 97, 108, 108, 32, 99, 111, 110, // d on all con + 110, 101, 99, 116, 101, 100, 32, 99, 108, 105, 101, 110, // nected clien + 116, 115, 10, 32, 32, 114, 101, 102, 114, 101, 115, 104, // ts. refresh + 32, 97, 117, 116, 111, 109, 97, 116, 105, 99, 97, 108, // automatical + 108, 121, 46, 10, 10, 32, 32, 78, 79, 84, 69, 58, // ly... NOTE: + 32, 97, 100, 109, 105, 110, 105, 115, 116, 114, 97, 116, // administrat + 111, 114, 115, 32, 99, 97, 110, 32, 99, 104, 97, 110, // ors can chan + 103, 101, 32, 115, 101, 116, 116, 105, 110, 103, 115, 32, // ge settings + 118, 97, 108, 117, 101, 115, 44, 32, 119, 104, 105, 108, // values, whil + 115, 116, 32, 117, 115, 101, 114, 115, 32, 99, 97, 110, // st users can + 110, 111, 116, 46, 10, 10, 32, 32, 60, 112, 62, 10, // not...

. + 32, 32, 84, 104, 105, 115, 32, 85, 73, 32, 117, 115, // This UI us + 101, 115, 32, 116, 104, 101, 32, 82, 69, 83, 84, 32, // es the REST + 65, 80, 73, 32, 105, 109, 112, 108, 101, 109, 101, 110, // API implemen + 116, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 115, // ted by the s + 101, 114, 118, 101, 114, 44, 32, 119, 104, 105, 99, 104, // erver, which + 32, 121, 111, 117, 32, 99, 97, 110, 32, 101, 120, 97, // you can exa + 109, 105, 110, 101, 10, 32, 32, 117, 115, 105, 110, 103, // mine. using + 32, 32, 60, 99, 111, 100, 101, 62, 99, 117, 114, 108, // curl + 60, 47, 99, 111, 100, 101, 62, 32, 99, 111, 109, 109, // comm + 97, 110, 100, 45, 108, 105, 110, 101, 32, 117, 116, 105, // and-line uti + 108, 105, 116, 121, 58, 10, 32, 32, 60, 47, 112, 62, // lity:.

+ 10, 10, 32, 32, 60, 100, 105, 118, 62, 60, 99, 111, // ..
curl loca + 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, 47, 97, // lhost:8000/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, 45, 32, 103, // t - g + 101, 116, 32, 99, 117, 114, 114, 101, 110, 116, 32, 100, // et current d + 101, 118, 105, 99, 101, 32, 99, 111, 110, 102, 105, 103, // evice config + 117, 114, 97, 116, 105, 111, 110, 60, 47, 100, 105, 118, // uration
.
curl loca + 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, 47, 97, // lhost:8000/a + 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, 115, 101, // pi/config/se + 116, 32, 45, 100, 32, 39, 118, 97, 108, 117, 101, 49, // t -d 'value1 + 61, 55, 38, 118, 97, 108, 117, 101, 50, 61, 104, 101, // =7&value2=he + 108, 108, 111, 39, 60, 47, 99, 111, 100, 101, 62, 32, // llo' + 45, 32, 115, 101, 116, 32, 100, 101, 118, 105, 99, 101, // - set device + 32, 99, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, // configurati + 111, 110, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, // on
. < + 100, 105, 118, 62, 60, 99, 111, 100, 101, 62, 99, 117, // div>cu + 114, 108, 32, 108, 111, 99, 97, 108, 104, 111, 115, 116, // rl localhost + 58, 56, 48, 48, 48, 47, 97, 112, 105, 47, 109, 101, // :8000/api/me + 115, 115, 97, 103, 101, 47, 115, 101, 110, 100, 32, 45, // ssage/send - + 100, 32, 39, 109, 115, 103, 61, 104, 101, 108, 108, 111, // d 'msg=hello + 39, 60, 47, 99, 111, 100, 101, 62, 32, 45, 32, 115, // ' - s + 101, 110, 100, 32, 99, 104, 97, 116, 32, 109, 101, 115, // end chat mes + 115, 97, 103, 101, 60, 47, 100, 105, 118, 62, 10, 32, // sage
. + 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, 101, 62, //
+ 99, 117, 114, 108, 32, 108, 111, 99, 97, 108, 104, 111, // curl localho + 115, 116, 58, 56, 48, 48, 48, 47, 97, 112, 105, 47, // st:8000/api/ + 119, 97, 116, 99, 104, 60, 47, 99, 111, 100, 101, 62, // watch + 32, 45, 32, 103, 101, 116, 32, 110, 111, 116, 105, 102, // - get notif + 105, 99, 97, 116, 105, 111, 110, 115, 32, 111, 110, 32, // ications on + 99, 111, 110, 102, 105, 103, 32, 99, 104, 97, 110, 103, // config chang + 101, 115, 32, 111, 114, 32, 99, 104, 97, 116, 32, 109, // es or chat m + 101, 115, 115, 97, 103, 101, 115, 60, 47, 100, 105, 118, // essages
..
`;. + 10, 99, 111, 110, 115, 116, 32, 83, 104, 111, 119, 83, // .const ShowS + 101, 116, 116, 105, 110, 103, 115, 32, 61, 32, 102, 117, // ettings = fu + 110, 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, // nction(props + 41, 32, 123, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ) {. return + 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.

Device con + 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 60, 47, // figuration.
+ 10, 32, 32, 32, 32, 60, 115, 112, 97, 110, 32, 99, // . value1:. . .
+ 10, 32, 32, 32, 32, 60, 115, 112, 97, 110, 32, 99, // . value2:. . .
+ 10, 32, 32, 32, 32, 83, 101, 114, 118, 101, 114, 39, // . Server' + 115, 32, 99, 111, 114, 114, 101, 115, 112, 111, 110, 100, // s correspond + 105, 110, 103, 32, 114, 117, 110, 116, 105, 109, 101, 32, // ing runtime + 99, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // configuratio + 110, 32, 115, 116, 114, 117, 99, 116, 117, 114, 101, 58, // n structure: + 10, 32, 32, 32, 32, 60, 112, 114, 101, 62, 10, 115, // .
.s
+ 116, 114, 117,  99, 116,  32,  99, 111, 110, 102, 105, 103, // truct config
+  32, 123,  10,  32,  32, 105, 110, 116,  32, 118,  97, 108, //  {.  int val
+ 117, 101,  49,  59,  10,  32,  32,  99, 104,  97, 114,  32, // ue1;.  char 
+  42, 118,  97, 108, 117, 101,  50,  59,  10, 125,  32, 115, // *value2;.} s
+  95,  99, 111, 110, 102, 105, 103,  59,  10,  32,  32,  32, // _config;.   
+  32,  60,  47, 112, 114, 101,  62,  10,  32,  32,  60,  47, //  
. .
` + 59, 10, 125, 59, 10, 10, 99, 111, 110, 115, 116, 32, // ;.};..const + 67, 104, 97, 110, 103, 101, 83, 101, 116, 116, 105, 110, // ChangeSettin + 103, 115, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // gs = functio + 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, // n(props) {. + 32, 99, 111, 110, 115, 116, 32, 91, 118, 97, 108, 117, // const [valu + 101, 49, 44, 32, 115, 101, 116, 86, 97, 108, 117, 101, // e1, setValue + 49, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, // 1] = useStat + 101, 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, // e('');. con + 115, 116, 32, 91, 118, 97, 108, 117, 101, 50, 44, 32, // st [value2, + 115, 101, 116, 86, 97, 108, 117, 101, 50, 93, 32, 61, // setValue2] = + 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState('' + 41, 59, 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, 115, 101, 116, 86, 97, 108, 117, 101, 49, // setValue1 + 40, 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, // (props.confi + 103, 46, 118, 97, 108, 117, 101, 49, 41, 59, 10, 32, // g.value1);. + 32, 32, 32, 115, 101, 116, 86, 97, 108, 117, 101, 50, // setValue2 + 40, 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, // (props.confi + 103, 46, 118, 97, 108, 117, 101, 50, 41, 59, 10, 32, // g.value2);. + 32, 125, 44, 32, 91, 112, 114, 111, 112, 115, 46, 99, // }, [props.c + 111, 110, 102, 105, 103, 46, 118, 97, 108, 117, 101, 49, // onfig.value1 + 44, 32, 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, // , props.conf + 105, 103, 46, 118, 97, 108, 117, 101, 50, 93, 41, 10, // ig.value2]). + 32, 32, 99, 111, 110, 115, 116, 32, 117, 112, 100, 97, // const upda + 116, 101, 32, 61, 32, 40, 110, 97, 109, 101, 44, 32, // te = (name, + 118, 97, 108, 41, 32, 61, 62, 32, 102, 101, 116, 99, // val) => fetc + 104, 40, 39, 47, 97, 112, 105, 47, 99, 111, 110, 102, // h('/api/conf + 105, 103, 47, 115, 101, 116, 39, 44, 32, 123, 10, 32, // ig/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, 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, 32, 32, 32, 32, 98, // b + 111, 100, 121, 58, 32, 96, 36, 123, 110, 97, 109, 101, // ody: `${name + 125, 61, 36, 123, 101, 110, 99, 111, 100, 101, 85, 82, // }=${encodeUR + 73, 67, 111, 109, 112, 111, 110, 101, 110, 116, 40, 118, // IComponent(v + 97, 108, 41, 125, 96, 10, 32, 32, 32, 32, 32, 32, // al)}`. + 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, // }).catch(e + 114, 114, 32, 61, 62, 32, 101, 114, 114, 41, 59, 10, // rr => err);. + 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, // return htm + 108, 96, 10, 60, 100, 105, 118, 32, 115, 116, 121, 108, // l`.
. + 60, 104, 51, 32, 115, 116, 121, 108, 101, 61, 34, 98, //

. Chang + 101, 32, 99, 111, 110, 102, 105, 103, 117, 114, 97, 116, // e configurat + 105, 111, 110, 60, 47, 104, 51, 62, 10, 32, 32, 60, // ion

. < + 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, 60, 115, // 0;">. value1 + 58, 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, // :. + 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, // setValue1( + 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, // ev.target.va + 108, 117, 101, 41, 125, 32, 47, 62, 10, 32, 32, 32, // lue)} />. + 32, 60, 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, // . + 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, //
. . value2: + 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, //
. + 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // + 32, 115, 101, 116, 86, 97, 108, 117, 101, 50, 40, 101, // setValue2(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, 32, 32, // ue)} />. + 60, 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, 115, // . + 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, //
. . As so + 111, 110, 32, 97, 115, 32, 97, 100, 109, 105, 110, 105, // on as admini + 115, 116, 114, 97, 116, 111, 114, 32, 117, 112, 100, 97, // strator upda + 116, 101, 115, 32, 99, 111, 110, 102, 105, 103, 117, 114, // tes configur + 97, 116, 105, 111, 110, 44, 32, 10, 32, 32, 32, 32, // ation, . + 115, 101, 114, 118, 101, 114, 32, 105, 116, 101, 114, 97, // server itera + 116, 101, 115, 32, 111, 118, 101, 114, 32, 97, 108, 108, // tes over all + 32, 99, 111, 110, 110, 101, 99, 116, 101, 100, 32, 99, // connected c + 108, 105, 101, 110, 116, 115, 32, 97, 110, 100, 32, 115, // lients and s + 101, 110, 100, 115, 32, 117, 112, 100, 97, 116, 101, 10, // ends update. + 32, 32, 32, 32, 110, 111, 116, 105, 102, 105, 99, 97, // notifica + 116, 105, 111, 110, 115, 32, 116, 111, 32, 97, 108, 108, // tions to all + 32, 111, 102, 32, 116, 104, 101, 109, 32, 45, 32, 115, // of them - s + 111, 32, 116, 104, 101, 121, 32, 117, 112, 100, 97, 116, // o they updat + 101, 32, 97, 117, 116, 111, 109, 97, 116, 105, 99, 97, // e automatica + 108, 108, 121, 46, 10, 32, 32, 60, 47, 100, 105, 118, // lly..
.

`;.} + 59, 10, 10, 99, 111, 110, 115, 116, 32, 76, 111, 103, // ;..const Log + 105, 110, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // in = 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 [ + 112, 97, 115, 115, 44, 32, 115, 101, 116, 80, 97, 115, // pass, setPas + 115, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, // s] = useStat + 101, 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, // e('');. con + 115, 116, 32, 108, 111, 103, 105, 110, 32, 61, 32, 101, // st login = e + 118, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, 102, // v =>. f + 101, 116, 99, 104, 40, 10, 32, 32, 32, 32, 32, 32, // etch(. + 32, 32, 32, 32, 39, 47, 97, 112, 105, 47, 108, 111, // '/api/lo + 103, 105, 110, 39, 44, 10, 32, 32, 32, 32, 32, 32, // gin',. + 32, 32, 32, 32, 123, 104, 101, 97, 100, 101, 114, 115, // {headers + 58, 32, 123, 65, 117, 116, 104, 111, 114, 105, 122, 97, // : {Authoriza + 116, 105, 111, 110, 58, 32, 39, 66, 97, 115, 105, 99, // tion: 'Basic + 32, 39, 32, 43, 32, 98, 116, 111, 97, 40, 117, 115, // ' + btoa(us + 101, 114, 32, 43, 32, 39, 58, 39, 32, 43, 32, 112, // er + ':' + p + 97, 115, 115, 41, 125, 125, 41, 10, 32, 32, 32, 32, // ass)}}). + 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, // .then( + 114, 32, 61, 62, 32, 114, 46, 106, 115, 111, 110, 40, // r => r.json( + 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // )). + 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, // .then(r => + 114, 32, 38, 38, 32, 112, 114, 111, 112, 115, 46, 108, // r && props.l + 111, 103, 105, 110, 40, 114, 41, 41, 10, 32, 32, 32, // ogin(r)). + 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, // .catc + 104, 40, 101, 114, 114, 32, 61, 62, 32, 101, 114, 114, // h(err => err + 41, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, // );. return + 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, 99, // html`.
.
. + 32, 32, 32, 32, 60, 104, 49, 32, 115, 116, 121, 108, //

Device + 68, 97, 115, 104, 98, 111, 97, 114, 100, 32, 76, 111, // Dashboard Lo + 103, 105, 110, 32, 60, 47, 104, 49, 62, 10, 32, 32, // gin

. + 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
. + 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, // setUser(ev + 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, // .target.valu + 101, 41, 125, 32, 118, 97, 108, 117, 101, 61, 36, 123, // e)} value=${ + 117, 115, 101, 114, 125, 32, 47, 62, 10, 32, 32, 32, // user} />. + 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, //
. + 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. + 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, // setP + 97, 115, 115, 40, 101, 118, 46, 116, 97, 114, 103, 101, // ass(ev.targe + 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 118, 97, // t.value)} va + 108, 117, 101, 61, 36, 123, 112, 97, 115, 115, 125, 10, // lue=${pass}. + 32, 32, 32, 32, 32, 32, 32, 32, 111, 110, 99, 104, // onch + 97, 110, 103, 101, 61, 36, 123, 108, 111, 103, 105, 110, // ange=${login + 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, 47, 100, // } />. .
+ 10, 32, 32, 32, 32, 32, 32, 60, 98, 117, 116, 116, // . L + 111, 103, 105, 110, 32, 60, 47, 98, 117, 116, 116, 111, // ogin .
.
. Vali + 100, 32, 108, 111, 103, 105, 110, 115, 58, 32, 97, 100, // d logins: ad + 109, 105, 110, 58, 112, 97, 115, 115, 48, 44, 32, 117, // min:pass0, u + 115, 101, 114, 49, 58, 112, 97, 115, 115, 49, 44, 32, // ser1:pass1, + 117, 115, 101, 114, 50, 58, 112, 97, 115, 115, 50, 10, // user2:pass2. + 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, //
. + 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, //
.`;.};..con + 115, 116, 32, 77, 101, 115, 115, 97, 103, 101, 32, 61, // st Message = + 32, 116, 101, 120, 116, 32, 61, 62, 32, 104, 116, 109, // text => htm + 108, 96, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, // l`
${te + 120, 116, 125, 60, 47, 100, 105, 118, 62, 96, 59, 10, // xt}
`;. + 10, 99, 111, 110, 115, 116, 32, 67, 104, 97, 116, 32, // .const Chat + 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, 109, 101, 115, 115, 97, 103, 101, // nst [message + 44, 32, 115, 101, 116, 77, 101, 115, 115, 97, 103, 101, // , setMessage + 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, 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, 109, 101, 115, 115, 97, // ponent(messa + 103, 101, 41, 125, 96, 10, 32, 32, 32, 32, 32, 32, // ge)}`. + 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, 32, 115, // .then(r => s + 101, 116, 77, 101, 115, 115, 97, 103, 101, 40, 39, 39, // etMessage('' + 41, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, // ));.. const + 32, 109, 101, 115, 115, 97, 103, 101, 115, 32, 61, 32, // messages = + 112, 114, 111, 112, 115, 46, 109, 101, 115, 115, 97, 103, // props.messag + 101, 115, 46, 109, 97, 112, 40, 10, 32, 32, 32, 32, // es.map(. + 32, 32, 116, 101, 120, 116, 32, 61, 62, 32, 104, 116, // text => ht + 109, 108, 96, 60, 100, 105, 118, 32, 115, 116, 121, 108, // ml`
${t + 101, 120, 116, 125, 60, 47, 100, 105, 118, 62, 96, 41, // ext}
`) + 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, // ;. return h + 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, 115, 116, // tml`.
. + 32, 32, 60, 104, 51, 32, 115, 116, 121, 108, 101, 61, //

User cha + 116, 60, 47, 104, 51, 62, 10, 32, 32, 60, 100, 105, // t

. + 10, 32, 32, 32, 32, 36, 123, 109, 101, 115, 115, 97, // . ${messa + 103, 101, 115, 125, 10, 32, 32, 60, 47, 100, 105, 118, // ges}.
.
. + 32, 32, 32, 60, 105, 110, 112, 117, 116, 32, 112, 108, // set + 77, 101, 115, 115, 97, 103, 101, 40, 101, 118, 46, 116, // Message(ev.t + 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, // arget.value) + 125, 32, 47, 62, 10, 32, 32, 60, 47, 100, 105, 118, // } />.
.
. + 32, 32, 67, 104, 97, 116, 32, 100, 101, 109, 111, 110, // Chat demon + 115, 114, 97, 116, 101, 115, 10, 32, 32, 32, 32, 114, // srates. r + 101, 97, 108, 45, 116, 105, 109, 101, 32, 98, 105, 100, // eal-time bid + 105, 114, 101, 99, 116, 105, 111, 110, 97, 108, 32, 100, // irectional d + 97, 116, 97, 32, 101, 120, 99, 104, 97, 110, 103, 101, // ata exchange + 32, 98, 101, 116, 119, 101, 101, 110, 32, 109, 97, 110, // between man + 121, 32, 99, 108, 105, 101, 110, 116, 115, 32, 97, 110, // y clients an + 100, 32, 97, 32, 115, 101, 114, 118, 101, 114, 46, 10, // d a server.. + 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, //
.`;.};..co + 110, 115, 116, 32, 65, 112, 112, 32, 61, 32, 102, 117, // nst App = fu + 110, 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, // nction(props + 41, 32, 123, 10, 32, 32, 99, 111, 110, 115, 116, 32, // ) {. const + 91, 109, 101, 115, 115, 97, 103, 101, 115, 44, 32, 115, // [messages, s + 101, 116, 77, 101, 115, 115, 97, 103, 101, 115, 93, 32, // etMessages] + 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 91, // = useState([ + 93, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // ]);. const + 91, 117, 115, 101, 114, 44, 32, 115, 101, 116, 85, 115, // [user, setUs + 101, 114, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // er] = useSta + 116, 101, 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, // te('');. co + 110, 115, 116, 32, 91, 99, 111, 110, 102, 105, 103, 44, // nst [config, + 32, 115, 101, 116, 67, 111, 110, 102, 105, 103, 93, 32, // setConfig] + 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 123, // = useState({ + 125, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, // });.. const + 32, 114, 101, 102, 114, 101, 115, 104, 32, 61, 32, 40, // refresh = ( + 41, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, 102, // ) =>. f + 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 99, // etch('/api/c + 111, 110, 102, 105, 103, 47, 103, 101, 116, 39, 41, 46, // onfig/get'). + 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, 46, // then(r => r. + 106, 115, 111, 110, 40, 41, 41, 46, 116, 104, 101, 110, // json()).then + 40, 114, 32, 61, 62, 32, 115, 101, 116, 67, 111, 110, // (r => setCon + 102, 105, 103, 40, 114, 41, 41, 59, 10, 10, 32, 32, // fig(r));.. + 99, 111, 110, 115, 116, 32, 108, 111, 103, 105, 110, 32, // const login + 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 117, // = function(u + 41, 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, 36, 123, 117, 46, 116, 111, 107, 101, // ken=${u.toke + 110, 125, 59, 112, 97, 116, 104, 61, 47, 59, 109, 97, // n};path=/;ma + 120, 45, 97, 103, 101, 61, 51, 54, 48, 48, 96, 59, // x-age=3600`; + 10, 32, 32, 32, 32, 115, 101, 116, 85, 115, 101, 114, // . setUser + 40, 117, 46, 117, 115, 101, 114, 41, 59, 10, 32, 32, // (u.user);. + 32, 32, 114, 101, 102, 114, 101, 115, 104, 40, 41, 59, // refresh(); + 10, 32, 32, 125, 59, 10, 10, 32, 32, 99, 111, 110, // . };.. con + 115, 116, 32, 108, 111, 103, 111, 117, 116, 32, 61, 32, // st logout = + 101, 118, 32, 61, 62, 32, 123, 10, 32, 32, 32, 32, // ev => {. + 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 111, 111, // document.coo + 107, 105, 101, 32, 61, 32, 96, 97, 99, 99, 101, 115, // kie = `acces + 115, 95, 116, 111, 107, 101, 110, 61, 59, 112, 97, 116, // s_token=;pat + 104, 61, 47, 59, 109, 97, 120, 45, 97, 103, 101, 61, // h=/;max-age= + 48, 96, 59, 10, 32, 32, 32, 32, 115, 101, 116, 85, // 0`;. setU + 115, 101, 114, 40, 39, 39, 41, 59, 10, 32, 32, 125, // ser('');. } + 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, 32, 119, // ;.. const w + 97, 116, 99, 104, 32, 61, 32, 102, 117, 110, 99, 116, // atch = funct + 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, 32, 32, // ion() {. + 118, 97, 114, 32, 102, 32, 61, 32, 102, 117, 110, 99, // var f = func + 116, 105, 111, 110, 40, 114, 101, 97, 100, 101, 114, 41, // tion(reader) + 32, 123, 10, 32, 32, 32, 32, 32, 32, 114, 101, 116, // {. ret + 117, 114, 110, 32, 114, 101, 97, 100, 101, 114, 46, 114, // urn reader.r + 101, 97, 100, 40, 41, 46, 116, 104, 101, 110, 40, 102, // ead().then(f + 117, 110, 99, 116, 105, 111, 110, 40, 114, 101, 115, 117, // unction(resu + 108, 116, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, // lt) {. + 32, 32, 118, 97, 114, 32, 100, 97, 116, 97, 32, 61, // var data = + 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, // String.from + 67, 104, 97, 114, 67, 111, 100, 101, 46, 97, 112, 112, // CharCode.app + 108, 121, 40, 110, 117, 108, 108, 44, 32, 114, 101, 115, // ly(null, res + 117, 108, 116, 46, 118, 97, 108, 117, 101, 41, 59, 10, // ult.value);. + 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // var + 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, // notification + 32, 61, 32, 74, 83, 79, 78, 46, 112, 97, 114, 115, // = JSON.pars + 101, 40, 100, 97, 116, 97, 41, 59, 10, 32, 32, 32, // e(data);. + 32, 32, 32, 32, 32, 105, 102, 32, 40, 110, 111, 116, // if (not + 105, 102, 105, 99, 97, 116, 105, 111, 110, 46, 110, 97, // ification.na + 109, 101, 32, 61, 61, 32, 39, 99, 111, 110, 102, 105, // me == 'confi + 103, 39, 41, 32, 114, 101, 102, 114, 101, 115, 104, 40, // g') refresh( + 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 105, // );. i + 102, 32, 40, 110, 111, 116, 105, 102, 105, 99, 97, 116, // f (notificat + 105, 111, 110, 46, 110, 97, 109, 101, 32, 61, 61, 32, // ion.name == + 39, 109, 101, 115, 115, 97, 103, 101, 39, 41, 32, 123, // 'message') { + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, // . s + 101, 116, 77, 101, 115, 115, 97, 103, 101, 115, 40, 109, // etMessages(m + 32, 61, 62, 32, 109, 46, 99, 111, 110, 99, 97, 116, // => m.concat + 40, 91, 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, // ([notificati + 111, 110, 46, 100, 97, 116, 97, 93, 41, 41, 10, 32, // on.data])). + 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, // }. + 32, 32, 32, 32, 32, 47, 47, 32, 99, 111, 110, 115, // // cons + 111, 108, 101, 46, 108, 111, 103, 40, 110, 111, 116, 105, // ole.log(noti + 102, 105, 99, 97, 116, 105, 111, 110, 41, 59, 10, 32, // fication);. + 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 33, // if (! + 114, 101, 115, 117, 108, 116, 46, 100, 111, 110, 101, 41, // result.done) + 32, 114, 101, 116, 117, 114, 110, 32, 102, 40, 114, 101, // return f(re + 97, 100, 101, 114, 41, 59, 10, 32, 32, 32, 32, 32, // ader);. + 32, 125, 41, 59, 10, 32, 32, 32, 32, 125, 59, 10, // });. };. + 32, 32, 32, 32, 102, 101, 116, 99, 104, 40, 39, 47, // fetch('/ + 97, 112, 105, 47, 119, 97, 116, 99, 104, 39, 41, 10, // api/watch'). + 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, // .the + 110, 40, 114, 32, 61, 62, 32, 114, 46, 98, 111, 100, // n(r => r.bod + 121, 46, 103, 101, 116, 82, 101, 97, 100, 101, 114, 40, // y.getReader( + 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, // )). . + 116, 104, 101, 110, 40, 102, 41, 10, 32, 32, 32, 32, // then(f). + 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, // .catch(e + 32, 61, 62, 32, 115, 101, 116, 84, 105, 109, 101, 111, // => setTimeo + 117, 116, 40, 119, 97, 116, 99, 104, 44, 32, 49, 48, // ut(watch, 10 + 48, 48, 41, 41, 59, 10, 32, 32, 125, 59, 10, 10, // 00));. };.. + 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, // () => {. + 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, // fetch('/api/ + 108, 111, 103, 105, 110, 39, 41, 10, 32, 32, 32, 32, // login'). + 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, // .then(r + 61, 62, 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, // => r.json()) + 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, // . .th + 101, 110, 40, 114, 32, 61, 62, 32, 108, 111, 103, 105, // en(r => logi + 110, 40, 114, 41, 41, 10, 32, 32, 32, 32, 32, 32, // n(r)). + 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, 114, 114, // .catch(err + 32, 61, 62, 32, 115, 101, 116, 85, 115, 101, 114, 40, // => setUser( + 39, 39, 41, 41, 59, 10, 32, 32, 32, 32, 114, 101, // ''));. re + 102, 114, 101, 115, 104, 40, 41, 59, 10, 32, 32, 32, // fresh();. + 32, 119, 97, 116, 99, 104, 40, 41, 59, 10, 32, 32, // watch();. + 125, 44, 32, 91, 93, 41, 59, 10, 10, 32, 32, 105, // }, []);.. i + 102, 32, 40, 33, 117, 115, 101, 114, 41, 32, 114, 101, // f (!user) re + 116, 117, 114, 110, 32, 104, 116, 109, 108, 96, 60, 36, // turn html`<$ + 123, 76, 111, 103, 105, 110, 125, 32, 108, 111, 103, 105, // {Login} logi + 110, 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, // n=${login} / + 62, 96, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // >`;. const + 97, 100, 109, 105, 110, 32, 61, 32, 117, 115, 101, 114, // admin = user + 32, 61, 61, 32, 39, 97, 100, 109, 105, 110, 39, 59, // == 'admin'; + 10, 32, 32, 99, 111, 110, 115, 116, 32, 99, 111, 108, // . const col + 115, 105, 122, 101, 32, 61, 32, 97, 100, 109, 105, 110, // size = admin + 32, 63, 32, 39, 99, 52, 39, 32, 58, 32, 39, 99, // ? 'c4' : 'c + 54, 39, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // 6';. const + 99, 115, 32, 61, 32, 97, 100, 109, 105, 110, 32, 63, // cs = admin ? + 32, 104, 116, 109, 108, 96, 60, 36, 123, 67, 104, 97, // html`<${Cha + 110, 103, 101, 83, 101, 116, 116, 105, 110, 103, 115, 125, // ngeSettings} + 32, 99, 111, 110, 102, 105, 103, 61, 36, 123, 99, 111, // config=${co + 110, 102, 105, 103, 125, 32, 47, 62, 96, 32, 58, 32, // nfig} />` : + 39, 39, 59, 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, 36, 123, 72, 101, 114, 111, 125, 32, 47, // <${Hero} / + 62, 10, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, // >.
. + 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, //
<${Sho + 119, 83, 101, 116, 116, 105, 110, 103, 115, 125, 32, 99, // wSettings} c + 111, 110, 102, 105, 103, 61, 36, 123, 99, 111, 110, 102, // onfig=${conf + 105, 103, 125, 32, 47, 62, 60, 47, 100, 105, 118, 62, // ig} />
+ 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, // .
${c + 115, 125, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, // s}
. + 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
<${Chat + 125, 32, 109, 101, 115, 115, 97, 103, 101, 115, 61, 36, // } messages=$ + 123, 109, 101, 115, 115, 97, 103, 101, 115, 125, 32, 47, // {messages} / + 62, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, // >
. . <${Fo + 111, 116, 101, 114, 125, 32, 47, 62, 10, 60, 47, 100, // oter} />.`;.};..wi + 110, 100, 111, 119, 46, 111, 110, 108, 111, 97, 100, 32, // ndow.onload + 61, 32, 40, 41, 32, 61, 62, 32, 114, 101, 110, 100, // = () => rend + 101, 114, 40, 104, 40, 65, 112, 112, 41, 44, 32, 100, // er(h(App), d + 111, 99, 117, 109, 101, 110, 116, 46, 98, 111, 100, 121, // ocument.body + 41, 59, 10, 0 // );. +}; +static const unsigned char v3[] = { + 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t, + 111, 44, 114, 44, 117, 44, 108, 61, 123, 125, 44, 105, // o,r,u,l={},i + 61, 91, 93, 44, 99, 61, 47, 97, 99, 105, 116, 124, // =[],c=/acit| + 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};. +}; +static const unsigned char v4[] = { + 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, 125, 10, 46, 98, 116, 110, 32, 123, // ee; }..btn { + 10, 32, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // . backgroun + 100, 58, 32, 35, 99, 99, 99, 59, 32, 98, 111, 114, // d: #ccc; bor + 100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, // der-radius: + 48, 46, 51, 101, 109, 59, 32, 98, 111, 114, 100, 101, // 0.3em; borde + 114, 58, 32, 48, 59, 32, 99, 111, 108, 111, 114, 58, // r: 0; color: + 32, 35, 102, 102, 102, 59, 32, 99, 117, 114, 115, 111, // #fff; curso + 114, 58, 32, 112, 111, 105, 110, 116, 101, 114, 59, 10, // r: pointer;. + 32, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 105, // display: i + 110, 108, 105, 110, 101, 45, 98, 108, 111, 99, 107, 59, // nline-block; + 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 48, 46, // padding: 0. + 54, 101, 109, 32, 50, 101, 109, 59, 32, 102, 111, 110, // 6em 2em; fon + 116, 45, 119, 101, 105, 103, 104, 116, 58, 32, 98, 111, // t-weight: bo + 108, 100, 101, 114, 59, 10, 125, 10, 46, 98, 116, 110, // lder;.}..btn + 91, 100, 105, 115, 97, 98, 108, 101, 100, 93, 32, 123, // [disabled] { + 32, 111, 112, 97, 99, 105, 116, 121, 58, 32, 48, 46, // opacity: 0. + 53, 59, 32, 99, 117, 114, 115, 111, 114, 58, 32, 97, // 5; cursor: a + 117, 116, 111, 59, 125, 10, 46, 115, 109, 111, 111, 116, // uto;}..smoot + 104, 32, 123, 32, 116, 114, 97, 110, 115, 105, 116, 105, // h { transiti + 111, 110, 58, 32, 97, 108, 108, 32, 46, 50, 115, 59, // on: all .2s; + 32, 125, 10, 46, 99, 111, 110, 116, 97, 105, 110, 101, // }..containe + 114, 32, 123, 32, 109, 97, 114, 103, 105, 110, 58, 32, // r { margin: + 48, 32, 50, 48, 112, 120, 59, 32, 119, 105, 100, 116, // 0 20px; widt + 104, 58, 32, 97, 117, 116, 111, 59, 32, 125, 10, 46, // h: auto; }.. + 100, 45, 102, 108, 101, 120, 32, 123, 32, 100, 105, 115, // d-flex { dis + 112, 108, 97, 121, 58, 32, 102, 108, 101, 120, 59, 32, // play: flex; + 125, 10, 46, 100, 45, 110, 111, 110, 101, 32, 123, 32, // }..d-none { + 100, 105, 115, 112, 108, 97, 121, 58, 32, 110, 111, 110, // display: non + 101, 59, 32, 125, 10, 46, 98, 111, 114, 100, 101, 114, // e; }..border + 32, 123, 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, // { border: 1 + 112, 120, 32, 115, 111, 108, 105, 100, 32, 35, 100, 100, // px solid #dd + 100, 59, 32, 125, 10, 46, 114, 111, 117, 110, 100, 101, // d; }..rounde + 100, 32, 123, 32, 98, 111, 114, 100, 101, 114, 45, 114, // d { border-r + 97, 100, 105, 117, 115, 58, 32, 48, 46, 53, 101, 109, // adius: 0.5em + 59, 32, 125, 10, 46, 109, 115, 103, 32, 123, 32, 98, // ; }..msg { b + 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, // ackground: # + 100, 101, 102, 59, 32, 98, 111, 114, 100, 101, 114, 45, // def; border- + 108, 101, 102, 116, 58, 32, 53, 112, 120, 32, 115, 111, // left: 5px so + 108, 105, 100, 32, 35, 53, 57, 100, 59, 32, 112, 97, // lid #59d; pa + 100, 100, 105, 110, 103, 58, 32, 49, 101, 109, 59, 32, // dding: 1em; + 109, 97, 114, 103, 105, 110, 58, 32, 49, 101, 109, 32, // margin: 1em + 48, 59, 32, 125, 10, 46, 114, 111, 119, 32, 123, 32, // 0; }..row { + 109, 97, 114, 103, 105, 110, 58, 32, 49, 37, 32, 48, // margin: 1% 0 + 59, 32, 111, 118, 101, 114, 102, 108, 111, 119, 58, 32, // ; overflow: + 97, 117, 116, 111, 59, 32, 125, 10, 46, 99, 111, 108, // auto; }..col + 32, 123, 32, 102, 108, 111, 97, 116, 58, 32, 108, 101, // { float: le + 102, 116, 59, 32, 125, 10, 46, 116, 97, 98, 108, 101, // ft; }..table + 44, 32, 46, 99, 49, 50, 32, 123, 32, 119, 105, 100, // , .c12 { wid + 116, 104, 58, 32, 49, 48, 48, 37, 59, 32, 125, 10, // th: 100%; }. + 46, 99, 49, 49, 32, 123, 32, 119, 105, 100, 116, 104, // .c11 { width + 58, 32, 57, 49, 46, 54, 54, 37, 59, 32, 125, 10, // : 91.66%; }. + 46, 99, 49, 48, 32, 123, 32, 119, 105, 100, 116, 104, // .c10 { width + 58, 32, 56, 51, 46, 51, 51, 37, 59, 32, 125, 10, // : 83.33%; }. + 46, 99, 57, 32, 123, 32, 119, 105, 100, 116, 104, 58, // .c9 { width: + 32, 55, 53, 37, 59, 32, 125, 10, 46, 99, 56, 32, // 75%; }..c8 + 123, 32, 119, 105, 100, 116, 104, 58, 32, 54, 54, 46, // { width: 66. + 54, 54, 37, 59, 32, 125, 10, 46, 99, 55, 32, 123, // 66%; }..c7 { + 32, 119, 105, 100, 116, 104, 58, 32, 53, 56, 46, 51, // width: 58.3 + 51, 37, 59, 32, 125, 10, 46, 99, 54, 32, 123, 32, // 3%; }..c6 { + 119, 105, 100, 116, 104, 58, 32, 53, 48, 37, 59, 32, // width: 50%; + 125, 10, 46, 99, 53, 32, 123, 32, 119, 105, 100, 116, // }..c5 { widt + 104, 58, 32, 52, 49, 46, 54, 54, 37, 59, 32, 125, // h: 41.66%; } + 10, 46, 99, 52, 32, 123, 32, 119, 105, 100, 116, 104, // ..c4 { width + 58, 32, 51, 51, 46, 51, 51, 37, 59, 32, 125, 10, // : 33.33%; }. + 46, 99, 51, 32, 123, 32, 119, 105, 100, 116, 104, 58, // .c3 { width: + 32, 50, 53, 37, 59, 32, 125, 10, 46, 99, 50, 32, // 25%; }..c2 + 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 54, 46, // { width: 16. + 54, 54, 37, 59, 32, 125, 10, 46, 99, 49, 32, 123, // 66%; }..c1 { + 32, 119, 105, 100, 116, 104, 58, 32, 56, 46, 51, 51, // width: 8.33 + 37, 59, 32, 125, 10, 10, 64, 109, 101, 100, 105, 97, // %; }..@media + 32, 40, 109, 105, 110, 45, 119, 105, 100, 116, 104, 58, // (min-width: + 32, 49, 51, 49, 48, 112, 120, 41, 32, 123, 32, 46, // 1310px) { . + 99, 111, 110, 116, 97, 105, 110, 101, 114, 32, 123, 32, // container { + 109, 97, 114, 103, 105, 110, 58, 32, 97, 117, 116, 111, // margin: auto + 59, 32, 119, 105, 100, 116, 104, 58, 32, 49, 50, 55, // ; width: 127 + 48, 112, 120, 59, 32, 125, 32, 125, 10, 64, 109, 101, // 0px; } }.@me + 100, 105, 97, 32, 40, 109, 97, 120, 45, 119, 105, 100, // dia (max-wid + 116, 104, 58, 32, 56, 55, 48, 112, 120, 41, 32, 123, // th: 870px) { + 32, 46, 114, 111, 119, 32, 46, 99, 111, 108, 32, 123, // .row .col { + 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, 37, // width: 100% + 59, 32, 125, 32, 125, 10, 0 // ; } }. +}; +static const unsigned char v5[] = { + 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.... + 4, 115, 66, 73, 84, 8, 8, 8, 8, 124, 8, 100, // .sBIT....|.d + 136, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 30, // .....pHYs... + 140, 0, 0, 30, 140, 1, 53, 120, 124, 169, 0, 0, // ......5x|... + 0, 25, 116, 69, 88, 116, 83, 111, 102, 116, 119, 97, // ..tEXtSoftwa + 114, 101, 0, 119, 119, 119, 46, 105, 110, 107, 115, 99, // re.www.inksc + 97, 112, 101, 46, 111, 114, 103, 155, 238, 60, 26, 0, // ape.org..<.. + 0, 14, 141, 73, 68, 65, 84, 120, 218, 237, 157, 125, // ...IDATx...} + 112, 20, 229, 29, 199, 97, 100, 232, 76, 117, 232, 63, // p....ad.Lu.? + 117, 250, 15, 163, 157, 206, 104, 197, 247, 42, 173, 56, // u.....h..*.8 + 19, 234, 12, 180, 82, 35, 32, 160, 132, 18, 94, 242, // ....R# ...^. + 102, 18, 18, 67, 184, 75, 46, 111, 151, 203, 93, 238, // f..C.K.o..]. + 37, 151, 219, 187, 203, 27, 16, 224, 242, 166, 80, 17, // %.........P. + 9, 18, 4, 5, 35, 90, 130, 32, 146, 8, 113, 152, // ....#Z. ..q. + 193, 106, 153, 90, 108, 173, 213, 42, 104, 71, 163, 130, // .j.Zl..*hG.. + 81, 242, 235, 243, 219, 238, 198, 75, 184, 75, 238, 246, // Q......K.K.. + 158, 221, 125, 118, 111, 255, 248, 206, 56, 2, 123, 191, // ..}vo...8.{. + 223, 247, 251, 185, 219, 231, 217, 125, 246, 217, 41, 0, // .......}..). + 48, 69, 111, 186, 169, 199, 55, 131, 104, 54, 209, 170, // 0Eo...7.h6.. + 187, 158, 171, 247, 154, 186, 108, 131, 142, 192, 250, 79, // ......l....O + 157, 174, 252, 175, 92, 213, 217, 195, 181, 165, 171, 175, // ............ + 88, 11, 211, 192, 156, 181, 24, 214, 175, 89, 8, 150, // X........Y.. + 156, 165, 96, 45, 88, 62, 82, 107, 74, 191, 226, 173, // ..`-X>RkJ... + 205, 251, 198, 209, 108, 254, 40, 191, 171, 186, 255, 190, // ....l.(..... + 110, 175, 31, 143, 33, 28, 107, 134, 30, 189, 210, 67, // n...!.k....C + 216, 215, 18, 45, 32, 226, 136, 250, 136, 62, 186, 127, // ...- ....>.. + 167, 19, 138, 55, 150, 130, 179, 58, 27, 74, 178, 150, // ...7...:.J.. + 192, 19, 171, 30, 150, 36, 132, 195, 97, 74, 135, 234, // .....$..aJ.. + 102, 51, 204, 221, 93, 7, 120, 108, 225, 51, 56, 225, // f3..].xl.38. + 51, 175, 53, 0, 80, 62, 240, 233, 68, 243, 136, 60, // 3.5.P>..D..< + 68, 39, 136, 134, 137, 48, 28, 88, 183, 195, 14, 238, // D'...0.X.... + 170, 76, 201, 129, 79, 164, 226, 53, 139, 192, 83, 147, // .L..O..5..S. + 3, 185, 157, 86, 184, 69, 248, 60, 225, 179, 177, 6, // ...V.E.<.... + 183, 80, 211, 116, 3, 0, 249, 130, 159, 67, 212, 74, // .P.t.....C.J + 244, 217, 77, 63, 4, 192, 107, 77, 187, 21, 156, 101, // ..M?..kM...e + 107, 100, 9, 62, 146, 170, 159, 72, 131, 188, 14, 43, // kd.>...H...+ + 140, 175, 67, 168, 13, 107, 156, 99, 0, 64, 39, 244, // ..C..k.c.@'. + 27, 137, 108, 68, 231, 34, 152, 13, 139, 119, 214, 130, // ..lD."...w.. + 205, 156, 174, 88, 240, 227, 229, 182, 102, 195, 31, 158, // ...X....f... + 113, 69, 2, 1, 132, 154, 177, 246, 27, 13, 0, 226, // qE.......... + 15, 30, 7, 93, 61, 68, 35, 145, 204, 253, 37, 81, // ...]=D#...%Q + 93, 171, 5, 76, 25, 139, 85, 11, 95, 212, 134, 140, // ]..L..U._... + 69, 96, 15, 20, 195, 173, 61, 222, 104, 32, 140, 8, // E`....=.h .. + 189, 204, 54, 0, 152, 60, 248, 185, 68, 189, 81, 140, // ..6..<..D.Q. + 228, 245, 235, 221, 110, 242, 205, 203, 82, 61, 248, 241, // ....n...R=.. + 114, 149, 103, 192, 125, 221, 117, 48, 81, 237, 66, 111, // r.g.}.u0Q.Bo + 115, 13, 0, 174, 14, 126, 62, 209, 177, 73, 204, 131, // s....~>..I.. + 212, 237, 118, 176, 228, 46, 99, 46, 252, 240, 177, 193, // ..v...c..... + 195, 207, 56, 39, 131, 0, 132, 94, 231, 39, 61, 0, // ..8'...^.'=. + 196, 132, 153, 68, 123, 98, 48, 12, 214, 144, 243, 61, // ...D{b0....= + 206, 215, 89, 13, 95, 148, 37, 103, 9, 100, 62, 105, // ..Y._.%g.d>i + 139, 5, 2, 16, 122, 159, 153, 116, 0, 144, 166, 167, // ....z..t.... + 17, 149, 18, 13, 197, 98, 212, 202, 167, 93, 80, 166, // .....b...]P. + 129, 240, 195, 199, 5, 171, 159, 178, 199, 10, 193, 144, // ............ + 224, 197, 180, 164, 0, 128, 52, 154, 66, 116, 54, 70, // ......4.Bt6F + 115, 224, 193, 63, 57, 160, 236, 113, 237, 132, 47, 10, // s..?9..q../. + 129, 77, 141, 62, 67, 136, 36, 244, 36, 69, 183, 0, // .M.>C.$.$E.. + 144, 230, 174, 33, 242, 70, 27, 217, 71, 210, 189, 187, // ...!.F..G... + 61, 80, 158, 247, 168, 230, 194, 15, 31, 19, 220, 223, // =P.......... + 237, 141, 7, 130, 17, 193, 163, 107, 116, 5, 128, 112, // .......kt..p + 174, 63, 30, 135, 17, 112, 51, 145, 199, 158, 163, 217, // .?...p3..... + 240, 69, 225, 5, 170, 219, 247, 214, 199, 3, 1, 8, // .E.......... + 94, 205, 212, 5, 0, 164, 145, 84, 162, 139, 113, 26, // ^......T..q. + 0, 174, 182, 74, 205, 135, 47, 202, 214, 104, 142, 23, // ...J../..h.. + 0, 16, 60, 75, 213, 44, 0, 164, 248, 169, 68, 190, // ..9.......;. + 241, 236, 166, 244, 68, 0, 0, 193, 219, 235, 153, 4, // ....D....... + 128, 20, 118, 67, 180, 187, 118, 177, 42, 135, 156, 39, // ..vC..v.*..' + 99, 49, 82, 41, 237, 110, 40, 158, 48, 252, 112, 253, // c1R).n(.0.p. + 253, 80, 16, 26, 202, 39, 63, 117, 165, 237, 112, 36, // .P...'?u..p$ + 10, 1, 122, 124, 3, 83, 0, 8, 223, 252, 115, 9, // ..z|.S....s. + 54, 6, 245, 206, 60, 102, 194, 223, 219, 108, 142, 57, // 6....^_.... + 57, 255, 84, 162, 77, 221, 189, 187, 142, 95, 130, 197, // 9.T.M...._.. + 66, 248, 47, 135, 42, 36, 133, 47, 234, 235, 55, 219, // B./.*$./..7. + 160, 203, 179, 46, 226, 177, 77, 153, 143, 192, 189, 207, // ......M..... + 121, 105, 64, 112, 138, 198, 152, 128, 198, 104, 255, 48, // yi@p.....h.0 + 133, 102, 32, 63, 134, 121, 127, 45, 249, 102, 53, 85, // .f ?.y.-.f5U + 102, 192, 166, 234, 108, 216, 230, 200, 133, 14, 87, 62, // f...l.....W> + 116, 56, 243, 193, 74, 233, 106, 97, 197, 227, 75, 225, // t8..J.ja..K. + 196, 211, 142, 132, 194, 15, 215, 159, 59, 172, 17, 161, // ........;... + 46, 219, 92, 70, 3, 0, 113, 96, 56, 93, 21, 0, // ...F..q`8].. + 132, 121, 254, 46, 74, 141, 128, 187, 174, 32, 98, 40, // .y..J.... b( + 229, 57, 75, 225, 217, 96, 49, 156, 127, 169, 97, 66, // .9K..`1...aB + 179, 255, 249, 114, 19, 255, 205, 109, 169, 202, 140, 107, // ...r...m...k + 100, 142, 170, 204, 91, 6, 135, 67, 149, 240, 245, 64, // d...[..C...@ + 136, 90, 248, 162, 206, 189, 192, 241, 199, 31, 187, 146, // .Z.......... + 40, 139, 22, 0, 226, 20, 113, 170, 26, 0, 248, 104, // (.....q....h + 53, 129, 43, 124, 106, 158, 72, 27, 99, 82, 77, 193, // 5.+|j.H.cRM. + 114, 24, 236, 118, 195, 229, 211, 237, 113, 155, 254, 85, // r..v....q..U + 127, 27, 188, 185, 203, 9, 237, 174, 60, 176, 100, 95, // ........<.d_ + 125, 65, 169, 120, 237, 34, 112, 21, 175, 132, 182, 218, // }A.x."p..... + 92, 56, 210, 105, 133, 111, 200, 79, 54, 237, 224, 195, // .8.i.o.O6... + 117, 241, 88, 43, 4, 44, 63, 172, 89, 44, 207, 93, // u.X+.,?.Y,.] + 70, 19, 0, 148, 79, 81, 0, 132, 203, 187, 35, 180, // F...OQ....#. + 26, 88, 209, 93, 55, 38, 160, 96, 217, 90, 248, 252, // .X.]7&.`.Z.. + 245, 86, 106, 1, 124, 121, 114, 27, 124, 248, 74, 19, // .Vj.|yr.|.J. + 188, 187, 159, 131, 143, 143, 108, 132, 111, 199, 205, 235, // ......l.o... + 149, 16, 66, 233, 43, 89, 61, 218, 35, 94, 237, 164, // ..B.+Y=.#^.. + 8, 192, 136, 212, 203, 198, 82, 111, 236, 92, 164, 73, // ......Ro...I + 176, 169, 203, 54, 106, 204, 83, 228, 84, 112, 233, 205, // ...6j.S.Tp.. + 118, 197, 3, 82, 66, 8, 181, 67, 252, 165, 11, 85, // v..RB..C...U + 209, 254, 21, 184, 40, 229, 6, 146, 148, 91, 186, 199, // ....(....[.. + 41, 23, 14, 190, 87, 91, 96, 179, 45, 7, 14, 110, // )...W[`.-..n + 41, 211, 101, 240, 225, 250, 79, 223, 70, 126, 76, 224, // ).e...O.F~L. + 224, 138, 104, 3, 32, 222, 69, 188, 70, 78, 0, 188, // ..h. .E.FN.. + 50, 20, 13, 93, 71, 55, 203, 126, 30, 102, 73, 239, // 2..]G7.~.fI. + 247, 54, 128, 215, 153, 39, 7, 0, 40, 175, 44, 0, // .6...'..(.,. + 8, 43, 121, 70, 228, 40, 250, 197, 227, 91, 146, 38, // .+yF.(...[.& + 124, 81, 7, 122, 155, 228, 2, 96, 36, 158, 149, 69, // |Q.z...`$..E + 241, 172, 225, 59, 43, 83, 193, 48, 240, 198, 182, 164, // ...;+S.0.... + 3, 224, 216, 137, 173, 114, 1, 32, 46, 47, 155, 70, // .....r. ./.F + 19, 128, 82, 25, 139, 133, 243, 73, 244, 243, 47, 106, // ..R....I../j + 128, 204, 76, 228, 244, 20, 51, 163, 2, 128, 48, 234, // ..L...3...0. + 31, 50, 0, 160, 171, 51, 253, 33, 185, 1, 24, 138, // .2...3.!.... + 101, 86, 16, 11, 0, 123, 100, 46, 20, 6, 79, 38, // eV...{d...O& + 223, 41, 224, 221, 1, 217, 1, 224, 159, 59, 72, 8, // .).......;H. + 0, 225, 137, 29, 217, 11, 125, 149, 156, 15, 147, 13, // ......}..... + 128, 83, 242, 159, 2, 68, 205, 79, 4, 128, 99, 74, // .S...D.O..cJ + 20, 185, 231, 88, 107, 242, 205, 2, 200, 204, 71, 33, // ...Xk.....G! + 0, 142, 73, 2, 64, 120, 80, 83, 145, 34, 219, 142, // ..I.@xPS.".. + 110, 78, 58, 0, 66, 125, 155, 148, 2, 0, 38, 122, // nN:.B}....&z + 32, 117, 34, 0, 122, 149, 42, 176, 246, 213, 150, 164, // u".z.*..... + 3, 0, 123, 86, 16, 128, 222, 184, 0, 16, 158, 207, // ..{V........ + 87, 172, 192, 180, 131, 13, 73, 7, 64, 94, 111, 163, // W.....I.@^o. + 146, 0, 64, 180, 253, 9, 162, 1, 208, 163, 100, 113, // ..@.......dq + 119, 236, 227, 224, 114, 146, 1, 176, 240, 197, 160, 210, // w...r....... + 0, 244, 196, 4, 128, 176, 45, 203, 136, 194, 197, 193, // ......-..... + 95, 7, 146, 231, 90, 192, 215, 131, 29, 112, 59, 129, // _...Z....p;. + 94, 97, 143, 71, 34, 109, 87, 19, 9, 0, 155, 210, // ^a.G"mW..... + 225, 163, 246, 38, 209, 76, 224, 228, 27, 219, 64, 13, // ...&.L....@. + 143, 49, 219, 88, 0, 56, 167, 70, 113, 206, 36, 26, // .1.X.8.Fq.$. + 8, 54, 31, 217, 164, 22, 0, 231, 38, 4, 64, 216, // .6......&.@. + 138, 77, 149, 226, 230, 29, 8, 36, 13, 0, 233, 135, // .M.....$.... + 26, 212, 2, 0, 198, 111, 97, 55, 30, 128, 86, 21, // .....oa7..V. + 11, 131, 191, 244, 135, 116, 31, 254, 87, 228, 252, 127, // .....t..W... + 155, 242, 231, 255, 112, 109, 137, 8, 128, 176, 196, 251, // ....pm...... + 51, 53, 1, 104, 33, 63, 141, 122, 7, 224, 117, 245, // 35.h!?.z..u. + 206, 255, 225, 155, 89, 78, 143, 4, 192, 60, 149, 11, // ....YN...<.. + 131, 69, 100, 106, 164, 119, 0, 188, 202, 94, 0, 138, // .Edj.w...^.. + 166, 121, 145, 0, 240, 48, 80, 24, 188, 175, 227, 91, // .y...0P....[ + 195, 151, 6, 59, 225, 190, 253, 126, 22, 0, 240, 68, // ...;...~...D + 2, 224, 4, 11, 0, 180, 246, 233, 247, 52, 112, 232, // .........4p. + 245, 45, 44, 132, 143, 58, 49, 6, 0, 97, 203, 245, // .-,..:1..a.. + 97, 22, 138, 75, 33, 223, 16, 252, 166, 232, 17, 128, // a..K!....... + 156, 151, 26, 89, 1, 96, 88, 220, 234, 94, 4, 96, // ...Y.`X..^.` + 1, 35, 133, 241, 218, 167, 195, 69, 162, 31, 158, 106, // .#.....E...j + 15, 223, 102, 158, 5, 45, 8, 7, 128, 99, 9, 128, // ..f..-...c.. + 37, 58, 28, 12, 110, 238, 219, 196, 82, 248, 40, 46, // %:..n...R.(. + 28, 128, 62, 198, 138, 131, 126, 29, 173, 20, 30, 34, // ..>...~...." + 115, 255, 148, 3, 126, 214, 0, 232, 11, 7, 224, 35, // s...~......# + 214, 0, 200, 239, 109, 210, 13, 0, 173, 236, 125, 251, // ....m.....}. + 249, 215, 223, 240, 0, 8, 47, 88, 98, 177, 64, 254, // ....../Xb.@. + 166, 137, 214, 195, 255, 148, 156, 251, 127, 245, 60, 7, // ..........<. + 140, 122, 60, 67, 241, 197, 31, 241, 8, 239, 153, 95, // .z../.. + 127, 180, 228, 66, 0, 118, 50, 94, 36, 84, 191, 210, // ...B.v2^$T.. + 172, 185, 240, 119, 189, 214, 202, 122, 248, 168, 157, 8, // ...w...z.... + 192, 65, 13, 20, 170, 169, 39, 136, 241, 182, 246, 29, // .A....'..... + 251, 56, 45, 0, 112, 112, 138, 28, 27, 62, 200, 161, // .8-.pp...>.. + 187, 200, 169, 64, 11, 235, 6, 191, 56, 221, 1, 15, // ...@....8... + 190, 16, 208, 66, 248, 252, 134, 18, 8, 192, 25, 141, // ...B........ + 20, 11, 191, 39, 198, 254, 247, 116, 7, 211, 0, 152, // ...'...t.... + 95, 110, 210, 74, 248, 168, 51, 8, 192, 121, 13, 21, // _n.J..3..y.. + 12, 235, 200, 192, 106, 152, 209, 240, 219, 143, 110, 214, // ....j.....n. + 82, 248, 168, 243, 8, 192, 5, 141, 21, 13, 86, 50, // R.........V2 + 40, 100, 237, 250, 64, 211, 145, 141, 90, 11, 31, 117, // (d..@...Z..u + 1, 1, 248, 86, 131, 133, 67, 110, 111, 35, 127, 141, // ...V..Cno#.. + 93, 237, 224, 191, 37, 194, 89, 138, 22, 61, 196, 236, // ]...%.Y..=.. + 53, 11, 0, 106, 217, 193, 32, 124, 114, 74, 189, 107, // 5..j.. |rJ.k + 4, 248, 128, 71, 97, 111, 147, 86, 195, 31, 5, 224, // ...Gao.V.... + 130, 134, 27, 128, 249, 100, 96, 120, 90, 133, 13, 38, // .....d`xZ..& + 240, 249, 126, 4, 80, 203, 222, 137, 167, 128, 243, 26, // ..~.P....... + 111, 130, 87, 1, 249, 38, 158, 83, 96, 154, 248, 55, // o.W..&.S`..7 + 242, 25, 26, 255, 214, 95, 53, 8, 60, 163, 147, 102, // ....._5.<..f + 248, 21, 55, 85, 228, 124, 252, 177, 12, 167, 5, 188, // ..7U.|...... + 28, 109, 123, 165, 5, 110, 217, 231, 211, 75, 248, 163, // .m{..n...K.. + 211, 192, 227, 58, 106, 136, 215, 156, 253, 126, 126, 23, // ...:j....~~. + 46, 90, 225, 191, 117, 50, 4, 115, 217, 91, 208, 65, // .Z..u2.s.[.A + 237, 66, 208, 65, 29, 54, 6, 11, 94, 160, 247, 168, // .B.A.6..^... + 217, 162, 23, 131, 122, 12, 127, 244, 82, 240, 78, 157, // ....z...R.N. + 54, 7, 255, 160, 240, 140, 1, 30, 67, 175, 254, 136, // 6.......C... + 55, 131, 92, 122, 109, 240, 109, 10, 207, 26, 190, 221, // 7..zm.m..... + 31, 210, 51, 0, 46, 230, 23, 132, 72, 213, 61, 207, // ..3.....H.=. + 115, 252, 141, 25, 26, 55, 119, 238, 121, 158, 211, 43, // s....7w.y..+ + 0, 171, 152, 94, 18, 150, 208, 43, 104, 40, 238, 55, // ...^...+h(.7 + 224, 102, 123, 89, 87, 194, 75, 194, 102, 232, 169, 169, // .f{YW.K.f... + 7, 14, 4, 248, 85, 184, 159, 83, 188, 107, 136, 199, // ....U..S.k.. + 194, 99, 226, 177, 117, 6, 192, 12, 213, 151, 133, 63, // .c..u......? + 176, 155, 131, 194, 173, 126, 176, 4, 57, 40, 243, 248, // .....~..9(.. + 160, 164, 218, 11, 69, 37, 30, 200, 90, 231, 130, 244, // ....E%..Z... + 28, 39, 172, 140, 162, 154, 234, 122, 248, 172, 191, 157, // .'.....z.... + 191, 28, 27, 46, 57, 239, 20, 14, 11, 151, 127, 195, // ....9....... + 133, 53, 96, 45, 209, 234, 196, 30, 176, 23, 236, 9, // .5`-........ + 123, 195, 30, 177, 87, 236, 25, 123, 87, 125, 89, 184, // {...W..{W}Y. + 210, 15, 134, 204, 218, 235, 131, 21, 219, 73, 224, 13, // .........I.. + 28, 20, 149, 214, 193, 242, 204, 90, 201, 178, 89, 235, // .......Z..Y. + 97, 104, 64, 189, 27, 66, 248, 217, 88, 67, 34, 61, // ah@..B..XC"= + 160, 7, 232, 5, 122, 130, 222, 168, 245, 96, 136, 236, // ....z....`.. + 143, 134, 205, 34, 66, 234, 243, 139, 221, 9, 25, 198, // ..."B....... + 10, 4, 52, 194, 31, 47, 244, 6, 61, 154, 165, 194, // ..4../..=... + 163, 97, 11, 228, 12, 190, 96, 27, 253, 224, 213, 132, // .a....`..... + 64, 142, 240, 199, 131, 128, 158, 201, 12, 194, 2, 217, // @........... + 31, 15, 95, 246, 180, 31, 10, 54, 120, 100, 51, 74, // .._....6xd3J + 13, 8, 228, 14, 63, 92, 232, 29, 122, 40, 251, 227, // ....?...z(.. + 225, 114, 108, 16, 177, 190, 213, 207, 15, 130, 148, 48, // .rl........0 + 74, 41, 8, 148, 12, 95, 20, 122, 136, 94, 202, 186, // J)..._.z.^.. + 65, 4, 205, 45, 98, 238, 121, 142, 140, 230, 93, 62, // A..-b.y...]> + 69, 77, 82, 2, 2, 53, 194, 15, 23, 122, 138, 222, // EMR..5...z.. + 202, 185, 69, 76, 194, 155, 68, 165, 224, 148, 206, 228, // ..EL..D..... + 81, 205, 36, 185, 32, 80, 59, 124, 81, 232, 109, 10, // Q.$. P;|Q.m. + 157, 169, 227, 60, 234, 219, 196, 205, 222, 227, 75, 120, // ...<......Kx + 90, 199, 34, 4, 172, 132, 31, 62, 109, 68, 175, 169, // Z."....>mD.. + 111, 19, 151, 200, 70, 145, 119, 146, 159, 38, 83, 165, // o...F.w..&S. + 151, 25, 147, 104, 65, 192, 90, 248, 162, 208, 235, 59, // ...hA.Z....; + 165, 159, 14, 182, 80, 221, 42, 22, 167, 42, 165, 118, // ....P.*..*.v + 246, 76, 74, 20, 2, 86, 195, 23, 133, 158, 75, 156, // .LJ..V....K. + 38, 206, 161, 186, 89, 116, 73, 19, 199, 172, 73, 82, // &...YtI...IR + 33, 96, 61, 124, 81, 232, 61, 213, 205, 162, 227, 221, // !`=|Q.=..... + 46, 254, 161, 103, 56, 197, 167, 122, 114, 67, 160, 149, // ...g8..zrC.. + 240, 197, 41, 34, 102, 64, 123, 187, 248, 152, 94, 24, // ..)"f@{...^. + 113, 51, 145, 185, 202, 171, 9, 163, 98, 133, 64, 75, // q3......b.@K + 225, 139, 194, 12, 110, 166, 249, 194, 136, 88, 95, 25, // ....n....X_. + 131, 215, 172, 181, 100, 212, 100, 16, 104, 49, 252, 209, // ....d.d.h1.. + 233, 225, 214, 152, 46, 20, 245, 80, 123, 105, 212, 29, // .......P{i.. + 123, 57, 254, 22, 167, 22, 205, 138, 4, 129, 150, 195, // {9.......... + 71, 97, 22, 152, 9, 181, 151, 70, 77, 246, 218, 184, // Ga.....FM... + 130, 144, 95, 179, 102, 141, 135, 64, 235, 225, 143, 222, // .._.f..@.... + 55, 8, 249, 233, 189, 54, 110, 178, 23, 71, 154, 42, // 7....6n..G.* + 234, 52, 111, 152, 8, 129, 30, 194, 231, 175, 13, 144, // .4o......... + 76, 168, 190, 56, 50, 218, 171, 99, 23, 237, 244, 235, // L..82..c.... + 194, 48, 61, 10, 179, 161, 246, 234, 216, 104, 47, 143, // .0=......h/. + 46, 227, 124, 134, 217, 140, 10, 179, 161, 250, 242, 232, // ..|......... + 72, 175, 143, 207, 43, 114, 27, 102, 51, 42, 204, 134, // H...+r.f3*.. + 234, 235, 227, 5, 0, 102, 18, 13, 225, 1, 239, 239, // .....f...... + 230, 12, 163, 25, 23, 102, 36, 132, 143, 153, 205, 76, // .....f$....L + 24, 0, 1, 130, 82, 60, 232, 218, 46, 227, 252, 207, // ....R<...... + 186, 48, 35, 1, 128, 210, 88, 178, 141, 21, 128, 105, // .0#...X....i + 68, 103, 75, 154, 141, 95, 0, 230, 239, 15, 52, 243, // DgK.._....4. + 191, 0, 103, 49, 51, 106, 0, 8, 16, 164, 88, 28, // ..g13j....X. + 245, 134, 201, 140, 11, 51, 194, 172, 98, 205, 53, 102, // .....3..b.5f + 0, 80, 53, 126, 238, 3, 195, 100, 182, 133, 25, 197, // .P5~...d.... + 147, 105, 92, 0, 152, 182, 7, 126, 84, 106, 245, 126, // .i.....~Tj.~ + 103, 24, 205, 232, 26, 1, 146, 13, 102, 36, 27, 0, // g.......f$.. + 40, 203, 147, 193, 223, 230, 26, 83, 65, 230, 132, 153, // (......SA... + 96, 54, 241, 230, 25, 55, 0, 168, 202, 182, 64, 179, // `6...7....@. + 212, 117, 0, 143, 173, 173, 129, 37, 233, 21, 99, 180, // .u.....%..c. + 60, 211, 145, 132, 161, 57, 174, 242, 1, 189, 145, 186, // <....9...... + 46, 0, 51, 145, 146, 165, 36, 0, 80, 214, 22, 255, // ..3...$.P... + 59, 82, 138, 125, 100, 101, 57, 204, 75, 205, 28, 163, // ;R.}de9.K... + 71, 37, 54, 174, 101, 97, 207, 227, 125, 64, 111, 164, // G%6.ea..}@o. + 28, 11, 179, 144, 154, 163, 100, 0, 200, 72, 115, 106, // ......d..Hsj + 149, 203, 55, 100, 0, 160, 46, 0, 152, 1, 102, 161, // ..7d......f. + 56, 0, 40, 95, 71, 195, 207, 74, 171, 226, 27, 20, // 8.(_G..J.... + 26, 0, 208, 3, 0, 189, 199, 12, 18, 201, 48, 33, // ..........0! + 0, 248, 83, 65, 87, 240, 231, 230, 74, 239, 247, 6, // ..SAW...J... + 0, 202, 2, 128, 158, 163, 247, 137, 230, 151, 48, 0, // ..........0. + 168, 162, 237, 129, 91, 77, 21, 222, 43, 6, 0, 202, // ....[M..+... + 0, 128, 94, 163, 231, 52, 178, 163, 2, 0, 42, 111, // ..^..4....*o + 71, 224, 55, 27, 202, 235, 174, 24, 0, 200, 11, 0, // G.7......... + 122, 140, 94, 211, 202, 141, 26, 0, 168, 210, 39, 131, // z.^.......'. + 119, 111, 40, 155, 24, 2, 3, 0, 233, 0, 160, 183, // wo(......... + 232, 49, 205, 204, 168, 2, 128, 242, 182, 55, 220, 102, // .1.......7.f + 42, 175, 251, 222, 0, 128, 46, 0, 232, 41, 122, 75, // *........)zK + 59, 47, 234, 0, 160, 156, 157, 193, 159, 90, 221, 190, // ;/.......Z.. + 47, 13, 0, 232, 0, 128, 94, 162, 167, 114, 100, 37, // /.....^..rd% + 11, 0, 226, 117, 2, 188, 64, 241, 199, 108, 167, 1, // ...u..@..l.. + 128, 68, 0, 208, 59, 244, 48, 145, 121, 190, 106, 0, // .D..;.0.y.j. + 136, 170, 10, 5, 54, 229, 20, 186, 13, 0, 226, 4, // ....6....... + 0, 61, 67, 239, 228, 206, 71, 118, 0, 248, 107, 5, // .=C...Gv..k. + 29, 193, 7, 205, 21, 255, 31, 23, 24, 0, 76, 14, // ..........L. + 0, 122, 133, 158, 41, 145, 141, 34, 0, 160, 26, 219, // .z..)..".... + 27, 126, 82, 195, 113, 255, 94, 154, 110, 0, 16, 13, // .~R.q.^.n... + 0, 244, 6, 61, 66, 175, 148, 202, 69, 49, 0, 68, // ...=B...E1.D + 21, 214, 215, 6, 83, 151, 229, 27, 0, 140, 3, 0, // ....S....... + 61, 65, 111, 148, 206, 67, 113, 0, 80, 169, 53, 222, // =Ao..Cq.P.5. + 31, 103, 172, 183, 252, 107, 254, 194, 172, 164, 7, 0, // .g...k...... + 61, 64, 47, 208, 19, 53, 178, 80, 5, 128, 209, 171, // =@/..5.P.... + 135, 30, 123, 218, 163, 171, 139, 190, 75, 86, 0, 176, // ..{.....KV.. + 119, 244, 64, 205, 12, 84, 5, 64, 148, 125, 107, 160, // w.@..T.@.}k. + 181, 164, 42, 121, 150, 154, 97, 175, 216, 51, 11, 222, // ..*y..a..3.. + 51, 1, 128, 40, 91, 40, 224, 43, 183, 215, 95, 78, // 3..([(.+.._N + 203, 210, 95, 232, 216, 19, 246, 134, 61, 178, 228, 57, // .._.....=..9 + 83, 0, 136, 42, 239, 8, 174, 175, 242, 248, 134, 180, // S..*........ + 178, 253, 204, 100, 203, 181, 72, 47, 95, 98, 79, 44, // ...d..H/_bO, + 122, 205, 36, 0, 163, 107, 15, 59, 131, 15, 217, 125, // z.$..k.;...} + 220, 7, 90, 124, 30, 17, 107, 198, 218, 177, 7, 150, // ..Z|..k..... + 61, 102, 26, 128, 49, 207, 36, 132, 2, 78, 155, 159, // =f..1.$..N.. + 251, 152, 133, 157, 72, 39, 218, 201, 19, 107, 196, 90, // ....H'...k.Z + 181, 226, 171, 102, 0, 8, 223, 209, 212, 220, 25, 176, // ...f........ + 214, 4, 253, 231, 139, 45, 117, 87, 212, 14, 29, 107, // .....-uW...k + 192, 90, 176, 166, 240, 29, 56, 13, 0, 20, 18, 215, // .Z....8..... + 22, 188, 221, 190, 37, 208, 110, 107, 244, 191, 87, 233, // ....%.nk..W. + 244, 93, 34, 223, 194, 17, 57, 6, 145, 120, 76, 60, // .]"...9..xL< + 54, 126, 6, 126, 22, 126, 38, 126, 182, 214, 253, 211, // 6~.~.~&~.... + 60, 0, 145, 84, 214, 21, 248, 133, 115, 107, 192, 235, // <..T....sk.. + 108, 244, 247, 215, 248, 184, 15, 173, 30, 223, 23, 21, // l........... + 181, 245, 151, 44, 213, 222, 97, 83, 121, 221, 21, 12, // ...,..aSy... + 50, 187, 208, 53, 250, 94, 31, 252, 111, 252, 127, 248, // 2..5.^..o... + 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`. +}; + +static const struct packed_file { + const char *name; + const unsigned char *data; + size_t size; + time_t mtime; +} packed_files[] = { + {"/web_root/index.html", v1, sizeof(v1), 1652432837}, + {"/web_root/main.js", v2, sizeof(v2), 1652468289}, + {"/web_root/preact.min.js", v3, sizeof(v3), 1652374364}, + {"/web_root/style.css", v4, sizeof(v4), 1652467860}, + {"/web_root/user.png", v5, sizeof(v5), 1626172939}, + {NULL, NULL, 0, 0} +}; + +const char *mg_unlist(size_t no); +const char *mg_unlist(size_t no) { + return packed_files[no].name; +} +const char *mg_unpack(const char *path, size_t *size, time_t *mtime); +const char *mg_unpack(const char *name, size_t *size, time_t *mtime) { + const struct packed_file *p; + for (p = packed_files; p->name != NULL; p++) { + if (strcmp(p->name, name) != 0) continue; + if (size != NULL) *size = p->size - 1; + if (mtime != NULL) *mtime = p->mtime; + return (const char *) p->data; + } + return NULL; +} diff --git a/examples/complete/web_root/app.js b/examples/complete/web_root/app.js deleted file mode 100644 index 98c0f2d0..00000000 --- a/examples/complete/web_root/app.js +++ /dev/null @@ -1,312 +0,0 @@ -const {h, render, Component} = preact; -const html = htm.bind(h); - -class Login extends Component { - state = {user: '', pass: ''}; - onclick = (app) => { - const authhdr = 'Basic ' + btoa(this.state.user + ':' + this.state.pass); - const headers = {Authorization: authhdr}; - return axios.get('/api/login', {headers}) - .then(res => app.setUser(res.data.token)) - .catch(err => alert('Login failed')); - }; - onpassinput = (ev) => this.setState({pass: ev.target.value}); - onuserinput = (ev) => this.setState({user: ev.target.value}); - render({app}, {user, pass, signup}) { - return html` -
-
-

Login

- - this.onclick(app)} /> -
- -
-
- Valid logins: admin:admin, user1:pass1, user2:pass2 -
-
-
- ` - } -}; - -class Dropdown extends Component { - state = {show: false}; - render(props, state) { - const onclick = x => this.setState({show: x}); - const show = state.show ? 'show' : ''; - return html` - `; - } -}; - -const NavLink = ({href, title, url}) => html`${title}`; - -class Header extends Component { - state = {expanded: false}; - ontoggle = () => this.setState({expanded: !this.state.expanded}); - render(props, state) { - const u = props.app.state.user || {}; - return html` - - ` - } -}; - -const Info = () => html`
- This dashboard shows values kept in server memory. Many clients - can open this page. As soon as any client changes any value, - all clients update automatically. - The JS code that watches state changes, reconnects on network failures. - That means if server restarts, dashboard on all connected clients - refresh automatically. - You can use curl command-line utility: -
curl localhost:8000/api/config/get -
curl localhost:8000/api/config/watch -
curl localhost:8000/api/config/set -d '{"a":123}' -
NOTE: administrators - can change settings values, whilst users cannot. -
`; - -class DashVideo extends Component { - render(props, state) { - const onclick = ev => axios.post( - '/api/config/set', {value1: +state.value1, value2: state.value2}); - // alert(JSON.stringify(state)); - return html`
-
Change values
- - - - - -
Value 1 (number):
Value 2 (string):
-
` - } -}; - -class DashForm extends Component { - render(props, state) { - const onclick = ev => axios.post( - '/api/config/set', {value1: +state.value1, value2: state.value2}); - // alert(JSON.stringify(state)); - return html`
-
Change values
- - - - - -
Value 1 (number):
Value 2 (string):
-
` - } -}; - -class DashSettings extends Component { - state = {value1: null, value2: null}; - componentDidMount() { - axios.get('/api/config/get') - .then(r => this.setState(r.data)) - .catch(e => console.log(e)); - var self = this; - var f = function(reader) { - return reader.read().then(function(result) { - var data = String.fromCharCode.apply(null, result.value); - self.setState(JSON.parse(data)); - // console.log(JSON.parse(data)); - if (!result.done) return f(reader); - }); - }; - fetch('/api/config/watch') - .then(r => r.body.getReader()) - .then(f) - .catch(e => setTimeout(x => self.componentDidMount(), 1000)); - } - render(props, state) { - return html - `
-
Value 1 (number): -
${state.value1}
-
Value 2 (string): -
${state.value2}
-
` - } -}; - -class AdminDashboard extends Component { - render(props, state) { - return html`
- <${Info} /> -
-
-
Settings
-
<${DashSettings} />
-
-
-
Video stream
-
-
-
-
Change settings
-
<${DashForm} />
-
-
-
` - } -} - -class UserDashboard extends Component { - render(props, state) { - return html`
- <${Info} /> -
-
-
Settings
-
<${DashSettings} />
-
-
-
Video stream
-
-
-
-
` - } -} - -class Logs extends Component { - state = {live: '', static: ''}; - componentDidMount() { - var self = this; - var f = function(r) { - return r.read().then(function(result) { - var data = String.fromCharCode.apply(null, result.value); - var live = self.state.live + data; - self.setState({live}); // Append live log - if (!result.done) f(r); // Read next chunk - }); - }; - fetch('/api/log/static') - .then(r => r.text()) - .then(r => { - self.setState({static: r}); - }) - .then(r => fetch('/api/log/live')) - .then(r => r.body.getReader()) - .then(f); - } - render(props, state) { - return html`
-
- A div below shows file log.txt, which is produced by the server. - The server appends a new log message to that file every second, - and a div below also shows that, implementing a "live log" feature. - JS code on this page first fetches /api/log/static that returns - log.txt contents, then fetches /api/log/live that does not return, - but feeds chunks of data as they arrive (live log). -

- You can also use curl command-line utility to see - live logs: -
curl localhost:8000/api/log/live -
-
-
-
Static
-
${state.static}
-
-
-
Live
-
${state.live}
-
-
-
` - } -} - -class App extends Component { - state = {user: null, url: '/'}; - setUser(token) { - const maxAge = token ? 86400 : 0; - document.cookie = `access_token=${token};path=/;max-age=${maxAge}`; - // this.setState({token}); - return axios.get('/api/login') - .then(res => this.setState({user: res.data})) - .catch(err => this.setState({user: {}})); - } - componentDidMount() { - const getCookie = name => { - var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); - return v ? v[2] : ''; - }; - this.setUser(getCookie('access_token')); // Move from state1 to 2 or 3 - } - render(props, state) { - // We have three states: - // 1. Beginning. We don't know if we have a valid auth token or not - // 2. We sent an /api/login request, and failed to login - // 3. We sent an /api/login request, and succeeded to login - - if (!state.user) return ''; // State 1 - if (!state.user.user) return h(Login, {app: this}); // State 2 - return h( // State 3 - 'div', {}, h(Header, {url: state.url, app: this}), - h(preactRouter.Router, { - history: History.createHashHistory(), - onChange: ev => this.setState({url: ev.url}), - }, - h(state.user.user == 'admin' ? AdminDashboard : UserDashboard, - {default: true, app: this}), - h(Logs, {path: 'logs', app: this}))); - } -}; - -window.onload = () => render(h(App), document.body); diff --git a/examples/complete/web_root/axios.min.js b/examples/complete/web_root/axios.min.js deleted file mode 100644 index fc6c8b61..00000000 --- a/examples/complete/web_root/axios.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/* axios v0.21.1 | (c) 2020 by Matt Zabriskie */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new i(e),n=s(i.prototype.request,t);return o.extend(n,i.prototype,t),o.extend(n,t),n}var o=n(2),s=n(3),i=n(4),a=n(22),u=n(10),c=r(u);c.Axios=i,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),c.isAxiosError=n(26),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function s(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function i(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},s.forEach(["delete","get","head"],function(e){u.headers[e]={}}),s.forEach(["post","put","patch"],function(e){u.headers[e]=s.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),s=n(16),i=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,s=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:s,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,i),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?s.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,s){var i=new Error(e);return r(i,t,n,o,s)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,s,i){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(s)&&a.push("domain="+s),i===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,s,i={};return e?(r.forEach(e.split("\n"),function(e){if(s=e.indexOf(":"),t=r.trim(e.substr(0,s)).toLowerCase(),n=r.trim(e.substr(s+1)),t){if(i[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?i[t]=(i[t]?i[t]:[]).concat([n]):i[t]=i[t]?i[t]+", "+n:n}}),i):i}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(e[o],t[o])}t=t||{};var s={},i=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(i,function(e){r.isUndefined(t[e])||(s[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?s[r]=n(e[r],t[r]):r in e&&(s[r]=n(void 0,e[r]))});var f=i.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),s}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t){"use strict";e.exports=function(e){return"object"==typeof e&&e.isAxiosError===!0}}])}); -//# sourceMappingURL=axios.min.map \ No newline at end of file diff --git a/examples/complete/web_root/bootstrap.min.css b/examples/complete/web_root/bootstrap.min.css deleted file mode 100644 index 92e3fe87..00000000 --- a/examples/complete/web_root/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/examples/complete/web_root/history.min.js b/examples/complete/web_root/history.min.js deleted file mode 100644 index 5781be51..00000000 --- a/examples/complete/web_root/history.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.History=n():t.History=n()}(this,function(){return function(t){function n(o){if(e[o])return e[o].exports;var r=e[o]={exports:{},id:o,loaded:!1};return t[o].call(r.exports,r,r.exports,n),r.loaded=!0,r.exports}var e={};return n.m=t,n.c=e,n.p="",n(0)}([function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0,n.createPath=n.parsePath=n.locationsAreEqual=n.createLocation=n.createMemoryHistory=n.createHashHistory=n.createBrowserHistory=void 0;var r=e(2);Object.defineProperty(n,"createLocation",{enumerable:!0,get:function(){return r.createLocation}}),Object.defineProperty(n,"locationsAreEqual",{enumerable:!0,get:function(){return r.locationsAreEqual}});var i=e(1);Object.defineProperty(n,"parsePath",{enumerable:!0,get:function(){return i.parsePath}}),Object.defineProperty(n,"createPath",{enumerable:!0,get:function(){return i.createPath}});var a=e(7),c=o(a),u=e(8),s=o(u),f=e(9),l=o(f);n.createBrowserHistory=c.default,n.createHashHistory=s.default,n.createMemoryHistory=l.default},function(t,n){"use strict";n.__esModule=!0;n.addLeadingSlash=function(t){return"/"===t.charAt(0)?t:"/"+t},n.stripLeadingSlash=function(t){return"/"===t.charAt(0)?t.substr(1):t},n.stripPrefix=function(t,n){return 0===t.indexOf(n)?t.substr(n.length):t},n.stripTrailingSlash=function(t){return"/"===t.charAt(t.length-1)?t.slice(0,-1):t},n.parsePath=function(t){var n=t||"/",e="",o="",r=n.indexOf("#");r!==-1&&(o=n.substr(r),n=n.substr(0,r));var i=n.indexOf("?");return i!==-1&&(e=n.substr(i),n=n.substr(0,i)),n=decodeURI(n),{pathname:n,search:"?"===e?"":e,hash:"#"===o?"":o}},n.createPath=function(t){var n=t.pathname,e=t.search,o=t.hash,r=encodeURI(n||"/");return e&&"?"!==e&&(r+="?"===e.charAt(0)?e:"?"+e),o&&"#"!==o&&(r+="#"===o.charAt(0)?o:"#"+o),r}},function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0,n.locationsAreEqual=n.createLocation=void 0;var r=Object.assign||function(t){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};d.canUseDOM?void 0:(0,c.default)(!1);var n=window.history,e=(0,d.supportsHistory)(),o=!(0,d.supportsPopStateOnHashChange)(),i=t.forceRefresh,a=void 0!==i&&i,f=t.getUserConfirmation,y=void 0===f?d.getConfirmation:f,g=t.keyLength,m=void 0===g?6:g,w=t.basename?(0,s.stripTrailingSlash)((0,s.addLeadingSlash)(t.basename)):"",P=function(t){var n=t||{},e=n.key,o=n.state,i=window.location,a=i.pathname,c=i.search,u=i.hash,f=a+c+u;return w&&(f=(0,s.stripPrefix)(f,w)),r({},(0,s.parsePath)(f),{state:o,key:e})},b=function(){return Math.random().toString(36).substr(2,m)},O=(0,l.default)(),x=function(t){r(G,t),G.length=n.length,O.notifyListeners(G.location,G.action)},L=function(t){(0,d.isExtraneousPopstateEvent)(t)||A(P(t.state))},S=function(){A(P(p()))},E=!1,A=function(t){if(E)E=!1,x();else{var n="POP";O.confirmTransitionTo(t,n,y,function(e){e?x({action:n,location:t}):_(t)})}},_=function(t){var n=G.location,e=M.indexOf(n.key);e===-1&&(e=0);var o=M.indexOf(t.key);o===-1&&(o=0);var r=e-o;r&&(E=!0,C(r))},k=P(p()),M=[k.key],T=function(t){return w+(0,s.createPath)(t)},H=function(t,o){var r="PUSH",i=(0,u.createLocation)(t,o,b(),G.location);O.confirmTransitionTo(i,r,y,function(t){if(t){var o=T(i),c=i.key,u=i.state;if(e)if(n.pushState({key:c,state:u},null,o),a)window.location.href=o;else{var s=M.indexOf(G.location.key),f=M.slice(0,s===-1?0:s+1);f.push(i.key),M=f,x({action:r,location:i})}else window.location.href=o}})},j=function(t,o){var r="REPLACE",i=(0,u.createLocation)(t,o,b(),G.location);O.confirmTransitionTo(i,r,y,function(t){if(t){var o=T(i),c=i.key,u=i.state;if(e)if(n.replaceState({key:c,state:u},null,o),a)window.location.replace(o);else{var s=M.indexOf(G.location.key);s!==-1&&(M[s]=i.key),x({action:r,location:i})}else window.location.replace(o)}})},C=function(t){n.go(t)},U=function(){return C(-1)},R=function(){return C(1)},I=0,q=function(t){I+=t,1===I?((0,d.addEventListener)(window,h,L),o&&(0,d.addEventListener)(window,v,S)):0===I&&((0,d.removeEventListener)(window,h,L),o&&(0,d.removeEventListener)(window,v,S))},B=!1,F=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=O.setPrompt(t);return B||(q(1),B=!0),function(){return B&&(B=!1,q(-1)),n()}},D=function(t){var n=O.appendListener(t);return q(1),function(){q(-1),n()}},G={length:n.length,action:"POP",location:k,createHref:T,push:H,replace:j,go:C,goBack:U,goForward:R,block:F,listen:D};return G};n.default=y},function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var r=Object.assign||function(t){for(var n=1;n=0?n:0)+"#"+t)},m=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};d.canUseDOM?void 0:(0,c.default)(!1);var n=window.history,e=((0,d.supportsGoWithoutReloadUsingHash)(),t.getUserConfirmation),o=void 0===e?d.getConfirmation:e,i=t.hashType,a=void 0===i?"slash":i,f=t.basename?(0,s.stripTrailingSlash)((0,s.addLeadingSlash)(t.basename)):"",m=v[a],w=m.encodePath,P=m.decodePath,b=function(){var t=P(p());return f&&(t=(0,s.stripPrefix)(t,f)),(0,s.parsePath)(t)},O=(0,l.default)(),x=function(t){r(V,t),V.length=n.length,O.notifyListeners(V.location,V.action)},L=!1,S=null,E=function(){var t=p(),n=w(t);if(t!==n)g(n);else{var e=b(),o=V.location;if(!L&&(0,u.locationsAreEqual)(o,e))return;if(S===(0,s.createPath)(e))return;S=null,A(e)}},A=function(t){if(L)L=!1,x();else{var n="POP";O.confirmTransitionTo(t,n,o,function(e){e?x({action:n,location:t}):_(t)})}},_=function(t){var n=V.location,e=H.lastIndexOf((0,s.createPath)(n));e===-1&&(e=0);var o=H.lastIndexOf((0,s.createPath)(t));o===-1&&(o=0);var r=e-o;r&&(L=!0,R(r))},k=p(),M=w(k);k!==M&&g(M);var T=b(),H=[(0,s.createPath)(T)],j=function(t){return"#"+w(f+(0,s.createPath)(t))},C=function(t,n){var e="PUSH",r=(0,u.createLocation)(t,void 0,void 0,V.location);O.confirmTransitionTo(r,e,o,function(t){if(t){var n=(0,s.createPath)(r),o=w(f+n),i=p()!==o;if(i){S=n,y(o);var a=H.lastIndexOf((0,s.createPath)(V.location)),c=H.slice(0,a===-1?0:a+1);c.push(n),H=c,x({action:e,location:r})}else x()}})},U=function(t,n){var e="REPLACE",r=(0,u.createLocation)(t,void 0,void 0,V.location);O.confirmTransitionTo(r,e,o,function(t){if(t){var n=(0,s.createPath)(r),o=w(f+n),i=p()!==o;i&&(S=n,g(o));var a=H.indexOf((0,s.createPath)(V.location));a!==-1&&(H[a]=n),x({action:e,location:r})}})},R=function(t){n.go(t)},I=function(){return R(-1)},q=function(){return R(1)},B=0,F=function(t){B+=t,1===B?(0,d.addEventListener)(window,h,E):0===B&&(0,d.removeEventListener)(window,h,E)},D=!1,G=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=O.setPrompt(t);return D||(F(1),D=!0),function(){return D&&(D=!1,F(-1)),n()}},W=function(t){var n=O.appendListener(t);return F(1),function(){F(-1),n()}},V={length:n.length,action:"POP",location:T,createHref:j,push:C,replace:U,go:R,goBack:I,goForward:q,block:G,listen:W};return V};n.default=m},function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var r=("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Object.assign||function(t){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{},n=t.getUserConfirmation,e=t.initialEntries,o=void 0===e?["/"]:e,i=t.initialIndex,u=void 0===i?0:i,l=t.keyLength,d=void 0===l?6:l,h=(0,s.default)(),v=function(t){r(A,t),A.length=A.entries.length,h.notifyListeners(A.location,A.action)},p=function(){return Math.random().toString(36).substr(2,d)},y=f(u,0,o.length-1),g=o.map(function(t){return"string"==typeof t?(0,c.createLocation)(t,void 0,p()):(0,c.createLocation)(t,void 0,t.key||p())}),m=a.createPath,w=function(t,e){var o="PUSH",r=(0,c.createLocation)(t,e,p(),A.location);h.confirmTransitionTo(r,o,n,function(t){if(t){var n=A.index,e=n+1,i=A.entries.slice(0);i.length>e?i.splice(e,i.length-e,r):i.push(r),v({action:o,location:r,index:e,entries:i})}})},P=function(t,e){var o="REPLACE",r=(0,c.createLocation)(t,e,p(),A.location);h.confirmTransitionTo(r,o,n,function(t){t&&(A.entries[A.index]=r,v({action:o,location:r}))})},b=function(t){var e=f(A.index+t,0,A.entries.length-1),o="POP",r=A.entries[e];h.confirmTransitionTo(r,o,n,function(t){t?v({action:o,location:r,index:e}):v()})},O=function(){return b(-1)},x=function(){return b(1)},L=function(t){var n=A.index+t;return n>=0&&n0&&void 0!==arguments[0]&&arguments[0];return h.setPrompt(t)},E=function(t){return h.appendListener(t)},A={length:g.length,action:"POP",location:g[y],index:y,entries:g,createHref:m,push:w,replace:P,go:b,goBack:O,goForward:x,canGo:L,block:S,listen:E};return A};n.default=l},function(t,n){"use strict";var e=function(t){return"/"===t.charAt(0)},o=function(t,n){for(var e=n,o=e+1,r=t.length;o=0;d--){var h=i[d];"."===h?o(i,d):".."===h?(o(i,d),l++):l&&(o(i,d),l--)}if(!u)for(;l--;l)i.unshift("..");!u||""===i[0]||i[0]&&e(i[0])||i.unshift("");var v=i.join("/");return s&&"/"!==v.substr(-1)&&(v+="/"),v};t.exports=r},function(t,n){"use strict";n.__esModule=!0;var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function t(n,o){if(n===o)return!0;if(null==n||null==o)return!1;if(Array.isArray(n))return!(!Array.isArray(o)||n.length!==o.length)&&n.every(function(n,e){return t(n,o[e])});var r="undefined"==typeof n?"undefined":e(n),i="undefined"==typeof o?"undefined":e(o);if(r!==i)return!1;if("object"===r){var a=n.valueOf(),c=o.valueOf();if(a!==n||c!==o)return t(a,c);var u=Object.keys(n),s=Object.keys(o);return u.length===s.length&&u.every(function(e){return t(n[e],o[e])})}return!1};n.default=o}])}); \ No newline at end of file diff --git a/examples/complete/web_root/htm.min.js b/examples/complete/web_root/htm.min.js deleted file mode 100644 index 4fdd0fee..00000000 --- a/examples/complete/web_root/htm.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){function n(n){var t=e.get(this);return t||(t=new Map,e.set(this,t)),1<(t=a(this,t.get(n)||(t.set(n,t=function(n){function t(n){1===u&&(n||(r=r.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?p.push(0,n,r):3===u&&(n||r)?(p.push(3,n,r),u=2):2===u&&"..."===r&&n?p.push(4,n,0):2===u&&r&&!n?p.push(5,0,!0,r):5<=u&&((r||!n&&5===u)&&(p.push(u,0,r,s),u=6),n&&(p.push(u,n,0,s),u=6)),r=""}for(var e,s,u=1,r="",h="",p=[0],a=0;a"===e?(u=1,""):e+r[0]:h?e===h?h="":r+=e:'"'===e||"'"===e?h=e:">"===e?(t(),u=1):u&&("="===e?(u=5,s=r,r=""):"/"===e&&(u<5||">"===n[a][o+1])?(t(),3===u&&(p=p[0]),(p=(u=p)[0]).push(2,0,u),u=0):" "===e||"\t"===e||"\n"===e||"\r"===e?(t(),u=2):r+=e),3===u&&"!--"===r&&(u=4,p=p[0])}return t(),p}(n)),t),arguments,[])).length?t:t[0]}var a=function(n,t,e,s){var u;t[0]=0;for(var r=1;r`QL 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 - example + Device Dashboard - - - - - - - - + diff --git a/examples/complete/web_root/linkstate.min.js b/examples/complete/web_root/linkstate.min.js deleted file mode 100644 index d2289dc9..00000000 --- a/examples/complete/web_root/linkstate.min.js +++ /dev/null @@ -1,18 +0,0 @@ -function linkState(component, key, eventPath) { - let path = key.split('.'), cache = component.__lsc || (component.__lsc = {}); - - return cache[key + eventPath] || (cache[key + eventPath] = function(e) { - let t = e && e.target || this, state = {}, obj = state, - v = typeof eventPath === 'string' ? - delve(e, eventPath) : - t.nodeName ? (t.type.match(/^che|rad/) ? t.checked : t.value) : - e, - i = 0; - for (; i < path.length - 1; i++) { - obj = obj[path[i]] || - (obj[path[i]] = !i && component.state[path[i]] || {}); - } - obj[path[i]] = v; - component.setState(state); - }); -} diff --git a/examples/complete/web_root/main.js b/examples/complete/web_root/main.js new file mode 100644 index 00000000..0560f041 --- /dev/null +++ b/examples/complete/web_root/main.js @@ -0,0 +1,249 @@ +'use strict'; +import {Component, h, html, render, useEffect, useState} from './preact.min.js'; + +const Nav = props => html` +
+
+
+ Your Product +
+
+ Logged in as: + + ${props.user} + logout +
+
+
`; + +const Footer = props => html` +
+ Copyright (c) Your Company +
+`; + + +const Hero = props => html` +
+

Interactive Device Dashboard

+ + This device dashboard is developed with modern and compact Preact framework, + in order to fit on a very small devices. This is + a hybrid server which + provides both static and dynamic content. Static files, like CSS/JS/HTML + or images, are compiled into the server binary. Dynamic content is + served via the REST API. + + This dashboard shows values kept in server memory. Many clients can open + this page. The JS code that watches state changes, reconnects on network + failures. That means if server restarts, dashboard on all connected clients + refresh automatically. + + NOTE: administrators can change settings values, whilst users cannot. + +

+ This UI uses the REST API implemented by the server, which you can examine + using curl command-line utility: +

+ +
curl localhost:8000/api/config/get - get current device configuration
+
curl localhost:8000/api/config/set -d 'value1=7&value2=hello' - set device configuration
+
curl localhost:8000/api/message/send -d 'msg=hello' - send chat message
+
curl localhost:8000/api/watch - get notifications on config changes or chat messages
+ +
`; + +const ShowSettings = function(props) { + return html` +
+

Device configuration

+
+ value1: + +
+
+ value2: + +
+
+ Server's corresponding runtime configuration structure: +
+struct config {
+  int value1;
+  char *value2;
+} s_config;
+    
+
+
`; +}; + +const ChangeSettings = function(props) { + const [value1, setValue1] = useState(''); + const [value2, setValue2] = useState(''); + useEffect(() => { + setValue1(props.config.value1); + setValue2(props.config.value2); + }, [props.config.value1, props.config.value2]) + const update = (name, val) => fetch('/api/config/set', { + method: 'post', + body: `${name}=${encodeURIComponent(val)}` + }).catch(err => err); + return html` +
+

+ Change configuration

+
+ value1: + setValue1(ev.target.value)} /> + +
+
+ value2: + setValue2(ev.target.value)} /> + +
+
+ As soon as administrator updates configuration, + server iterates over all connected clients and sends update + notifications to all of them - so they update automatically. +
+
`; +}; + +const Login = function(props) { + const [user, setUser] = useState(''); + const [pass, setPass] = useState(''); + const login = ev => + fetch( + '/api/login', + {headers: {Authorization: 'Basic ' + btoa(user + ':' + pass)}}) + .then(r => r.json()) + .then(r => r && props.login(r)) + .catch(err => err); + return html` +
+
+

Device Dashboard Login

+
+ setUser(ev.target.value)} value=${user} /> +
+
+ setPass(ev.target.value)} value=${pass} + onchange=${login} /> +
+
+ +
+
+ Valid logins: admin:pass0, user1:pass1, user2:pass2 +
+
+
`; +}; + +const Message = text => html`
${text}
`; + +const Chat = function(props) { + const [message, setMessage] = useState(''); + const sendmessage = ev => fetch('/api/message/send', { + method: 'post', + body: `message=${encodeURIComponent(message)}` + }).then(r => setMessage('')); + + const messages = props.messages.map( + text => html`
${text}
`); + return html` +
+

User chat

+
+ ${messages} +
+
+ setMessage(ev.target.value)} /> +
+
+ Chat demonsrates + real-time bidirectional data exchange between many clients and a server. +
+
`; +}; + +const App = function(props) { + const [messages, setMessages] = useState([]); + const [user, setUser] = useState(''); + const [config, setConfig] = useState({}); + + const refresh = () => + fetch('/api/config/get').then(r => r.json()).then(r => setConfig(r)); + + const login = function(u) { + document.cookie = `access_token=${u.token};path=/;max-age=3600`; + setUser(u.user); + refresh(); + }; + + const logout = ev => { + document.cookie = `access_token=;path=/;max-age=0`; + setUser(''); + }; + + const watch = function() { + var f = function(reader) { + return reader.read().then(function(result) { + var data = String.fromCharCode.apply(null, result.value); + var notification = JSON.parse(data); + if (notification.name == 'config') refresh(); + if (notification.name == 'message') { + setMessages(m => m.concat([notification.data])) + } + // console.log(notification); + if (!result.done) return f(reader); + }); + }; + fetch('/api/watch') + .then(r => r.body.getReader()) + .then(f) + .catch(e => setTimeout(watch, 1000)); + }; + + useEffect(() => { + fetch('/api/login') + .then(r => r.json()) + .then(r => login(r)) + .catch(err => setUser('')); + refresh(); + watch(); + }, []); + + if (!user) return html`<${Login} login=${login} />`; + const admin = user == 'admin'; + const colsize = admin ? 'c4' : 'c6'; + const cs = admin ? html`<${ChangeSettings} config=${config} />` : ''; + return html` +<${Nav} user=${user} logout=${logout} /> +
+ <${Hero} /> +
+
<${ShowSettings} config=${config} />
+
${cs}
+
<${Chat} messages=${messages} />
+
+ <${Footer} /> +
`; +}; + +window.onload = () => render(h(App), document.body); diff --git a/examples/complete/web_root/preact-router.min.js b/examples/complete/web_root/preact-router.min.js deleted file mode 100644 index 789fb64c..00000000 --- a/examples/complete/web_root/preact-router.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("preact")):"function"==typeof define&&define.amd?define(["preact"],e):t.preactRouter=e(t.preact)}(this,function(p){function i(t,e){for(var n in e)t[n]=e[n];return t}function u(t,e,n){var r,o=/(?:\?([^#]*))?(#.*)?$/,i=t.match(o),u={};if(i&&i[1])for(var a=i[1].split("&"),p=0;pe.rank?-1:t.index-e.index}function n(t,e){return t.index=e,t.rank=(n=t).props.default?0:function(t){return y(t).map(r).join("")}(n.props.path),t.props;var n}function y(t){return t.replace(/(^\/+|\/+$)/g,"").split("/")}function r(t){return":"==t.charAt(0)?1+"*+?".indexOf(t.charAt(t.length-1))||4:5}function o(){var t;return""+((t=g&&g.location?g.location:g&&g.getCurrentLocation?g.getCurrentLocation():"undefined"!=typeof location?location:b).pathname||"")+(t.search||"")}function a(t,e){return void 0===e&&(e=!1),"string"!=typeof t&&t.url&&(e=t.replace,t=t.url),function(t){for(var e=m.length;e--;)if(m[e].canRoute(t))return 1;return}(t)&&(n=t,void 0===(r=e?"replace":"push")&&(r="push"),g&&g[r]?g[r](n):"undefined"!=typeof history&&history[r+"State"]&&history[r+"State"](null,null,n)),c(t);var n,r}function c(t){for(var e=!1,n=0;n3)for(u=[u],t=3;t1&&E(i,l,u),l=b(u,i,i,n.__k,null,i.__e,l),"function"==typeof n.type&&(n.__d=l)))}function N(l,u,t,i,o,r,e,f,c){var a,v,h,y,_,m,k,w,b,x,C,A=u.type;if(void 0!==u.constructor)return null;(a=n.__b)&&a(u);try{n:if("function"==typeof A){if(w=u.props,b=(a=A.contextType)&&i[a.__c],x=a?b?b.props.value:a.__:i,t.__c?k=(v=u.__c=t.__c).__=v.__E:("prototype"in A&&A.prototype.render?u.__c=v=new A(w,x):(u.__c=v=new d(w,x),v.constructor=A,v.render=F),b&&b.sub(v),v.props=w,v.state||(v.state={}),v.context=x,v.__n=i,h=v.__d=!0,v.__h=[]),null==v.__s&&(v.__s=v.state),null!=A.getDerivedStateFromProps&&(v.__s==v.state&&(v.__s=s({},v.__s)),s(v.__s,A.getDerivedStateFromProps(w,v.__s))),y=v.props,_=v.state,h)null==A.getDerivedStateFromProps&&null!=v.componentWillMount&&v.componentWillMount(),null!=v.componentDidMount&&v.__h.push(v.componentDidMount);else{if(null==A.getDerivedStateFromProps&&w!==y&&null!=v.componentWillReceiveProps&&v.componentWillReceiveProps(w,x),!v.__e&&null!=v.shouldComponentUpdate&&!1===v.shouldComponentUpdate(w,v.__s,x)||u.__v===t.__v){v.props=w,v.state=v.__s,u.__v!==t.__v&&(v.__d=!1),v.__v=u,u.__e=t.__e,u.__k=t.__k,v.__h.length&&e.push(v),E(u,f,l);break n}null!=v.componentWillUpdate&&v.componentWillUpdate(w,v.__s,x),null!=v.componentDidUpdate&&v.__h.push(function(){v.componentDidUpdate(y,_,m)})}v.context=x,v.props=w,v.state=v.__s,(a=n.__r)&&a(u),v.__d=!1,v.__v=u,v.__P=l,a=v.render(v.props,v.state,v.context),v.state=v.__s,null!=v.getChildContext&&(i=s(s({},i),v.getChildContext())),h||null==v.getSnapshotBeforeUpdate||(m=v.getSnapshotBeforeUpdate(y,_)),C=null!=a&&a.type==p&&null==a.key?a.props.children:a,g(l,Array.isArray(C)?C:[C],u,t,i,o,r,e,f,c),v.base=u.__e,v.__h.length&&e.push(v),k&&(v.__E=v.__=null),v.__e=!1}else null==r&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=T(t.__e,u,t,i,o,r,e,c);(a=n.diffed)&&a(u)}catch(l){u.__v=null,n.__e(l,u,t)}return u.__e}function z(l,u){n.__c&&n.__c(u,l),l.some(function(u){try{l=u.__h,u.__h=[],l.some(function(n){n.call(u)})}catch(l){n.__e(l,u.__v)}})}function T(n,l,u,t,i,o,r,e){var a,s,v,h,y,p=u.props,d=l.props;if(i="svg"===l.type||i,null!=o)for(a=0;a2&&(l.children=c.slice.call(arguments,2)),u={},l)"key"!==t&&"ref"!==t&&(u[t]=l[t]);return y(n.type,u,l.key||n.key,l.ref||n.ref,null)},createContext:function(n){var l={},u={__c:"__cC"+r++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var t,i=this;return this.getChildContext||(t=[],this.getChildContext=function(){return l[u.__c]=i,l},this.shouldComponentUpdate=function(n){i.props.value!==n.value&&t.some(function(l){l.context=n.value,k(l)})},this.sub=function(n){t.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){t.splice(t.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Consumer.contextType=u,u.Provider.__=u,u},toChildArray:function n(l){return null==l||"boolean"==typeof l?[]:Array.isArray(l)?c.concat.apply([],l.map(n)):[l]},__u:j,options:n},typeof module<"u"?module.exports=e:self.preact=e}(); -//# sourceMappingURL=preact.min.js.map +var e,n,_,t,o,r,u,l={},i=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(e,n){for(var _ in n)e[_]=n[_];return e}function f(e){var n=e.parentNode;n&&n.removeChild(e)}function a(n,_,t){var o,r,u,l={};for(u in _)"key"==u?o=_[u]:"ref"==u?r=_[u]:l[u]=_[u];if(arguments.length>2&&(l.children=arguments.length>3?e.call(arguments,2):t),"function"==typeof n&&null!=n.defaultProps)for(u in n.defaultProps)void 0===l[u]&&(l[u]=n.defaultProps[u]);return p(n,l,o,r,null)}function p(e,t,o,r,u){var l={type:e,props:t,key:o,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==u?++_:u};return null!=n.vnode&&n.vnode(l),l}function h(e){return e.children}function d(e,n){this.props=e,this.context=n}function v(e,n){if(null==n)return e.__?v(e.__,e.__.__k.indexOf(e)+1):null;for(var _;n0?p(m.type,m.props,m.key,null,m.__v):m)){if(m.__=_,m.__b=_.__b+1,null===(y=H[a])||y&&m.key==y.key&&m.type===y.type)H[a]=void 0;else for(d=0;d=t.__.length&&t.__.push({}),t.__[e]}function G(e){return R=1,z(ie,e)}function z(e,n,_){var t=j(L++,2);return t.t=e,t.__c||(t.__=[_?_(n):ie(void 0,n),function(e){var n=t.t(t.__[0],e);t.__[0]!==n&&(t.__=[n,t.__[1]],t.__c.setState({}))}],t.__c=N),t.__}function J(e,_){var t=j(L++,3);!n.__s&&le(t.__H,_)&&(t.__=e,t.__H=_,N.__H.__h.push(t))}function K(e,_){var t=j(L++,4);!n.__s&&le(t.__H,_)&&(t.__=e,t.__H=_,N.__h.push(t))}function Q(e){return R=5,Y(function(){return{current:e}},[])}function X(e,n,_){R=6,K(function(){"function"==typeof e?e(n()):e&&(e.current=n())},null==_?_:_.concat(e))}function Y(e,n){var _=j(L++,7);return le(_.__H,n)&&(_.__=e(),_.__H=n,_.__h=e),_.__}function Z(e,n){return R=8,Y(function(){return e},n)}function ee(e){var n=N.context[e.__c],_=j(L++,9);return _.c=e,n?(null==_.__&&(_.__=!0,n.sub(N)),n.props.value):e.__}function ne(e,_){n.useDebugValue&&n.useDebugValue(_?_(e):e)}function _e(e){var n=j(L++,10),_=G();return n.__=e,N.componentDidCatch||(N.componentDidCatch=function(e){n.__&&n.__(e),_[1](e)}),[_[0],function(){_[1](void 0)}]}function te(){I.forEach(function(e){if(e.__P)try{e.__H.__h.forEach(re),e.__H.__h.forEach(ue),e.__H.__h=[]}catch(_){e.__H.__h=[],n.__e(_,e.__v)}}),I=[]}n.__b=function(e){N=null,O&&O(e)},n.__r=function(e){V&&V(e),L=0;var n=(N=e.__c).__H;n&&(n.__h.forEach(re),n.__h.forEach(ue),n.__h=[])},n.diffed=function(e){q&&q(e);var _=e.__c;_&&_.__H&&_.__H.__h.length&&(1!==I.push(_)&&W===n.requestAnimationFrame||((W=n.requestAnimationFrame)||function(e){var n,_=function(){clearTimeout(t),oe&&cancelAnimationFrame(n),setTimeout(e)},t=setTimeout(_,100);oe&&(n=requestAnimationFrame(_))})(te)),N=void 0},n.__c=function(e,_){_.some(function(e){try{e.__h.forEach(re),e.__h=e.__h.filter(function(e){return!e.__||ue(e)})}catch(t){_.some(function(e){e.__h&&(e.__h=[])}),_=[],n.__e(t,e.__v)}}),B&&B(e,_)},n.unmount=function(e){$&&$(e);var _=e.__c;if(_&&_.__H)try{_.__H.__.forEach(re)}catch(e){n.__e(e,_.__v)}};var oe="function"==typeof requestAnimationFrame;function re(e){var n=N;"function"==typeof e.__c&&e.__c(),N=n}function ue(e){var n=N;e.__c=e.__(),N=n}function le(e,n){return!e||e.length!==n.length||n.some(function(n,_){return n!==e[_]})}function ie(e,n){return"function"==typeof n?n(e):n}var ce=function(e,n,_,t){var o;n[0]=0;for(var r=1;r=5&&((o||!e&&5===t)&&(u.push(t,0,o,_),t=6),e&&(u.push(t,e,0,_),t=6)),o=""},i=0;i"===n?(t=1,o=""):o=n+o[0]:r?n===r?r="":o+=n:'"'===n||"'"===n?r=n:">"===n?(l(),t=1):t&&("="===n?(t=5,_=o,o=""):"/"===n&&(t<5||">"===e[i][c+1])?(l(),3===t&&(u=u[0]),t=u,(u=u[0]).push(2,0,t),t=0):" "===n||"\t"===n||"\n"===n||"\r"===n?(l(),t=2):o+=n),3===t&&"!--"===o&&(t=4,u=u[0])}return l(),u}(e)),n),arguments,[])).length>1?n:n[0]}.bind(a);export{a as h,fe as html,M as render,d as Component,F as createContext,G as useState,z as useReducer,J as useEffect,K as useLayoutEffect,Q as useRef,X as useImperativeHandle,Y as useMemo,Z as useCallback,ee as useContext,ne as useDebugValue,_e as useErrorBoundary}; diff --git a/examples/complete/web_root/style.css b/examples/complete/web_root/style.css index e2860f2b..db1bb3bf 100644 --- a/examples/complete/web_root/style.css +++ b/examples/complete/web_root/style.css @@ -1,7 +1,36 @@ -html, body { margin: 0; padding: 0; height: 100%; } +* { box-sizing: border-box; } +html, body { margin: 0; padding: 0; height: 100%; font: 16px sans-serif; } select, input, label::before, textarea { outline: none; box-shadow:none !important; border: 1px solid #ccc !important; } -.btn:focus,.btn:active:focus,.btn.active:focus, -.btn.focus,.btn:active.focus,.btn.active.focus { outline: none; box-shadow:none !important; } -.dropdown.autoexpand:hover>.dropdown-menu { display: block; } -.pointer { cursor: pointer; } -.log { max-height: 10em; overflow: auto; height: 100%; } +code, pre { color: #373; font-family: monospace; font-weight: bolder; font-size: smaller; background: #ddd; padding: 0.1em 0.3em; border-radius: 0.2em; } +textarea, input, .addon { font-size: 15px; border: 1px solid #ccc; padding: 0.5em; } +a, a:visited, a:active { color: #55f; } +.addon { background: #eee; } +.btn { + background: #ccc; border-radius: 0.3em; border: 0; color: #fff; cursor: pointer; + display: inline-block; padding: 0.6em 2em; font-weight: bolder; +} +.btn[disabled] { opacity: 0.5; cursor: auto;} +.smooth { transition: all .2s; } +.container { margin: 0 20px; width: auto; } +.d-flex { display: flex; } +.d-none { display: none; } +.border { border: 1px solid #ddd; } +.rounded { border-radius: 0.5em; } +.msg { background: #def; border-left: 5px solid #59d; padding: 1em; margin: 1em 0; } +.row { margin: 1% 0; overflow: auto; } +.col { float: left; } +.table, .c12 { width: 100%; } +.c11 { width: 91.66%; } +.c10 { width: 83.33%; } +.c9 { width: 75%; } +.c8 { width: 66.66%; } +.c7 { width: 58.33%; } +.c6 { width: 50%; } +.c5 { width: 41.66%; } +.c4 { width: 33.33%; } +.c3 { width: 25%; } +.c2 { width: 16.66%; } +.c1 { width: 8.33%; } + +@media (min-width: 1310px) { .container { margin: auto; width: 1270px; } } +@media (max-width: 870px) { .row .col { width: 100%; } } diff --git a/examples/complete/web_root/images/user.png b/examples/complete/web_root/user.png similarity index 100% rename from examples/complete/web_root/images/user.png rename to examples/complete/web_root/user.png diff --git a/src/fs.h b/src/fs.h index f7cce376..43e15a31 100644 --- a/src/fs.h +++ b/src/fs.h @@ -40,3 +40,7 @@ void mg_fs_close(struct mg_fd *fd); char *mg_file_read(struct mg_fs *fs, const char *path, size_t *size); bool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t); bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...); + +// API for the embedded (packed) filesystem +const char *mg_unpack(const char *path, size_t *size, time_t *mtime); +const char *mg_unlist(size_t no); diff --git a/src/fs_packed.c b/src/fs_packed.c index 179666fb..88ddca8a 100644 --- a/src/fs_packed.c +++ b/src/fs_packed.c @@ -7,9 +7,6 @@ struct packed_file { size_t pos; }; -const char *mg_unpack(const char *path, size_t *size, time_t *mtime); -const char *mg_unlist(size_t no); - #if MG_ENABLE_PACKED_FS #else const char *mg_unpack(const char *path, size_t *size, time_t *mtime) { diff --git a/test/pack.c b/test/pack.c index 1850bf06..59f8be78 100644 --- a/test/pack.c +++ b/test/pack.c @@ -92,7 +92,7 @@ int main(int argc, char *argv[]) { struct stat st; const char *name = argv[i]; size_t n = strlen(strip_prefix); - if (strcmp(argv[i], "-z") == 0 || strcmp(argv[i], "-s") == 0) { + if (strcmp(argv[i], "-s") == 0) { i++; continue; }