diff --git a/examples/gui/data/js/controls.js b/examples/gui/data/js/controls.js index c945d0b..df3c890 100644 --- a/examples/gui/data/js/controls.js +++ b/examples/gui/data/js/controls.js @@ -1,29 +1,28 @@ -const UI_INITIAL_GUI = 100; +const UI_INITIAL_GUI = 200; + const UI_TITEL = 0; +const UI_BUTTON = 1; +const UI_PAD = 2; +const UI_CPAD = 3; -const UI_LABEL = 1; -const UPDATE_LABEL = 6; +const UI_LABEL = 4; +const UPDATE_LABEL = 104; -const UI_BUTTON = 2; +const UI_SWITCHER = 5; +const UPDATE_SWITCHER = 105; -const UI_SWITCHER = 3; -const UPDATE_SWITCHER = 7; +const UI_SLIDER = 6; +const UPDATE_SLIDER = 106; -const UI_PAD = 4; -const UI_CPAD = 5; +const UI_NUMBER = 7; +const UPDATE_NUMBER = 107; -const UI_SLIDER = 8; -const UPDATE_SLIDER = 9; +const UI_TEXT_INPUT = 8; +const UPDATE_TEXT_INPUT = 108; -const UI_NUMBER = 10; -const UPDATE_NUMBER = 11; - -const UI_TEXT_INPUT = 12; -const UPDATE_TEXT_INPUT = 13; - -const UI_GRAPH = 14; -const CLEAR_GRAPH = 15; -const ADD_GRAPH_POINT = 16; +const UI_GRAPH = 9; +const ADD_GRAPH_POINT = 10; +const CLEAR_GRAPH = 109; const FOR = 0; const BACK = 1; @@ -39,8 +38,8 @@ const C_WETASPHALT = 3; const C_SUNFLOWER = 4; const C_CARROT = 5; const C_ALIZARIN = 6; -const C_NONE = 7; -const C_DARK = 8; +const C_DARK = 7; +const C_NONE = 255; function colorClass(colorId) { colorId = Number(colorId); diff --git a/examples/gui/data/js/controls.min.js b/examples/gui/data/js/controls.min.js index d9cf5e7..b61c5de 100644 --- a/examples/gui/data/js/controls.min.js +++ b/examples/gui/data/js/controls.min.js @@ -1,4 +1,4 @@ -const UI_INITIAL_GUI=100;const UI_TITEL=0;const UI_LABEL=1;const UPDATE_LABEL=6;const UI_BUTTON=2;const UI_SWITCHER=3;const UPDATE_SWITCHER=7;const UI_PAD=4;const UI_CPAD=5;const UI_SLIDER=8;const UPDATE_SLIDER=9;const UI_NUMBER=10;const UPDATE_NUMBER=11;const UI_TEXT_INPUT=12;const UPDATE_TEXT_INPUT=13;const UI_GRAPH=14;const CLEAR_GRAPH=15;const ADD_GRAPH_POINT=16;const FOR=0;const BACK=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_NONE=7;const C_DARK=8;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_NONE:return"dark";default:return"";}} +const UI_INITIAL_GUI=200;const UI_TITEL=0;const UI_BUTTON=1;const UI_PAD=2;const UI_CPAD=3;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const FOR=0;const BACK=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_NONE:return"dark";default:return"";}} var websock;var websockConnected=false;function restart(){$(document).add("*").off();$("#row").html("");websock.close();start();} function conStatusError(){websockConnected=false;$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart});} function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}} diff --git a/src/ESPUI.cpp b/src/ESPUI.cpp index 898095f..ba63717 100644 --- a/src/ESPUI.cpp +++ b/src/ESPUI.cpp @@ -12,37 +12,52 @@ #include #include +uint16_t Control::idCounter = 0; + // ################# Spiffs functions #if defined(ESP32) -void listDir(const char *dirname, uint8_t levels) { - Serial.printf("Listing directory: %s\n", dirname); +void listDir( const char* dirname, uint8_t levels ) { + if ( ESPUI.verbosity ) { + Serial.printf( "Listing directory: %s\n", dirname ); + } - File root = SPIFFS.open(dirname); + File root = SPIFFS.open( dirname ); + + if ( !root ) { + if ( ESPUI.verbosity ) { + Serial.println( "Failed to open directory" ); + } - if (!root) { - Serial.println("Failed to open directory"); return; } - if (!root.isDirectory()) { - Serial.println("Not a directory"); + if ( !root.isDirectory() ) { + if ( ESPUI.verbosity ) { + Serial.println( "Not a directory" ); + } + return; } File file = root.openNextFile(); - while (file) { - if (file.isDirectory()) { - Serial.print(" DIR : "); - Serial.println(file.name()); - if (levels) { - listDir(file.name(), levels - 1); + while ( file ) { + if ( file.isDirectory() ) { + if ( ESPUI.verbosity ) { + Serial.print( " DIR : " ); + Serial.println( file.name() ); + } + + if ( levels ) { + listDir( file.name(), levels - 1 ); } } else { - Serial.print(" FILE: "); - Serial.print(file.name()); - Serial.print(" SIZE: "); - Serial.println(file.size()); + if ( ESPUI.verbosity ) { + Serial.print( " FILE: " ); + Serial.print( file.name() ); + Serial.print( " SIZE: " ); + Serial.println( file.size() ); + } } file = root.openNextFile(); @@ -50,76 +65,112 @@ void listDir(const char *dirname, uint8_t levels) { } #else -void listDir(const char *dirname, uint8_t levels) { +void listDir( const char* dirname, uint8_t levels ) { // ignoring levels for esp8266 - Serial.printf("Listing directory: %s\n", dirname); + Serial.printf( "Listing directory: %s\n", dirname ); String str = ""; - Dir dir = SPIFFS.openDir("/"); - while (dir.next()) { - Serial.print(" FILE: "); - Serial.print(dir.fileName()); - Serial.print(" SIZE: "); - Serial.println(dir.fileSize()); + Dir dir = SPIFFS.openDir( "/" ); + + while ( dir.next() ) { + Serial.print( " FILE: " ); + Serial.print( dir.fileName() ); + Serial.print( " SIZE: " ); + Serial.println( dir.fileSize() ); } } #endif void ESPUIClass::list() { - if (!SPIFFS.begin()) { - Serial.println("SPIFFS Mount Failed"); + if ( !SPIFFS.begin() ) { + Serial.println( "SPIFFS Mount Failed" ); return; } - listDir("/", 1); + + listDir( "/", 1 ); #if defined(ESP32) - Serial.println(SPIFFS.totalBytes()); - Serial.println(SPIFFS.usedBytes()); + + Serial.println( SPIFFS.totalBytes() ); + Serial.println( SPIFFS.usedBytes() ); + #else FSInfo fs_info; - SPIFFS.info(fs_info); + SPIFFS.info( fs_info ); + + Serial.println( fs_info.totalBytes ); + Serial.println( fs_info.usedBytes ); - Serial.println(fs_info.totalBytes); - Serial.println(fs_info.usedBytes); #endif } -void deleteFile(const char *path) { - if (DEBUG_ESPUI) Serial.print(SPIFFS.exists(path)); - if (!SPIFFS.exists(path)) { - Serial.printf("File: %s does not exist, not deleting\n", path); +void deleteFile( const char* path ) { + if ( ESPUI.verbosity ) { + Serial.print( SPIFFS.exists( path ) ); + } + + if ( !SPIFFS.exists( path ) ) { + if ( ESPUI.verbosity ) { + Serial.printf( "File: %s does not exist, not deleting\n", path ); + } + return; } - Serial.printf("Deleting file: %s\n", path); + if ( ESPUI.verbosity ) { + Serial.printf( "Deleting file: %s\n", path ); + } - if (SPIFFS.remove(path)) { - Serial.println("File deleted"); + if ( SPIFFS.remove( path ) ) { + if ( ESPUI.verbosity ) { + Serial.println( "File deleted" ); + } } else { - Serial.println("Delete failed"); + if ( ESPUI.verbosity ) { + Serial.println( "Delete failed" ); + } } } -void writeFile(const char *path, const char *data) { - Serial.printf("Writing file: %s\n", path); +void writeFile( const char* path, const char* data ) { + if ( ESPUI.verbosity ) { + Serial.printf( "Writing file: %s\n", path ); + } + + File file = SPIFFS.open( path, FILE_WRITE ); + + if ( !file ) { + if ( ESPUI.verbosity ) { + Serial.println( "Failed to open file for writing" ); + } - File file = SPIFFS.open(path, FILE_WRITE); - if (!file) { - Serial.println("Failed to open file for writing"); return; } + #if defined(ESP32) - if (file.print(data)) { - Serial.println("File written"); + + if ( file.print( data ) ) { + if ( ESPUI.verbosity ) { + Serial.println( "File written" ); + } } else { - Serial.println("Write failed"); + if ( ESPUI.verbosity ) { + Serial.println( "Write failed" ); + } } + #else - if (file.print(FPSTR(data))) { - Serial.println("File written"); + + if ( file.print( FPSTR( data ) ) ) { + if ( ESPUI.verbosity ) { + Serial.println( "File written" ); + } } else { - Serial.println("Write failed"); + if ( ESPUI.verbosity ) { + Serial.println( "Write failed" ); + } } + #endif file.close(); } @@ -129,488 +180,389 @@ void writeFile(const char *path, const char *data) { void ESPUIClass::prepareFileSystem() { // this function should only be used once - Serial.println("About to prepare filesystem..."); + if ( this->verbosity ) { + Serial.println( "About to prepare filesystem..." ); + } #if defined(ESP32) SPIFFS.format(); - if (!SPIFFS.begin(true)) { - Serial.println("SPIFFS Mount Failed"); + + if ( !SPIFFS.begin( true ) ) { + if ( this->verbosity ) { + Serial.println( "SPIFFS Mount Failed" ); + } + return; } - listDir("/", 1); - Serial.println("SPIFFS Mount ESP32 Done"); + + if ( this->verbosity ) { + listDir( "/", 1 ); + Serial.println( "SPIFFS Mount ESP32 Done" ); + } + #else SPIFFS.format(); SPIFFS.begin(); - Serial.println("SPIFFS Mount ESP8266 Done"); + + if ( this->verbosity ) { + Serial.println( "SPIFFS Mount ESP8266 Done" ); + } + #endif - deleteFile("/index.htm"); + deleteFile( "/index.htm" ); - deleteFile("/css/style.css"); - deleteFile("/css/normalize.css"); + deleteFile( "/css/style.css" ); + deleteFile( "/css/normalize.css" ); - deleteFile("/js/zepto.min.js"); - deleteFile("/js/controls.js"); - deleteFile("/js/slider.js"); + deleteFile( "/js/zepto.min.js" ); + deleteFile( "/js/controls.js" ); + deleteFile( "/js/slider.js" ); - Serial.println("Cleanup done"); + if ( this->verbosity ) { + Serial.println( "Cleanup done" ); + } // Now write - writeFile("/index.htm", HTML_INDEX); + writeFile( "/index.htm", HTML_INDEX ); - writeFile("/css/style.css", CSS_STYLE); - writeFile("/css/normalize.css", CSS_NORMALIZE); + writeFile( "/css/style.css", CSS_STYLE ); + writeFile( "/css/normalize.css", CSS_NORMALIZE ); - writeFile("/js/zepto.min.js", JS_ZEPTO); - writeFile("/js/controls.js", JS_CONTROLS); - writeFile("/js/slider.js", JS_SLIDER); + writeFile( "/js/zepto.min.js", JS_ZEPTO ); + writeFile( "/js/controls.js", JS_CONTROLS ); + writeFile( "/js/slider.js", JS_SLIDER ); - Serial.println("Done Initializing filesystem :-)"); + if ( this->verbosity ) { + Serial.println( "Done Initializing filesystem :-)" ); + } #if defined(ESP32) - if (DEBUG_ESPUI) listDir("/", 1); + + if ( this->verbosity ) { + listDir( "/", 1 ); + } + #endif SPIFFS.end(); } // Handle Websockets Communication -void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, - AwsEventType type, void *arg, uint8_t *data, size_t len) { - switch (type) { +void onWsEvent( AsyncWebSocket* server, AsyncWebSocketClient* client, + AwsEventType type, void* arg, uint8_t* data, size_t len ) { + switch ( type ) { case WS_EVT_DISCONNECT: { - if (DEBUG_ESPUI) Serial.printf("Disconnected!\n"); - break; - } - case WS_EVT_PONG: { - if (DEBUG_ESPUI) Serial.printf("Received PONG!\n"); - break; - } - case WS_EVT_ERROR: { - if (DEBUG_ESPUI) Serial.printf("WebSocket Error!\n"); - break; - } - case WS_EVT_CONNECT: { - if (DEBUG_ESPUI) { - Serial.print("Connected: "); - Serial.println(client->id()); + if ( ESPUI.verbosity ) { + Serial.printf( "Disconnected!\n" ); } - ESPUI.jsonDom(client); - if (DEBUG_ESPUI) { - Serial.println("JSON Data Sent to Client!"); + break; + } + + case WS_EVT_PONG: { + if ( ESPUI.verbosity ) { + Serial.printf( "Received PONG!\n" ); } - } break; + + break; + } + + case WS_EVT_ERROR: { + if ( ESPUI.verbosity ) { + Serial.printf( "WebSocket Error!\n" ); + } + + break; + } + + case WS_EVT_CONNECT: { + if ( ESPUI.verbosity ) { + Serial.print( "Connected: " ); + Serial.println( client->id() ); + } + + ESPUI.jsonDom( client ); + + if ( ESPUI.verbosity ) { + Serial.println( "JSON Data Sent to Client!" ); + } + } + break; + case WS_EVT_DATA: { String msg = ""; - for (size_t i = 0; i < len; i++) { - msg += (char)data[i]; + + for ( size_t i = 0; i < len; i++ ) { + msg += ( char )data[i]; } - int id = msg.substring(msg.lastIndexOf(':') + 1).toInt(); - if (id >= ESPUI.cIndex) { - if (DEBUG_ESPUI) Serial.println("Maleformated id in websocket message"); + Control* c = ESPUI.getControl( msg.substring( msg.lastIndexOf( ':' ) + 1 ).toInt() ); + + if ( c != nullptr && c->callback != nullptr ) { + if ( msg.startsWith( "bdown:" ) ) { + c->callback( *c, B_DOWN ); + } else if ( msg.startsWith( "bup:" ) ) { + c->callback( *c, B_UP ); + } else if ( msg.startsWith( "pfdown:" ) ) { + c->callback( *c, P_FOR_DOWN ); + } else if ( msg.startsWith( "pfup:" ) ) { + c->callback( *c, P_FOR_UP ); + } else if ( msg.startsWith( "pldown:" ) ) { + c->callback( *c, P_LEFT_DOWN ); + } else if ( msg.startsWith( "plup:" ) ) { + c->callback( *c, P_LEFT_UP ); + } else if ( msg.startsWith( "prdown:" ) ) { + c->callback( *c, P_RIGHT_DOWN ); + } else if ( msg.startsWith( "prup:" ) ) { + c->callback( *c, P_RIGHT_UP ); + } else if ( msg.startsWith( "pbdown:" ) ) { + c->callback( *c, P_BACK_DOWN ); + } else if ( msg.startsWith( "pbup:" ) ) { + c->callback( *c, P_BACK_UP ); + } else if ( msg.startsWith( "pcdown:" ) ) { + c->callback( *c, P_CENTER_DOWN ); + } else if ( msg.startsWith( "pcup:" ) ) { + c->callback( *c, P_CENTER_UP ); + } else if ( msg.startsWith( "sactive:" ) ) { + ESPUI.updateSwitcher( c->id, true ); + c->callback( *c, S_ACTIVE ); + } else if ( msg.startsWith( "sinactive:" ) ) { + ESPUI.updateSwitcher( c->id, false ); + c->callback( *c, S_INACTIVE ); + } else if ( msg.startsWith( "slvalue:" ) ) { + int value = msg.substring( msg.indexOf( ':' ) + 1, msg.lastIndexOf( ':' ) ).toInt(); + ESPUI.updateSlider( c->id, value, client->id() ); + c->callback( *c, SL_VALUE ); + } else if ( msg.startsWith( "nvalue:" ) ) { + int value = msg.substring( msg.indexOf( ':' ) + 1, msg.lastIndexOf( ':' ) ).toInt(); + ESPUI.updateNumber( c->id, value, client->id() ); + c->callback( *c, N_VALUE ); + } else if ( msg.startsWith( "tvalue:" ) ) { + String value = msg.substring( msg.indexOf( ':' ) + 1, msg.lastIndexOf( ':' ) ); + ESPUI.updateText( c->id, value, client->id() ); + c->callback( *c, T_VALUE ); + } + } else { + if ( ESPUI.verbosity ) { + Serial.println( "Maleformated id in websocket message" ); + } + return; } + } + break; - Control *c = - ESPUI.controls[msg.substring(msg.lastIndexOf(':') + 1).toInt()]; - - if (msg.startsWith("bdown:")) { - c->callback(*c, B_DOWN); - } else if (msg.startsWith("bup:")) { - c->callback(*c, B_UP); - } else if (msg.startsWith("pfdown:")) { - c->callback(*c, P_FOR_DOWN); - } else if (msg.startsWith("pfup:")) { - c->callback(*c, P_FOR_UP); - } else if (msg.startsWith("pldown:")) { - c->callback(*c, P_LEFT_DOWN); - } else if (msg.startsWith("plup:")) { - c->callback(*c, P_LEFT_UP); - } else if (msg.startsWith("prdown:")) { - c->callback(*c, P_RIGHT_DOWN); - } else if (msg.startsWith("prup:")) { - c->callback(*c, P_RIGHT_UP); - } else if (msg.startsWith("pbdown:")) { - c->callback(*c, P_BACK_DOWN); - } else if (msg.startsWith("pbup:")) { - c->callback(*c, P_BACK_UP); - } else if (msg.startsWith("pcdown:")) { - c->callback(*c, P_CENTER_DOWN); - } else if (msg.startsWith("pcup:")) { - c->callback(*c, P_CENTER_UP); - } else if (msg.startsWith("sactive:")) { - ESPUI.updateSwitcher(c->id, true); - c->callback(*c, S_ACTIVE); - } else if (msg.startsWith("sinactive:")) { - ESPUI.updateSwitcher(c->id, false); - c->callback(*c, S_INACTIVE); - } else if (msg.startsWith("slvalue:")) { - int value = - msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':')).toInt(); - ESPUI.updateSlider(c->id, value, client->id()); - c->callback(*c, SL_VALUE); - } else if (msg.startsWith("nvalue:")) { - int value = - msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':')).toInt(); - ESPUI.updateNumber(c->id, value, client->id()); - c->callback(*c, N_VALUE); - } else if (msg.startsWith("tvalue:")) { - String value = - msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':')); - ESPUI.updateText(c->id, value, client->id()); - c->callback(*c, T_VALUE); - } - } break; default: break; } } -int ESPUIClass::label(const char *label, int color, String value) { - if (labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element " + String(label) + - " exists, skipping creating element!"); +int ESPUIClass::addControl( ControlType type, const char* label, + void ( *callback )( Control, int ), + String value, ControlColor color ) { + if ( this->getControl( label ) != nullptr ) { + if ( this->verbosity ){ + Serial.println( "UI ERROR: Element " + String( label ) + + " exists, skipping creating element!" );} + return -1; } - Control *newL = new Control(); - newL->type = UI_LABEL; - newL->label = label; - newL->color = color; - if (value != "") - newL->value = value; // Init with labeltext - else - newL->value = String(label); - newL->callback = NULL; - newL->id = cIndex; - controls[cIndex] = newL; - cIndex++; - return cIndex - 1; + Control* control = new Control( type, label, callback, value, color ); + + if ( this->controls == nullptr ) { + this->controls = control; + } else { + Control* iterator = this->controls; + + while ( iterator->next != nullptr ) { + iterator = iterator->next; + } + + iterator->next = control; + } + + return control->id; } -int ESPUIClass::graph(const char *label, int color) { - if (labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element " + String(label) + - " exists, skipping creating element!"); - return -1; - } +int ESPUIClass::label( const char* label, ControlColor color, String value ) { + return addControl( ControlType::Label, label, nullptr, value, color ); +} - Control *newG = new Control(); - newG->type = UI_GRAPH; - newG->label = label; - newG->color = color; - newG->id = cIndex; - controls[cIndex] = newG; - cIndex++; - return cIndex - 1; +int ESPUIClass::graph( const char* label, ControlColor color ) { + return addControl( ControlType::Graph, label, nullptr, "", color ); } // TODO: this still needs a range setting -int ESPUIClass::slider(const char *label, void (*callBack)(Control, int), - int color, String value) { - if (labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element " + String(label) + - " exists, skipping creating element!"); - return -1; - } - - Control *newSL = new Control(); - newSL->type = UI_SLIDER; - newSL->label = label; - newSL->color = color; - if (value != "") - newSL->value = value; - else - newSL->value = ""; // TODO: init with half value - newSL->callback = callBack; - newSL->id = cIndex; - controls[cIndex] = newSL; - cIndex++; - return cIndex - 1; +int ESPUIClass::slider( const char* label, void ( *callback )( Control, int ), + ControlColor color, String value ) { + return addControl( ControlType::Button, label, callback, "", color ); } -int ESPUIClass::button(const char *label, void (*callBack)(Control, int), - int color, String value) { - if (labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element " + String(label) + - " exists, skipping creating element!"); - return -1; - } - - Control *newB = new Control(); - newB->type = UI_BUTTON; - newB->label = label; - newB->color = color; - - if (value != "") - newB->value = value; // Init with labeltext - else - newB->value = String(label); - - newB->callback = callBack; - newB->id = cIndex; - controls[cIndex] = newB; - cIndex++; - return cIndex - 1; +int ESPUIClass::button( const char* label, void ( *callback )( Control, int ), + ControlColor color, String value ) { + return addControl( ControlType::Button, label, callback, value, color ); } -int ESPUIClass::switcher(const char *label, bool startState, - void (*callBack)(Control, int), int color) { - if (labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element " + String(label) + - " exists, skipping creating element!"); - return -1; - } - - Control *newS = new Control(); - newS->type = UI_SWITCHER; - newS->label = label; - newS->color = color; - newS->value = String(startState); - newS->callback = callBack; - newS->id = cIndex; - controls[cIndex] = newS; - cIndex++; - return cIndex - 1; +int ESPUIClass::switcher( const char* label, bool startState, + void ( *callback )( Control, int ), ControlColor color ) { + return addControl( ControlType::Switcher, label, callback, "", color ); } -int ESPUIClass::pad(const char *label, bool center, - void (*callBack)(Control, int), int color) { - if (labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element " + String(label) + - " exists, skipping creating element!"); - return -1; +int ESPUIClass::pad( const char* label, bool center, + void ( *callback )( Control, int ), ControlColor color ) { + if ( center ) { + return addControl( ControlType::Cpad, label, callback, "", color ); + } else { + return addControl( ControlType::Pad, label, callback, "", color ); } - - Control *newP = new Control(); - if (center) - newP->type = UI_CPAD; - else - newP->type = UI_PAD; - newP->label = label; - newP->color = color; - newP->callback = callBack; - newP->id = cIndex; - controls[cIndex] = newP; - cIndex++; - return cIndex - 1; } // TODO: min and max need to be saved, they also need to be sent to the frontend -int ESPUIClass::number(const char *label, void (*callBack)(Control, int), - int color, int number, int min, int max) { - if (labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element " + String(label) + - " exists, skipping creating element!"); - return -1; - } - - Control *newN = new Control(); - newN->type = UI_NUMBER; - newN->label = label; - newN->color = color; - newN->value = String(number); - newN->callback = callBack; - newN->id = cIndex; - controls[cIndex] = newN; - cIndex++; - return cIndex - 1; +int ESPUIClass::number( const char* label, void ( *callback )( Control, int ), + ControlColor color, int number, int min, int max ) { + return addControl( ControlType::Number, label, callback, String( number ), color ); } -int ESPUIClass::text(const char *label, void (*callBack)(Control, int), - int color, String value) { - if (labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element " + String(label) + - " exists, skipping creating element!"); - return -1; - } - - Control *newT = new Control(); - newT->type = UI_TEXT_INPUT; - newT->label = label; - newT->color = color; - newT->value = value; - newT->callback = callBack; - newT->id = cIndex; - controls[cIndex] = newT; - cIndex++; - return cIndex - 1; +int ESPUIClass::text( const char* label, void ( *callback )( Control, int ), + ControlColor color, String value ) { + return addControl( ControlType::Text, label, callback, value, color ); } -void ESPUIClass::print(int id, String value) { - if (id < cIndex && controls[id]->type == UI_LABEL) { - controls[id]->value = value; - String json; - StaticJsonBuffer<200> jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - root["type"] = UPDATE_LABEL; - root["value"] = value; - root["id"] = String(id); - root.printTo(json); - this->ws->textAll(json); - } else { - if (DEBUG_ESPUI) - Serial.println(String("Error: ") + String(id) + String(" is no label")); - } -} -void ESPUIClass::print(String label, String value) { - if (!labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element does not " + String(label) + - " exist, cannot update!"); - return; - } - print(getIdByLabel(label), value); -} +Control* ESPUIClass::getControl( int id ) { + Control* control = this->controls; -void ESPUIClass::updateSlider(int id, int nValue, int clientId) { - if (id < cIndex && controls[id]->type == UI_SLIDER) { - controls[id]->value = nValue; - String json; - StaticJsonBuffer<200> jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - root["type"] = UPDATE_SLIDER; - root["value"] = nValue; - root["id"] = String(id); - root.printTo(json); - textThem(json, clientId); - } else { - if (DEBUG_ESPUI) - Serial.println(String("Error: ") + String(id) + String(" is no slider")); - } -} - -void ESPUIClass::updateSlider(String label, int nValue, int clientId) { - if (!labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element does not " + String(label) + - " exist, cannot update!"); - return; - } - updateSlider(getIdByLabel(label), nValue, clientId); -} - -void ESPUIClass::updateSwitcher(int id, bool nValue, int clientId) { - if (id < cIndex && controls[id]->type == UI_SWITCHER) { - controls[id]->value = nValue ? 1 : 0; - String json; - StaticJsonBuffer<200> jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - root["type"] = UPDATE_SWITCHER; - root["value"] = nValue ? 1 : 0; - root["id"] = String(id); - root.printTo(json); - textThem(json, clientId); - } else { - if (DEBUG_ESPUI) - Serial.println(String("Error: ") + String(id) + - String(" is no switcher")); - } -} - -void ESPUIClass::updateSwitcher(String label, bool nValue, int clientId) { - if (!labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element does not " + String(label) + - " exist, cannot update!"); - return; - } - updateSwitcher(getIdByLabel(label), nValue, clientId); -} - -void ESPUIClass::updateNumber(int id, int number, int clientId) { - if (id < cIndex && controls[id]->type == UI_NUMBER) { - controls[id]->value = number; - String json; - StaticJsonBuffer<200> jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - root["type"] = UPDATE_NUMBER; - root["value"] = String(number); - root["id"] = String(id); - root.printTo(json); - textThem(json, clientId); - } else { - if (DEBUG_ESPUI) - Serial.println(String("Error: ") + String(id) + String(" is no number")); - } -} - -void ESPUIClass::updateNumber(String label, int number, int clientId) { - if (!labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element does not " + String(label) + - " exist, cannot update!"); - return; - } - updateNumber(getIdByLabel(label), number, clientId); -} - -void ESPUIClass::updateText(int id, String text, int clientId) { - if (id < cIndex && controls[id]->type == UI_TEXT_INPUT) { - controls[id]->value = text; - String json; - StaticJsonBuffer<200> jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - root["type"] = UPDATE_TEXT_INPUT; - root["value"] = String(text); - root["id"] = String(id); - root.printTo(json); - textThem(json, clientId); - } else { - if (DEBUG_ESPUI) - Serial.println(String("Error: ") + String(id) + String(" is no number")); - } -} - -void ESPUIClass::updateText(String label, String text, int clientId) { - if (!labelExists(label)) { - if (DEBUG_ESPUI) - Serial.println("UI ERROR: Element does not " + String(label) + - " exist, cannot update!"); - return; - } - updateText(getIdByLabel(label), text, clientId); -} - -// This is a hacky workaround because ESPAsyncWebServer does not have a function -// like this and it's clients array is private -void ESPUIClass::textThem(String text, int clientId) { - int tryId = 0; - for (int count = 0; count < this->ws->count();) { - if (this->ws->hasClient(tryId)) { - if (clientId != tryId) { - this->ws->client(tryId)->text(text); - } - count++; + while ( control != nullptr ) { + if ( control->id == id ) { + return control; + } + + control = control->next; + } + + return nullptr; +} + +Control* ESPUIClass::getControl( String label ) { + Control* control = this->controls; + + while ( control != nullptr ) { + if ( String( control->label ) == label ) { + return control; + } + + control = control->next; + } + + return nullptr; +} + +void ESPUIClass::updateControl( Control* control, String value, int clientId ) { + if ( control ) { + control->value = value; + String json; + StaticJsonBuffer<200> jsonBuffer; + JsonObject& root = jsonBuffer.createObject(); + + root["type"] = ( int )control->type + ControlType::UpdateOffset; + root["value"] = control->value; + root["id"] = control->id; + root.printTo( json ); + + if ( clientId > 0 ) { + // This is a hacky workaround because ESPAsyncWebServer does not have a function + // like this and it's clients array is private + int tryId = 0; + + for ( int count = 0; count < this->ws->count(); ) { + if ( this->ws->hasClient( tryId ) ) { + if ( clientId != tryId ) { + this->ws->client( tryId )->text( json ); + + if ( this->verbosity >= Verbosity::VerboseJSON ) { + Serial.println( json ); + } + } + + count++; + } + + tryId++; + } + } else { + if ( this->verbosity >= Verbosity::VerboseJSON ) { + Serial.println( json ); + } + + this->ws->textAll( json ); + } + } +} +void ESPUIClass::updateControl( int id, String value, int clientId ) { + Control* control = getControl( id ); + + if ( control ) { + updateControl( control, value, clientId ); + } else { + if ( this->verbosity ) { + Serial.println( String( "Error: There is no control with ID " ) + String( id ) ); + } + } +} +void ESPUIClass::updateControl( String label, String value, int clientId ) { + Control* control = getControl( label ); + + if ( control ) { + updateControl( control, value, clientId ); + } else { + if ( this->verbosity ) { + Serial.println( String( "Error: There is no control with label " ) + label ); } - tryId++; } } -int ESPUIClass::getIdByLabel(String label) { - for (int i = 0; i < cIndex; i++) { - if (String(controls[i]->label) == label) return i; - } - return -1; // failed, nonexistant + + +void ESPUIClass::print( int id, String value ) { + updateControl( id, value ); } -bool ESPUIClass::labelExists(String label) { - for (int i = 0; i < cIndex; i++) { - if (String(controls[i]->label) == label) return true; - } - return false; +void ESPUIClass::print( String label, String value ) { + updateControl( label, value ); +} + +void ESPUIClass::updateSlider( int id, int nValue, int clientId ) { + updateControl( id, String( nValue ), clientId ); +} + +void ESPUIClass::updateSlider( String label, int nValue, int clientId ) { + updateControl( label, String( nValue ), clientId ); +} + +void ESPUIClass::updateSwitcher( int id, bool nValue, int clientId ) { + updateControl( id, String( int( nValue ? 1 : 0 ) ), clientId ); +} + +void ESPUIClass::updateSwitcher( String label, bool nValue, int clientId ) { + updateControl( label, String( int( nValue ? 1 : 0 ) ), clientId ); +} + +void ESPUIClass::updateNumber( int id, int number, int clientId ) { + updateControl( id, String( number ), clientId ); +} + +void ESPUIClass::updateNumber( String label, int number, int clientId ) { + updateControl( label, String( number ), clientId ); +} + +void ESPUIClass::updateText( int id, String text, int clientId ) { + updateControl( id, text, clientId ); +} + +void ESPUIClass::updateText( String label, String text, int clientId ) { + updateControl( label, text, clientId ); } /* @@ -619,212 +571,240 @@ Initially this function used to send the control element data individually. Due to a change in the ESPAsyncWebserver library this had top be changed to be sent as one blob at the beginning. Therefore a new type is used as well */ -void ESPUIClass::jsonDom(AsyncWebSocketClient *client) { +void ESPUIClass::jsonDom( AsyncWebSocketClient* client ) { String json; - DynamicJsonBuffer jsonBuffer(2000); - JsonObject &root = jsonBuffer.createObject(); - root["type"] = UI_INITIAL_GUI; - JsonArray &items = jsonBuffer.createArray(); + DynamicJsonBuffer jsonBuffer( 2000 ); + JsonObject& root = jsonBuffer.createObject(); + root["type"] = ( int )UI_INITIAL_GUI; + JsonArray& items = jsonBuffer.createArray(); - for (int i = -1; i < cIndex; i++) { - JsonObject &item = jsonBuffer.createObject(); + Control* control = this->controls; - if (i == -1) { - item["type"] = UI_TITEL; - item["label"] = String(ui_title); - } else { - item["type"] = controls[i]->type; - item["label"] = String(controls[i]->label); - item["value"] = String(controls[i]->value); - item["color"] = String(controls[i]->color); - item["id"] = String(i); - } - items.add(item); + { + JsonObject& item = jsonBuffer.createObject(); + item["type"] = ( int )UI_TITLE; + item["label"] = String( ui_title ); + items.add( item ); + } + + while ( control != nullptr ) { + JsonObject& item = jsonBuffer.createObject(); + + item["id"] = String( control->id ); + item["type"] = ( int )control->type; + item["label"] = String( control->label ); + item["value"] = String( control->value ); + item["color"] = ( int )control->color; + + items.add( item ); + + control = control->next; } // Send as one big bunch root["controls"] = items; - root.printTo(json); - client->text(json); + root.printTo( json ); + + if ( this->verbosity >= Verbosity::VerboseJSON ) { + Serial.println( json ); + } + + client->text( json ); } -void ESPUIClass::beginSPIFFS(const char *_title) { - begin(_title, NULL, NULL); - basicAuth = false; -} - -void ESPUIClass::beginSPIFFS(const char *_title, const char *username, - const char *password) { +void ESPUIClass::beginSPIFFS( const char* _title, const char* username, const char* password ) { ui_title = _title; - server = new AsyncWebServer(80); - ws = new AsyncWebSocket("/ws"); + this->basicAuthUsername = username; + this->basicAuthPassword = password; - if (!SPIFFS.begin()) { - Serial.println( - "SPIFFS Mount Failed, PLEASE CHECK THE README ON HOW TO " - "PREPARE YOUR ESP!!!!!!!"); - return; - } - listDir("/", 1); - - if (!SPIFFS.exists("/index.htm")) { - Serial.println( - "Please read the README!!!!!!!, Make sure to " - "ESPUI.prepareFileSystem() once in an empty sketch"); - return; - } - - ws->onEvent(onWsEvent); - server->addHandler(ws); - - if (basicAuth && username != NULL && password != NULL) { - basicAuthPassword = password; - basicAuthUsername = username; - basicAuth = true; - if (WS_AUTHENTICATION) - ws->setAuthentication(this->basicAuthUsername, this->basicAuthPassword); - server->serveStatic("/", SPIFFS, "/") - .setDefaultFile("index.htm") - .setAuthentication(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword); - - } else if (basicAuth) { - Serial.println( - "Could not enable BasicAuth: Username or password are not set"); + if ( username == nullptr && password == nullptr ) { + basicAuth = false; } else { - server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); + basicAuth = true; + } + + server = new AsyncWebServer( 80 ); + ws = new AsyncWebSocket( "/ws" ); + + if ( !SPIFFS.begin() ) { + if ( ESPUI.verbosity ) { + Serial.println( + "SPIFFS Mount Failed, PLEASE CHECK THE README ON HOW TO " + "PREPARE YOUR ESP!!!!!!!" ); + } + + return; + } + + if ( ESPUI.verbosity ) { + listDir( "/", 1 ); + } + + if ( !SPIFFS.exists( "/index.htm" ) ) { + if ( ESPUI.verbosity ) { + Serial.println( + "Please read the README!!!!!!!, Make sure to " + "ESPUI.prepareFileSystem() once in an empty sketch" ); + } + + return; + } + + ws->onEvent( onWsEvent ); + server->addHandler( ws ); + + if ( basicAuth ) { + + if ( WS_AUTHENTICATION ) { + ws->setAuthentication( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ); + } + + server->serveStatic( "/", SPIFFS, "/" ) + .setDefaultFile( "index.htm" ) + .setAuthentication( username, password ); + + } else { + server->serveStatic( "/", SPIFFS, "/" ) + .setDefaultFile( "index.htm" ); } // Heap for general Servertest - server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request) { - if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, - ESPUI.basicAuthPassword)) + server->on( "/heap", HTTP_GET, []( AsyncWebServerRequest * request ) { + if ( ESPUI.basicAuth && !request->authenticate( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ) ) { return request->requestAuthentication(); - request->send(200, "text/plain", - String(ESP.getFreeHeap()) + " In SPIFFSmode"); - }); + } + + request->send( 200, "text/plain", + String( ESP.getFreeHeap() ) + " In SPIFFSmode" ); + } ); server->onNotFound( - [](AsyncWebServerRequest *request) { request->send(404); }); + []( AsyncWebServerRequest * request ) { + request->send( 404 ); + } ); server->begin(); - if (DEBUG_ESPUI) Serial.println("UI Initialized"); + + if ( this->verbosity ) { + Serial.println( "UI Initialized" ); + } } -void ESPUIClass::begin(const char *_title) { - begin(_title, NULL, NULL); - basicAuth = false; -} +void ESPUIClass::begin( const char* _title, const char* username, const char* password ) { + basicAuthUsername = username; + basicAuthPassword = password; -void ESPUIClass::begin(const char *_title, const char *username, - const char *password) { - if (basicAuth && username != NULL && password != NULL) { - basicAuthPassword = password; - basicAuthUsername = username; + if ( username != nullptr && password != nullptr ) { basicAuth = true; - } else if (basicAuth) { - Serial.println( - "Could not enable BasicAuth: Username or password are not set"); + } else { + basicAuth = false; } ui_title = _title; - server = new AsyncWebServer(80); - ws = new AsyncWebSocket("/ws"); + server = new AsyncWebServer( 80 ); + ws = new AsyncWebSocket( "/ws" ); - ws->onEvent(onWsEvent); - server->addHandler(ws); + ws->onEvent( onWsEvent ); + server->addHandler( ws ); - if (basicAuth && username != NULL && password != NULL) { - basicAuthPassword = password; - basicAuthUsername = username; - basicAuth = true; - if (WS_AUTHENTICATION) - ws->setAuthentication(this->basicAuthUsername, this->basicAuthPassword); + if ( basicAuth && WS_AUTHENTICATION ) + ws->setAuthentication( username, password ); - } else if (basicAuth) { - Serial.println( - "Could not enable BasicAuth: Username or password are not set"); - } - server->on("/", HTTP_GET, [](AsyncWebServerRequest *request) { - if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, - ESPUI.basicAuthPassword)) + server->on( "/", HTTP_GET, []( AsyncWebServerRequest * request ) { + if ( ESPUI.basicAuth && !request->authenticate( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ) ) { return request->requestAuthentication(); - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/html", HTML_INDEX); - request->send(response); - }); + } + + AsyncWebServerResponse* response = + request->beginResponse_P( 200, "text/html", HTML_INDEX ); + request->send( response ); + } ); // Javascript files - server->on("/js/zepto.min.js", HTTP_GET, [](AsyncWebServerRequest *request) { - if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, - ESPUI.basicAuthPassword)) + server->on( "/js/zepto.min.js", HTTP_GET, []( AsyncWebServerRequest * request ) { + if ( ESPUI.basicAuth && !request->authenticate( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ) ) { return request->requestAuthentication(); - AsyncWebServerResponse *response = request->beginResponse_P( - 200, "application/javascript", JS_ZEPTO_GZIP, sizeof(JS_ZEPTO_GZIP)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); - }); + } - server->on("/js/controls.js", HTTP_GET, [](AsyncWebServerRequest *request) { - if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, - ESPUI.basicAuthPassword)) - return request->requestAuthentication(); - AsyncWebServerResponse *response = - request->beginResponse_P(200, "application/javascript", - JS_CONTROLS_GZIP, sizeof(JS_CONTROLS_GZIP)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); - }); + AsyncWebServerResponse* response = + request->beginResponse_P( + 200, "application/javascript", JS_ZEPTO_GZIP, sizeof( JS_ZEPTO_GZIP ) ); + response->addHeader( "Content-Encoding", "gzip" ); + request->send( response ); + } ); - server->on("/js/slider.js", HTTP_GET, [](AsyncWebServerRequest *request) { - if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, - ESPUI.basicAuthPassword)) + server->on( "/js/controls.js", HTTP_GET, []( AsyncWebServerRequest * request ) { + if ( ESPUI.basicAuth && !request->authenticate( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ) ) { return request->requestAuthentication(); - AsyncWebServerResponse *response = request->beginResponse_P( - 200, "application/javascript", JS_SLIDER_GZIP, sizeof(JS_SLIDER_GZIP)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); - }); + } + + AsyncWebServerResponse* response = + request->beginResponse_P( + 200, "application/javascript", JS_CONTROLS_GZIP, sizeof( JS_CONTROLS_GZIP ) ); + response->addHeader( "Content-Encoding", "gzip" ); + request->send( response ); + } ); + + server->on( "/js/slider.js", HTTP_GET, []( AsyncWebServerRequest * request ) { + if ( ESPUI.basicAuth && !request->authenticate( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ) ) { + return request->requestAuthentication(); + } + + AsyncWebServerResponse* response = + request->beginResponse_P( + 200, "application/javascript", JS_SLIDER_GZIP, sizeof( JS_SLIDER_GZIP ) ); + response->addHeader( "Content-Encoding", "gzip" ); + request->send( response ); + } ); // Stylesheets - server->on("/css/style.css", HTTP_GET, [](AsyncWebServerRequest *request) { - if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, - ESPUI.basicAuthPassword)) + server->on( "/css/style.css", HTTP_GET, []( AsyncWebServerRequest * request ) { + if ( ESPUI.basicAuth && !request->authenticate( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ) ) { return request->requestAuthentication(); - AsyncWebServerResponse *response = request->beginResponse_P( - 200, "text/css", CSS_STYLE_GZIP, sizeof(CSS_STYLE_GZIP)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); - }); + } + + AsyncWebServerResponse* response = + request->beginResponse_P( + 200, "text/css", CSS_STYLE_GZIP, sizeof( CSS_STYLE_GZIP ) ); + response->addHeader( "Content-Encoding", "gzip" ); + request->send( response ); + } ); server->on( - "/css/normalize.css", HTTP_GET, [](AsyncWebServerRequest *request) { - if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, - ESPUI.basicAuthPassword)) - return request->requestAuthentication(); - AsyncWebServerResponse *response = request->beginResponse_P( - 200, "text/css", CSS_NORMALIZE_GZIP, sizeof(CSS_NORMALIZE_GZIP)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); - }); + "/css/normalize.css", HTTP_GET, []( AsyncWebServerRequest * request ) { + if ( ESPUI.basicAuth && !request->authenticate( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ) ) { + return request->requestAuthentication(); + } + + AsyncWebServerResponse* response = + request->beginResponse_P( + 200, "text/css", CSS_NORMALIZE_GZIP, sizeof( CSS_NORMALIZE_GZIP ) ); + response->addHeader( "Content-Encoding", "gzip" ); + request->send( response ); + } ); // Heap for general Servertest - server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request) { - if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, - ESPUI.basicAuthPassword)) + server->on( "/heap", HTTP_GET, []( AsyncWebServerRequest * request ) { + if ( ESPUI.basicAuth && !request->authenticate( ESPUI.basicAuthUsername, ESPUI.basicAuthPassword ) ) { return request->requestAuthentication(); - request->send(200, "text/plain", - String(ESP.getFreeHeap()) + " In Memorymode"); - }); + } + + request->send( 200, "text/plain", + String( ESP.getFreeHeap() ) + " In Memorymode" ); + } ); server->onNotFound( - [](AsyncWebServerRequest *request) { request->send(404); }); + []( AsyncWebServerRequest * request ) { + request->send( 404 ); + } ); server->begin(); - if (DEBUG_ESPUI) Serial.println("UI Initialized"); -} -ESPUIClass ESPUI; + if ( this->verbosity ) { + Serial.println( "UI Initialized" ); + } +} diff --git a/src/ESPUI.h b/src/ESPUI.h index cb459e7..a2c90ed 100644 --- a/src/ESPUI.h +++ b/src/ESPUI.h @@ -31,42 +31,102 @@ #endif -typedef struct Control { - unsigned int type; - unsigned int id; // just mirroring the id here for practical reasons - const char *label; - void (*callback)(Control, int); - String value; - unsigned int color; -} Control; - // Message Types (and control types) -#define UI_INITIAL_GUI 100 -#define UI_TITEL 0 -#define UI_LABEL 1 -#define UPDATE_LABEL 6 +enum ControlType : uint8_t { + Title = 0, + Button, + Pad, + Cpad, + Label, + Switcher, + Slider, + Number, + Text, + Graph, + GraphPoint, -#define UI_BUTTON 2 + UpdateOffset = 100, + UpdateLabel = 104, + UpdateSwitcher, + UpdateSlider, + UpdateNumber, + UpdateText, + ClearGraph, -#define UI_SWITCHER 3 -#define UPDATE_SWITCHER 7 + InitialGui = 200 +}; -#define UI_PAD 4 -#define UI_CPAD 5 +#define UI_INITIAL_GUI ControlType::InitialGui -#define UI_SLIDER 8 -#define UPDATE_SLIDER 9 +#define UI_TITLE ControlType::Title +#define UI_LABEL ControlType::Label +#define UI_BUTTON ControlType::Button +#define UI_SWITCHER ControlType::Switcher +#define UI_PAD ControlType::Pad +#define UI_CPAD ControlType::Cpad +#define UI_SLIDER ControlType::Slider +#define UI_NUMBER ControlType::Number +#define UI_TEXT_INPUT ControlType::Text +#define UI_GRAPH ControlType::Graph +#define UI_ADD_GRAPH_POINT ControlType::GraphPoint -#define UI_NUMBER 10 -#define UPDATE_NUMBER 11 +#define UPDATE_LABEL ControlType::UpdateLabel +#define UPDATE_SWITCHER ControlType::UpdateSwitcher +#define UPDATE_SLIDER ControlType::UpdateSlider +#define UPDATE_NUMBER ControlType::UpdateNumber +#define UPDATE_TEXT_INPUT ControlType::UpdateText +#define CLEAR_GRAPH ControlType::ClearGraph -#define UI_TEXT_INPUT 12 -#define UPDATE_TEXT_INPUT 13 +// Colors +enum ControlColor : uint8_t { + Turquoise, + Emerald, + Peterriver, + Wetasphalt, + Sunflower, + Carrot, + Alizarin, + Dark, + None = 0xFF +}; +#define COLOR_TURQUOISE ControlColor::Turquoise +#define COLOR_EMERALD ControlColor::Emerald +#define COLOR_PETERRIVER ControlColor::Peterriver +#define COLOR_WETASPHALT ControlColor::Wetasphalt +#define COLOR_SUNFLOWER ControlColor::Sunflower +#define COLOR_CARROT ControlColor::Carrot +#define COLOR_ALIZARIN ControlColor::Alizarin +#define COLOR_DARK ControlColor::Dark +#define COLOR_NONE ControlColor::None + +class Control { + public: + ControlType type; + unsigned int id; // just mirroring the id here for practical reasons + const char* label; + void ( *callback )( Control, int ); + String value; + ControlColor color; + Control* next; + + Control( + ControlType type, const char* label, + void ( *callback )( Control, int ), + String value, ControlColor color ) + : type( type ), label( label ), callback( callback ), value( value ), color( color ), next( nullptr ) { + id = idCounter++; + } + + Control( const Control& control ) + : type( control.type ), id( control.id ), label( control.label ), + callback( control.callback ), value( control.value ), + color( control.color ), next( control.next ) {} + + private: + static uint16_t idCounter; +}; -#define UI_GRAPH 14 -#define CLEAR_GRAPH 15 -#define ADD_GRAPH_POINT 16 // Values #define B_DOWN -1 @@ -90,86 +150,102 @@ typedef struct Control { #define N_VALUE 9 #define T_VALUE 10 -// Colors -#define COLOR_TURQUOISE 0 -#define COLOR_EMERALD 1 -#define COLOR_PETERRIVER 2 -#define COLOR_WETASPHALT 3 -#define COLOR_SUNFLOWER 4 -#define COLOR_CARROT 5 -#define COLOR_ALIZARIN 6 -#define COLOR_NONE 7 +enum Verbosity : uint8_t { + Quiet = 0, + Verbose, + VerboseJSON +}; class ESPUIClass { - public: - void begin(const char *_title); // Setup servers and page in Memorymode - void begin(const char *_title, const char *username, const char *password); + public: + ESPUIClass( Verbosity verbosity = Verbosity::Quiet ) + : verbosity( verbosity ) {} - void beginSPIFFS(const char *_title); // Setup servers and page in SPIFFSmode - void beginSPIFFS(const char *_title, const char *username, - const char *password); +// void begin( const char* _title, bool enableDebug=false ); // Setup servers and page in Memorymode + void begin( const char* _title, const char* username = nullptr, const char* password = nullptr ); - void prepareFileSystem(); // Initially preps the filesystem and loads a lot - // of stuff into SPIFFS - void list(); - // Creating Elements +// void beginSPIFFS( const char* _title, bool enableDebug=false ); // Setup servers and page in SPIFFSmode + void beginSPIFFS( const char* _title, const char* username = nullptr, const char* password = nullptr ); - int button(const char *label, void (*callBack)(Control, int), int color, - String value = ""); // Create Event Button - int switcher(const char *label, bool startState, - void (*callBack)(Control, int), - int color); // Create Toggle Button - int pad(const char *label, bool centerButton, void (*callBack)(Control, int), - int color); // Create Pad Control - int slider(const char *label, void (*callBack)(Control, int), int color, - String value); // Create Slider Control - int number(const char *label, void (*callBack)(Control, int), int color, - int number, int min, int max); // Create a Number Input Control - int text(const char *label, void (*callBack)(Control, int), int color, - String value = ""); // Create a Text Input Control + void prepareFileSystem(); // Initially preps the filesystem and loads a lot + // of stuff into SPIFFS + void list(); + // Creating Elements - // Output only - int label(const char *label, int color, String value = ""); // Create Label - int graph(const char *label, int color); // Create Graph display + int addControl( ControlType type, const char* label, + void ( *callback )( Control, int ), + String value, ControlColor color ); - // Update Elements - void print(int id, String value); - void print(String label, String value); + int button( const char* label, + void ( *callback )( Control, int ), ControlColor color, + String value = "" ); // Create Event Button + int switcher( const char* label, bool startState, + void ( *callback )( Control, int ), + ControlColor color ); // Create Toggle Button + int pad( const char* label, bool centerButton, + void ( *callback )( Control, int ), + ControlColor color ); // Create Pad Control + int slider( const char* label, + void ( *callback )( Control, int ), + ControlColor color, String value ); // Create Slider Control + int number( const char* label, + void ( *callback )( Control, int ), + ControlColor color, int number, int min, int max ); // Create a Number Input Control + int text( const char* label, + void ( *callback )( Control, int ), + ControlColor color, String value = "" ); // Create a Text Input Control - void updateSwitcher(int id, bool nValue, int clientId = -1); - void updateSwitcher(String label, bool nValue, int clientId = -1); + // Output only + int label( const char* label, ControlColor color, String value = "" ); // Create Label + int graph( const char* label, ControlColor color ); // Create Graph display - void updateSlider(int id, int nValue, int clientId = -1); - void updateSlider(String label, int nValue, int clientId = -1); + // Update Elements - void updateNumber(int id, int nValue, int clientId = -1); - void updateNumber(String label, int nValue, int clientId = -1); + Control* getControl( int id ); + Control* getControl( String label ); - void updateText(int id, String nValue, int clientId = -1); - void updateText(String label, String nValue, int clientId = -1); + // Update Elements + void updateControl( int id, String value, int clientId = -1 ); + void updateControl( String label, String value, int clientId = -1 ); + void updateControl( Control* control, String value, int clientId = -1 ); - void clearGraph(int id, int clientId = -1); - void clearGraph(String label, int clientId = -1); + void print( int id, String value ); + void print( String label, String value ); - void addGraphPoint(int id, int nValue, int clientId = -1); - void addGraphPoint(String label, int nValue, int clientId = -1); + void updateSwitcher( int id, bool nValue, int clientId = -1 ); + void updateSwitcher( String label, bool nValue, int clientId = -1 ); - void textThem(String text, int clientId); + void updateSlider( int id, int nValue, int clientId = -1 ); + void updateSlider( String label, int nValue, int clientId = -1 ); - // Variables --- - const char *ui_title = "ESPUI"; // Store UI Title and Header Name - int cIndex = 0; // Control index - Control *controls[25]; - void jsonDom(AsyncWebSocketClient *client); - int getIdByLabel(String label); - bool labelExists(String label); + void updateNumber( int id, int nValue, int clientId = -1 ); + void updateNumber( String label, int nValue, int clientId = -1 ); - private: - const char *basicAuthUsername; - const char *basicAuthPassword; - bool basicAuth = true; - AsyncWebServer *server; - AsyncWebSocket *ws; + void updateText( int id, String nValue, int clientId = -1 ); + void updateText( String label, String nValue, int clientId = -1 ); + + void clearGraph( int id, int clientId = -1 ); + void clearGraph( String label, int clientId = -1 ); + + void addGraphPoint( int id, int nValue, int clientId = -1 ); + void addGraphPoint( String label, int nValue, int clientId = -1 ); + +// void textThem( String text, int clientId = -1 ); + + // Variables --- + const char* ui_title = "ESPUI"; // Store UI Title and Header Name + int cIndex = 0; // Control index + Control* controls = nullptr; + void jsonDom( AsyncWebSocketClient* client ); + + Verbosity verbosity; + + private: + const char* basicAuthUsername = nullptr; + const char* basicAuthPassword = nullptr; + bool basicAuth = true; + AsyncWebServer* server; + AsyncWebSocket* ws; }; extern ESPUIClass ESPUI; diff --git a/src/dataControlsJS.h b/src/dataControlsJS.h index 7fc61b5..7697a40 100644 --- a/src/dataControlsJS.h +++ b/src/dataControlsJS.h @@ -1,5 +1,5 @@ const char JS_CONTROLS[] PROGMEM = R"=====( -const UI_INITIAL_GUI=100;const UI_TITEL=0;const UI_LABEL=1;const UPDATE_LABEL=6;const UI_BUTTON=2;const UI_SWITCHER=3;const UPDATE_SWITCHER=7;const UI_PAD=4;const UI_CPAD=5;const UI_SLIDER=8;const UPDATE_SLIDER=9;const UI_NUMBER=10;const UPDATE_NUMBER=11;const UI_TEXT_INPUT=12;const UPDATE_TEXT_INPUT=13;const UI_GRAPH=14;const CLEAR_GRAPH=15;const ADD_GRAPH_POINT=16;const FOR=0;const BACK=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_NONE=7;const C_DARK=8;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_NONE:return"dark";default:return"";}} +const UI_INITIAL_GUI=200;const UI_TITEL=0;const UI_BUTTON=1;const UI_PAD=2;const UI_CPAD=3;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const FOR=0;const BACK=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_NONE:return"dark";default:return"";}} var websock;var websockConnected=false;function restart(){$(document).add("*").off();$("#row").html("");websock.close();start();} function conStatusError(){websockConnected=false;$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart});} function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}} @@ -143,4 +143,4 @@ function padclick(type,number,isdown){switch(type){case CENTER:if(isdown)websock function switcher(number,state){if(state==null){if($("#s"+number).is(":checked")){websock.send("sactive:"+number);$("#sl"+number).addClass("checked");}else{websock.send("sinactive:"+number);$("#sl"+number).removeClass("checked");}}else if(state==1){$("#sl"+number).addClass("checked");$("#sl"+number).prop("checked",true);}else if(state==0){$("#sl"+number).removeClass("checked");$("#sl"+number).prop("checked",false);}} )====="; -const uint8_t JS_CONTROLS_GZIP[2118] PROGMEM = { 31,139,8,0,29,85,117,92,2,255,213,89,225,114,219,184,17,254,159,167,224,49,55,145,88,59,178,157,52,215,171,104,122,70,145,149,88,141,78,118,101,249,210,233,31,13,68,66,17,199,20,200,130,160,20,215,163,215,232,131,244,145,250,36,93,0,4,8,210,164,101,91,147,206,244,143,68,46,22,31,62,236,46,22,11,208,143,73,202,172,155,225,108,56,30,78,135,189,209,236,243,205,208,59,57,62,118,125,213,48,29,78,7,35,207,16,140,122,31,65,112,162,4,87,231,189,233,32,23,254,82,104,125,188,153,78,47,199,222,187,66,114,253,117,56,237,95,12,38,222,251,114,87,45,255,83,161,123,213,59,247,254,88,188,246,249,251,7,3,106,52,60,135,14,191,86,128,164,244,207,133,222,248,230,183,143,32,57,57,46,43,42,241,137,49,203,193,223,166,96,131,171,155,169,119,242,174,172,109,54,189,47,122,124,158,244,174,46,188,19,197,178,63,26,244,38,74,168,168,246,206,207,165,104,118,117,57,28,67,127,101,160,79,151,19,109,210,143,189,254,23,109,206,209,224,211,84,27,109,50,252,124,49,213,230,234,15,198,83,96,173,7,156,77,111,38,127,189,185,28,94,15,52,84,127,54,248,109,48,233,141,206,53,94,127,118,53,128,94,147,225,239,208,245,157,22,126,29,76,123,215,87,23,189,145,1,63,187,190,25,127,26,93,126,45,141,209,239,77,38,151,83,109,251,254,172,55,26,254,189,55,25,142,181,175,251,179,241,229,120,160,157,215,159,157,247,38,95,192,53,139,140,248,44,140,137,229,199,81,76,251,17,74,211,182,120,28,6,206,125,254,224,141,179,213,28,83,45,119,211,77,200,252,165,161,135,82,108,206,180,75,49,203,40,177,225,231,31,89,28,166,216,118,115,149,124,226,74,1,175,48,69,81,160,155,11,43,40,141,4,51,76,105,184,198,84,43,21,86,81,74,27,204,80,154,44,81,196,180,146,182,146,210,73,51,178,136,226,141,129,35,141,166,218,125,68,105,92,244,87,6,84,205,40,10,255,137,104,72,180,2,55,167,106,12,16,189,181,221,0,47,80,22,49,37,180,221,237,246,213,26,81,107,131,231,105,236,223,186,198,115,63,38,4,251,12,7,222,2,69,41,46,188,64,113,202,16,101,109,231,254,231,118,16,251,217,10,19,230,116,80,16,180,237,63,216,78,39,94,44,218,142,251,115,219,126,77,227,13,188,47,217,42,106,219,182,227,230,184,29,63,138,83,12,42,57,138,187,125,101,56,152,92,51,196,178,116,0,19,165,48,66,3,23,142,174,117,97,12,138,87,241,26,203,200,176,133,203,223,126,163,24,19,219,121,160,10,60,75,122,20,7,53,90,146,180,96,97,29,89,227,216,202,25,112,146,111,94,255,250,203,251,15,110,77,175,98,234,37,41,105,223,251,81,232,223,118,115,203,109,75,115,94,34,18,68,248,247,48,13,231,97,20,178,187,62,8,190,129,125,238,195,69,251,167,234,252,223,188,249,73,153,188,179,12,131,0,19,231,94,251,131,59,83,195,42,31,105,117,152,248,96,13,15,163,48,101,152,192,82,177,215,122,76,95,140,105,31,214,115,57,20,70,215,14,244,8,222,88,95,241,252,26,158,49,107,219,155,180,123,116,100,31,108,66,18,196,155,78,20,251,136,19,232,44,227,148,17,180,194,7,246,209,38,53,220,31,147,56,193,196,83,68,219,120,205,248,42,38,105,28,97,232,253,13,0,165,166,197,245,158,224,193,38,79,51,252,29,216,105,211,21,20,138,104,98,52,195,238,214,160,38,98,243,41,220,132,34,64,86,35,182,132,134,185,236,17,52,46,168,67,224,171,80,186,66,120,172,130,192,91,3,196,144,247,151,235,203,113,39,65,20,86,19,52,116,184,204,17,125,177,167,189,62,143,131,59,33,243,225,13,83,15,150,124,158,25,185,122,135,221,37,56,207,141,229,157,187,43,154,129,27,163,113,148,118,22,49,29,32,232,132,35,204,97,189,51,193,2,114,201,119,201,240,158,171,119,5,161,148,65,10,250,22,46,238,148,178,179,117,141,201,180,117,39,152,169,227,206,41,70,183,174,34,32,42,132,174,38,207,66,22,193,92,56,147,8,205,113,36,92,188,66,33,185,192,40,128,44,153,175,211,66,161,138,39,106,137,110,145,139,80,2,33,5,121,234,52,8,215,224,66,8,34,175,197,54,49,223,88,178,21,73,45,72,176,129,197,164,169,44,251,224,149,177,225,228,246,128,119,231,224,149,221,58,59,93,126,176,194,192,107,129,150,104,10,3,33,86,175,130,14,72,78,143,150,31,64,23,178,200,217,105,154,32,34,250,68,229,78,138,137,232,99,137,223,183,27,138,146,2,109,141,162,12,11,52,142,113,118,122,4,252,207,236,234,108,101,161,180,99,186,16,149,47,156,110,227,220,96,106,243,140,49,72,58,49,89,197,89,138,33,15,16,175,37,101,34,243,181,75,19,62,180,248,186,115,90,74,61,75,30,85,150,217,167,245,152,181,11,251,72,156,194,66,220,24,246,65,222,71,230,98,22,103,254,82,164,199,110,177,176,156,123,220,73,40,230,113,121,46,247,72,88,137,38,169,28,226,80,80,135,76,219,12,13,38,127,9,112,158,100,183,15,22,133,170,106,187,124,201,9,219,123,246,169,140,21,110,146,52,210,36,14,138,88,146,139,220,2,54,144,164,3,176,148,72,2,33,73,50,230,149,226,33,36,224,92,33,183,120,50,240,90,162,203,60,254,46,13,158,86,66,53,38,125,206,90,13,192,183,145,146,183,72,22,69,224,171,124,92,229,7,23,246,178,194,81,158,103,31,219,206,253,243,166,194,167,240,63,163,175,121,111,95,53,172,166,135,193,248,67,23,24,180,228,66,49,87,209,38,4,188,197,110,200,7,252,172,211,85,121,255,20,41,130,144,212,23,33,93,181,202,171,53,65,129,140,71,121,56,56,180,118,46,217,93,61,212,186,93,82,188,240,90,175,165,67,18,191,178,132,47,191,156,30,161,51,91,147,230,156,127,84,194,126,220,192,246,41,65,107,195,72,124,231,107,201,134,44,183,115,20,158,129,29,235,237,6,7,177,231,24,173,78,189,222,98,139,138,197,254,243,175,127,115,147,65,0,132,187,89,137,131,223,115,120,213,119,168,103,70,247,97,198,207,167,207,33,86,171,95,207,43,218,135,23,63,68,63,135,87,173,126,61,175,249,46,94,71,50,208,100,60,11,1,132,100,121,137,243,181,193,67,226,133,91,90,41,254,234,247,180,122,244,39,236,106,181,216,198,182,38,192,163,253,169,139,72,104,224,30,237,203,189,4,94,37,79,247,39,47,215,87,3,123,186,47,251,50,122,149,254,124,127,250,34,218,27,216,207,247,101,95,2,175,146,247,247,39,159,111,84,13,244,253,125,233,87,224,27,10,58,227,150,83,108,116,102,196,22,199,25,81,40,213,117,212,213,96,77,73,165,139,26,69,225,216,113,49,144,176,30,52,156,60,40,50,197,141,231,75,119,94,254,242,54,141,194,96,231,46,44,114,217,179,143,78,162,151,42,187,210,134,227,19,189,93,105,18,242,239,109,16,166,62,197,12,171,247,39,112,51,107,73,202,111,63,90,214,42,132,253,225,24,254,209,119,175,117,114,12,79,210,230,173,234,241,163,101,166,234,106,210,174,152,21,136,133,9,3,53,155,243,158,137,161,174,5,203,118,235,117,185,16,118,92,208,130,163,95,222,163,54,42,164,251,228,52,103,252,50,172,205,199,52,112,156,195,130,234,161,13,179,176,85,128,150,3,65,222,104,255,152,18,108,15,231,75,183,164,236,46,226,53,62,135,236,206,35,228,223,186,114,107,37,217,170,18,20,210,131,68,220,10,55,59,12,118,116,121,247,165,84,229,91,249,84,0,251,248,81,115,157,109,126,8,16,102,19,92,244,146,134,161,26,87,180,249,177,224,255,205,226,252,118,173,98,242,39,24,153,247,122,169,137,43,182,146,4,118,216,89,221,119,171,91,55,113,35,215,182,111,200,45,129,170,79,4,137,21,83,75,100,116,61,232,214,188,195,91,225,52,69,64,221,184,194,50,111,111,75,81,35,95,228,13,29,208,240,116,52,228,13,130,100,113,19,154,10,47,19,65,184,107,31,192,255,129,221,213,202,174,121,83,8,109,165,75,99,195,142,117,131,74,219,60,54,42,123,201,168,230,181,133,212,63,12,83,94,62,139,203,234,252,177,60,206,156,203,12,120,177,29,85,84,178,196,80,48,134,211,27,43,119,211,97,101,192,252,22,211,184,192,148,219,111,183,137,73,226,239,166,146,248,37,46,70,12,66,73,219,140,188,120,2,242,162,9,153,23,61,205,208,79,176,95,50,111,130,230,181,108,51,116,244,4,232,168,9,90,20,154,205,216,244,9,216,180,6,187,244,5,67,21,45,185,231,161,214,99,88,68,154,120,242,60,113,89,195,223,197,86,87,196,123,152,182,237,110,126,3,101,59,250,35,82,62,110,138,0,126,141,141,161,213,78,169,250,27,31,24,20,136,187,229,51,168,34,133,100,39,86,249,203,84,1,39,240,172,98,46,39,252,107,218,110,26,85,157,132,198,73,209,174,42,218,10,246,241,67,236,6,90,59,224,117,69,251,95,108,56,37,174,236,31,0,0 }; +const uint8_t JS_CONTROLS_GZIP[2133] PROGMEM = { 31,139,8,0,198,31,124,92,2,255,213,89,109,114,219,56,18,253,239,83,112,152,169,72,92,59,178,148,25,103,50,162,233,42,69,86,98,109,52,178,71,150,39,91,251,71,5,145,80,196,50,5,114,65,80,138,215,165,107,236,65,230,72,115,146,109,0,4,248,97,210,178,173,202,86,237,31,155,108,52,30,30,94,55,26,32,228,134,36,102,198,205,112,54,28,15,167,195,222,104,246,233,102,232,188,109,183,109,87,53,76,135,211,193,200,201,25,62,220,76,167,151,99,167,147,89,174,122,231,206,219,236,181,207,223,127,202,222,71,189,15,128,240,179,50,92,157,247,166,131,212,216,105,255,156,249,93,127,25,78,251,23,131,137,115,82,116,213,246,78,251,36,231,61,26,158,131,237,93,201,87,90,59,237,119,153,231,248,230,183,15,96,251,165,232,153,90,59,237,95,114,115,29,252,99,10,74,92,221,76,157,247,69,239,92,75,167,253,62,235,241,105,210,187,186,112,126,77,13,189,243,115,105,153,93,93,14,199,220,53,109,232,143,6,189,73,234,220,105,43,247,143,151,19,45,236,135,94,255,179,214,116,52,248,56,213,138,78,134,159,46,166,90,207,254,96,60,5,218,74,182,254,108,122,51,249,253,230,114,120,61,208,80,253,217,224,183,193,164,55,58,215,120,253,217,213,0,122,77,134,127,64,215,183,218,248,101,48,237,93,95,93,244,70,57,248,217,245,205,248,227,232,242,75,97,140,126,111,50,185,156,234,184,244,103,189,209,240,159,189,201,112,172,229,239,207,206,123,147,207,90,227,254,108,124,57,30,56,111,79,78,236,69,66,92,230,135,196,112,195,32,164,253,0,197,113,83,60,14,61,235,62,125,112,198,201,106,142,169,182,219,241,198,103,238,50,231,135,98,156,159,107,151,98,150,80,98,194,159,127,37,161,31,99,211,78,93,210,169,43,7,188,194,20,5,158,110,206,116,80,30,17,102,152,82,127,141,169,118,202,116,81,78,27,204,80,28,45,81,192,180,147,214,73,249,196,9,89,4,225,38,135,35,101,83,237,46,162,52,204,250,43,9,85,51,10,252,127,35,234,19,237,192,21,84,141,30,162,183,166,237,225,5,74,2,166,140,166,189,221,30,172,17,53,54,120,30,135,238,173,157,123,238,135,132,96,151,97,207,89,160,32,198,89,20,40,142,25,162,172,105,221,255,216,244,66,55,89,97,194,172,22,242,188,166,249,55,211,106,133,139,69,211,178,127,108,154,175,104,184,129,247,37,91,5,77,211,180,236,20,183,229,6,97,140,193,37,69,177,183,7,185,0,147,107,134,88,18,15,96,162,20,70,168,225,194,209,181,47,140,65,241,42,92,99,153,25,166,8,249,155,175,20,99,98,90,15,92,129,103,193,143,98,175,194,75,146,22,44,140,99,99,28,26,41,3,78,242,245,171,247,239,126,58,177,43,122,101,83,47,88,73,243,222,13,124,247,182,155,42,183,45,204,121,137,136,23,224,63,252,216,159,251,129,207,238,250,96,248,10,250,220,251,139,230,15,229,249,191,126,253,131,146,188,181,244,61,15,19,235,94,199,131,7,83,195,170,24,105,119,152,248,96,13,15,35,63,102,152,192,82,49,215,122,76,87,140,105,30,85,115,57,18,162,235,0,58,4,111,140,47,120,126,13,207,152,53,205,77,220,61,62,54,15,55,62,241,194,77,43,8,93,196,9,180,150,97,204,8,90,225,67,243,120,19,231,194,31,146,48,194,196,81,68,155,120,205,248,42,38,113,24,96,232,253,21,0,165,167,193,253,158,16,193,186,72,51,252,13,216,105,233,50,10,89,54,49,154,96,123,155,163,38,114,243,41,220,132,35,64,150,51,182,128,134,185,237,17,52,110,168,66,224,171,80,134,66,68,172,132,192,91,61,196,144,243,247,235,203,113,43,66,20,86,19,52,180,184,205,18,125,177,163,163,62,15,189,59,97,115,225,13,83,7,150,124,90,25,185,123,139,221,69,56,173,141,197,29,188,43,154,129,27,163,97,16,183,22,33,29,32,232,132,3,204,97,157,51,193,2,106,201,55,201,240,158,187,119,5,161,152,65,9,250,234,47,238,148,179,181,181,115,147,105,234,78,48,83,203,158,83,140,110,109,69,64,156,20,186,154,60,243,89,0,115,225,76,2,52,199,129,8,241,10,249,228,2,35,15,170,100,186,78,51,135,50,158,56,34,116,179,90,132,34,72,41,168,83,167,158,191,134,16,66,18,57,13,182,9,249,198,146,172,72,108,64,129,245,12,38,165,50,204,195,131,220,134,147,234,1,239,214,225,129,217,56,59,93,158,24,190,231,52,192,75,52,249,158,48,171,87,65,7,44,167,199,203,19,240,133,42,114,118,26,71,136,136,62,65,177,147,98,34,250,24,226,239,155,13,69,81,134,182,70,65,130,5,26,199,56,59,61,6,254,103,102,121,182,242,88,181,99,186,144,149,47,156,110,237,220,96,106,243,132,49,40,58,33,89,133,73,140,161,14,16,167,33,109,162,242,53,11,19,62,50,248,186,179,26,202,61,137,30,117,150,213,167,241,152,218,153,62,18,39,83,136,139,97,30,166,125,100,45,102,97,226,46,69,121,236,102,11,203,186,199,173,136,98,158,151,231,114,143,132,149,152,39,149,66,28,9,234,80,105,235,161,65,242,151,0,167,69,118,251,96,81,168,195,107,151,47,57,161,189,99,158,202,92,225,146,196,129,38,113,152,229,146,92,228,6,176,129,34,237,129,82,162,8,248,36,74,152,83,200,7,159,64,112,133,221,224,197,192,105,136,46,243,240,155,20,60,46,165,106,72,250,156,181,26,128,111,35,133,104,145,36,8,32,86,233,184,42,14,54,236,101,89,160,28,199,108,155,214,253,243,166,194,167,240,63,163,175,121,111,15,106,86,211,195,100,252,174,11,12,90,82,163,152,171,104,19,6,222,98,214,212,3,254,21,213,85,117,255,20,41,130,80,212,23,62,93,53,138,171,53,66,158,204,71,249,121,112,100,236,92,178,187,122,168,117,187,164,120,225,52,94,201,128,68,110,105,9,95,126,62,61,70,103,166,38,205,57,127,175,130,253,184,192,230,41,65,235,156,72,124,231,107,200,134,36,213,57,240,207,64,199,106,221,224,83,236,57,162,85,185,87,43,182,40,41,246,215,127,254,228,146,65,2,248,187,89,137,79,191,231,240,170,238,80,205,140,238,195,140,127,161,62,135,88,165,127,53,175,96,31,94,252,51,250,57,188,42,253,171,121,205,119,241,58,150,137,38,243,89,24,32,37,139,75,156,175,13,158,18,47,220,210,10,249,87,189,167,85,163,63,97,87,171,196,206,109,107,2,60,216,159,186,200,132,26,238,193,190,220,11,224,101,242,116,127,242,114,125,213,176,167,251,178,47,162,151,233,207,247,167,47,178,189,134,253,124,95,246,5,240,50,121,119,127,242,233,70,85,67,223,221,151,126,9,190,230,64,151,187,188,20,27,93,62,99,179,207,25,113,80,170,234,168,79,131,21,71,42,125,168,81,20,218,150,141,129,132,241,160,161,243,224,144,41,110,61,95,186,243,242,151,55,113,224,123,59,119,97,81,203,158,253,233,36,122,169,99,87,92,243,249,68,111,87,154,132,252,247,198,243,99,151,98,134,213,251,19,184,229,207,146,148,223,126,52,140,149,15,251,67,27,254,163,111,78,163,211,134,39,169,121,163,252,249,209,200,151,234,114,209,46,201,10,196,252,136,129,155,201,121,207,196,80,215,130,101,179,241,170,120,16,182,108,240,130,79,191,180,71,101,86,200,240,201,105,206,248,101,88,147,143,153,195,177,142,50,170,71,38,204,194,84,9,90,76,4,121,169,253,125,142,96,123,4,95,134,37,102,119,1,63,227,115,200,238,60,64,238,173,45,183,86,146,172,74,73,33,35,72,196,173,112,125,192,96,71,151,119,95,202,85,190,21,191,10,96,31,63,174,63,103,231,127,11,16,178,9,46,122,73,195,80,181,43,58,255,115,193,255,155,226,252,118,173,36,249,19,68,230,189,94,42,113,73,43,73,96,135,206,234,190,91,221,186,137,27,185,166,121,67,110,9,156,250,68,146,24,33,53,68,69,215,131,110,243,119,120,43,28,199,8,168,231,174,176,242,183,183,133,172,145,47,242,134,14,104,56,58,27,210,6,65,50,187,9,141,69,148,137,32,220,53,15,225,255,161,217,213,206,118,254,166,16,218,10,151,198,57,29,171,6,149,218,60,54,42,123,201,168,249,107,11,233,127,228,199,252,248,44,46,171,211,199,226,56,115,110,203,193,139,237,168,228,146,68,57,135,220,112,122,99,229,97,58,42,13,152,222,98,230,46,48,229,246,219,173,99,18,185,187,169,68,110,129,75,46,7,225,72,91,143,188,120,2,242,162,14,153,31,122,234,161,159,160,95,52,175,131,230,103,217,122,232,224,9,208,65,29,180,56,104,214,99,211,39,96,211,10,236,194,47,24,234,208,146,70,30,206,122,12,139,76,19,79,142,35,46,107,248,187,216,234,178,124,247,227,166,217,77,111,160,76,75,255,136,148,142,27,35,128,95,227,220,208,106,167,84,253,115,63,48,40,16,123,203,103,80,70,242,201,78,172,226,47,83,25,156,192,51,178,185,116,248,175,105,187,105,148,125,34,26,70,89,187,58,209,150,176,219,15,177,107,104,237,128,215,39,218,255,2,112,11,124,138,244,31,0,0 }; diff --git a/src/dataIndexHTML.h b/src/dataIndexHTML.h index e42a5e0..b72eb41 100644 --- a/src/dataIndexHTML.h +++ b/src/dataIndexHTML.h @@ -2,4 +2,4 @@ const char HTML_INDEX[] PROGMEM = R"=====( Control

Control
Offline


)====="; -const uint8_t HTML_INDEX_GZIP[863] PROGMEM = { 31,139,8,0,56,43,252,91,2,255,133,84,109,115,170,56,20,254,43,172,159,118,231,222,22,17,107,219,123,197,153,160,96,171,34,2,130,226,183,0,169,4,195,75,73,16,245,215,111,34,189,179,187,179,51,187,204,36,231,237,57,207,57,132,112,198,191,205,236,233,54,220,24,82,202,114,50,25,223,119,105,156,34,152,76,198,57,98,80,138,83,88,83,196,180,134,125,60,188,76,198,12,51,130,38,211,178,96,117,73,198,114,103,118,200,2,230,72,59,99,212,86,101,205,164,152,67,80,193,180,94,139,19,150,106,9,58,227,24,61,220,141,239,18,46,48,195,144,60,208,24,18,164,41,189,201,152,224,226,36,213,136,104,61,154,242,244,184,97,18,230,20,61,41,173,209,135,150,64,6,127,224,28,30,145,92,21,199,159,17,164,104,52,252,142,3,221,118,219,254,114,126,44,1,127,214,158,159,26,254,145,107,186,48,129,51,5,150,144,229,202,121,221,10,69,159,39,250,214,55,0,88,205,55,83,249,146,234,14,119,78,245,204,51,23,107,30,29,45,120,238,241,157,59,55,130,111,10,70,124,79,68,166,93,9,214,81,206,55,83,157,198,13,49,94,4,223,198,212,173,192,240,239,88,37,216,185,3,229,211,25,16,236,170,230,167,88,158,26,52,174,26,112,189,147,246,64,201,189,129,210,120,247,24,95,92,95,12,230,75,135,231,113,60,199,152,162,174,46,171,243,230,89,240,27,133,235,109,137,5,244,18,168,167,141,222,222,94,240,211,242,134,203,203,113,184,14,98,95,109,140,197,219,253,77,119,139,149,219,119,0,6,126,226,221,29,164,245,76,114,19,103,162,180,0,204,146,88,119,48,142,208,61,150,244,61,95,49,245,111,134,105,164,177,97,125,123,171,194,86,28,132,30,122,190,171,7,122,182,77,67,121,49,163,224,56,53,60,54,36,213,94,62,191,102,43,231,176,24,125,154,175,76,61,165,224,154,41,151,189,191,140,156,161,30,148,237,172,253,180,195,163,113,57,157,118,67,28,142,200,6,154,253,145,251,105,189,132,239,204,110,220,200,130,183,209,37,139,104,67,103,96,39,39,117,69,244,227,240,57,219,140,94,71,241,222,120,137,54,64,65,254,12,45,7,162,187,197,222,53,119,111,238,41,220,187,196,206,215,215,195,206,236,31,28,112,181,102,134,186,218,2,101,181,53,134,193,236,253,102,103,160,111,103,254,101,121,3,87,174,183,23,227,233,21,181,226,83,4,125,55,72,251,135,57,207,219,86,44,26,184,213,161,56,1,43,3,151,245,181,223,174,189,254,197,54,157,171,117,43,219,245,172,84,44,143,182,86,86,182,214,202,223,94,226,88,180,112,72,140,32,76,204,245,249,80,184,106,184,95,16,240,150,168,201,245,169,138,114,118,11,7,102,123,240,158,206,113,142,162,231,172,133,247,35,53,136,185,61,121,141,147,79,167,127,187,201,148,93,9,162,41,66,172,187,196,114,76,169,92,148,117,14,9,190,161,71,110,253,31,248,238,236,128,52,174,113,197,36,90,199,154,156,81,249,134,42,86,62,230,184,120,204,120,80,238,162,255,66,81,130,19,84,255,39,36,238,254,100,250,79,144,124,31,0,210,56,42,147,171,84,22,164,132,137,150,193,51,236,226,63,40,131,53,251,253,143,159,28,145,224,179,152,23,195,137,208,36,156,104,57,196,197,27,207,70,245,95,83,162,3,209,10,22,2,193,75,122,12,178,134,74,49,129,148,106,4,70,136,76,236,143,15,126,24,136,247,192,97,162,3,78,249,149,152,214,93,161,47,188,104,153,23,65,191,188,156,178,46,219,175,96,79,168,205,195,71,67,72,55,108,122,28,245,197,243,75,136,183,18,178,27,118,127,2,173,245,31,70,3,5,0,0 }; +const uint8_t HTML_INDEX_GZIP[863] PROGMEM = { 31,139,8,0,198,31,124,92,2,255,133,84,109,115,170,56,20,254,43,172,159,118,231,222,22,17,107,219,123,197,153,160,96,171,34,2,130,226,183,0,169,4,195,75,73,16,245,215,111,34,189,179,187,179,51,187,204,36,231,237,57,207,57,132,112,198,191,205,236,233,54,220,24,82,202,114,50,25,223,119,105,156,34,152,76,198,57,98,80,138,83,88,83,196,180,134,125,60,188,76,198,12,51,130,38,211,178,96,117,73,198,114,103,118,200,2,230,72,59,99,212,86,101,205,164,152,67,80,193,180,94,139,19,150,106,9,58,227,24,61,220,141,239,18,46,48,195,144,60,208,24,18,164,41,189,201,152,224,226,36,213,136,104,61,154,242,244,184,97,18,230,20,61,41,173,209,135,150,64,6,127,224,28,30,145,92,21,199,159,17,164,104,52,252,142,3,221,118,219,254,114,126,44,1,127,214,158,159,26,254,145,107,186,48,129,51,5,150,144,229,202,121,221,10,69,159,39,250,214,55,0,88,205,55,83,249,146,234,14,119,78,245,204,51,23,107,30,29,45,120,238,241,157,59,55,130,111,10,70,124,79,68,166,93,9,214,81,206,55,83,157,198,13,49,94,4,223,198,212,173,192,240,239,88,37,216,185,3,229,211,25,16,236,170,230,167,88,158,26,52,174,26,112,189,147,246,64,201,189,129,210,120,247,24,95,92,95,12,230,75,135,231,113,60,199,152,162,174,46,171,243,230,89,240,27,133,235,109,137,5,244,18,168,167,141,222,222,94,240,211,242,134,203,203,113,184,14,98,95,109,140,197,219,253,77,119,139,149,219,119,0,6,126,226,221,29,164,245,76,114,19,103,162,180,0,204,146,88,119,48,142,208,61,150,244,61,95,49,245,111,134,105,164,177,97,125,123,171,194,86,28,132,30,122,190,171,7,122,182,77,67,121,49,163,224,56,53,60,54,36,213,94,62,191,102,43,231,176,24,125,154,175,76,61,165,224,154,41,151,189,191,140,156,161,30,148,237,172,253,180,195,163,113,57,157,118,67,28,142,200,6,154,253,145,251,105,189,132,239,204,110,220,200,130,183,209,37,139,104,67,103,96,39,39,117,69,244,227,240,57,219,140,94,71,241,222,120,137,54,64,65,254,12,45,7,162,187,197,222,53,119,111,238,41,220,187,196,206,215,215,195,206,236,31,28,112,181,102,134,186,218,2,101,181,53,134,193,236,253,102,103,160,111,103,254,101,121,3,87,174,183,23,227,233,21,181,226,83,4,125,55,72,251,135,57,207,219,86,44,26,184,213,161,56,1,43,3,151,245,181,223,174,189,254,197,54,157,171,117,43,219,245,172,84,44,143,182,86,86,182,214,202,223,94,226,88,180,112,72,140,32,76,204,245,249,80,184,106,184,95,16,240,150,168,201,245,169,138,114,118,11,7,102,123,240,158,206,113,142,162,231,172,133,247,35,53,136,185,61,121,141,147,79,167,127,187,201,148,93,9,162,41,66,172,187,196,114,76,169,92,148,117,14,9,190,161,71,110,253,31,248,238,236,128,52,174,113,197,36,90,199,154,156,81,249,134,42,86,62,230,184,120,204,120,80,238,162,255,66,81,130,19,84,255,39,36,238,254,100,250,79,144,124,31,0,210,56,42,147,171,84,22,164,132,137,150,193,51,236,226,63,40,131,53,251,253,143,159,28,145,224,179,152,23,195,137,208,36,156,104,57,196,197,27,207,70,245,95,83,162,3,209,10,22,2,193,75,122,12,178,134,74,49,129,148,106,4,70,136,76,236,143,15,126,24,136,247,192,97,162,3,78,249,149,152,214,93,161,47,188,104,153,23,65,191,188,156,178,46,219,175,96,79,168,205,195,71,67,72,55,108,122,28,245,197,243,75,136,183,18,178,27,118,127,2,173,245,31,70,3,5,0,0 }; diff --git a/src/dataNormalizeCSS.h b/src/dataNormalizeCSS.h index 4e6223d..da81132 100644 --- a/src/dataNormalizeCSS.h +++ b/src/dataNormalizeCSS.h @@ -2,4 +2,4 @@ const char CSS_NORMALIZE[] PROGMEM = R"=====( html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} )====="; -const uint8_t CSS_NORMALIZE_GZIP[861] PROGMEM = { 31,139,8,0,56,43,252,91,2,255,149,84,237,142,155,58,16,125,149,104,171,74,183,146,137,216,237,199,94,25,221,39,137,242,99,176,7,112,227,47,217,38,155,20,241,238,119,12,132,36,219,108,165,254,2,6,123,230,204,57,103,166,75,70,15,141,179,169,104,192,40,125,230,17,108,44,34,6,213,84,133,137,69,194,83,42,162,250,133,5,200,159,125,76,252,185,44,63,87,197,27,214,7,149,30,255,29,107,39,207,131,129,208,42,203,203,17,66,82,66,35,131,168,36,50,137,9,148,142,172,81,173,0,159,148,179,249,181,15,200,26,231,18,6,214,33,200,252,104,131,235,61,51,160,44,51,104,123,102,225,200,34,138,233,70,236,13,165,63,15,82,69,175,225,204,107,237,196,97,132,94,42,199,4,216,35,68,230,131,107,3,198,200,142,84,213,173,39,149,213,202,98,49,93,168,142,152,161,129,46,64,171,214,242,26,34,230,191,115,34,110,93,250,103,39,136,153,224,116,220,127,89,83,88,103,177,234,80,181,93,162,238,118,157,146,18,237,158,37,52,244,59,225,221,185,17,134,26,196,33,247,98,101,33,156,118,129,167,64,12,123,8,104,211,8,28,168,163,35,145,195,59,71,112,6,215,167,12,33,211,86,215,97,151,84,210,184,31,106,23,136,147,162,118,41,57,195,159,253,105,35,233,21,229,88,179,72,240,108,59,43,248,54,131,170,157,150,163,108,236,28,140,233,172,145,171,68,61,138,177,123,94,130,36,25,127,65,83,45,42,109,127,188,162,217,148,35,125,30,110,16,243,79,77,83,86,51,236,79,101,89,142,209,128,214,55,41,254,37,181,99,79,40,122,127,19,125,253,254,185,154,104,190,176,84,121,23,85,86,142,7,36,142,168,225,15,185,207,153,146,243,188,216,126,71,147,115,15,75,215,197,246,37,71,148,105,23,58,136,163,120,108,39,153,120,32,239,124,25,50,131,141,118,111,124,214,100,156,141,117,113,226,51,117,248,173,244,167,177,11,67,97,220,47,162,243,148,241,42,219,242,44,51,233,145,67,213,7,225,85,113,79,41,215,74,208,39,55,10,71,198,62,212,146,76,135,44,130,241,119,3,101,156,117,164,183,64,182,190,85,87,174,8,213,88,247,212,161,101,202,250,62,49,231,211,108,125,34,132,236,206,242,136,145,89,96,152,101,80,182,163,217,76,83,134,245,99,157,181,57,211,21,222,81,69,85,107,188,84,152,83,14,211,212,78,54,108,92,48,179,81,151,19,29,173,131,205,4,100,151,206,30,255,123,154,227,79,123,118,27,164,193,194,244,46,70,82,25,69,193,225,178,27,192,123,4,42,34,144,207,73,42,209,135,72,45,120,167,136,214,176,148,220,209,188,0,97,148,251,219,226,107,112,88,46,73,108,160,215,105,185,196,249,164,96,227,68,31,11,101,45,45,140,233,222,239,241,213,44,149,7,41,179,168,229,56,29,29,110,29,106,137,7,208,227,109,63,162,67,113,32,225,223,183,14,180,27,158,242,72,174,46,89,167,243,244,190,198,114,199,246,166,198,240,180,39,116,11,55,19,180,34,122,101,139,91,241,63,60,79,107,225,254,252,176,0,159,252,119,39,3,113,46,186,199,50,100,221,27,133,90,86,127,242,255,229,226,95,141,199,67,12,87,252,115,164,16,25,134,126,212,242,135,87,36,10,23,32,239,142,71,29,77,214,157,90,34,67,94,164,206,251,49,58,173,228,38,42,77,147,176,142,199,230,197,95,37,218,126,165,117,178,217,254,120,153,30,175,121,183,104,108,209,202,71,142,89,135,240,126,240,47,179,250,251,250,77,217,189,151,189,77,147,171,193,71,228,151,151,106,249,145,151,193,82,64,178,212,13,215,130,255,3,4,241,118,208,151,7,0,0 }; +const uint8_t CSS_NORMALIZE_GZIP[861] PROGMEM = { 31,139,8,0,198,31,124,92,2,255,149,84,237,142,155,58,16,125,149,104,171,74,183,146,137,216,237,199,94,25,221,39,137,242,99,176,7,112,227,47,217,38,155,20,241,238,119,12,132,36,219,108,165,254,2,6,123,230,204,57,103,166,75,70,15,141,179,169,104,192,40,125,230,17,108,44,34,6,213,84,133,137,69,194,83,42,162,250,133,5,200,159,125,76,252,185,44,63,87,197,27,214,7,149,30,255,29,107,39,207,131,129,208,42,203,203,17,66,82,66,35,131,168,36,50,137,9,148,142,172,81,173,0,159,148,179,249,181,15,200,26,231,18,6,214,33,200,252,104,131,235,61,51,160,44,51,104,123,102,225,200,34,138,233,70,236,13,165,63,15,82,69,175,225,204,107,237,196,97,132,94,42,199,4,216,35,68,230,131,107,3,198,200,142,84,213,173,39,149,213,202,98,49,93,168,142,152,161,129,46,64,171,214,242,26,34,230,191,115,34,110,93,250,103,39,136,153,224,116,220,127,89,83,88,103,177,234,80,181,93,162,238,118,157,146,18,237,158,37,52,244,59,225,221,185,17,134,26,196,33,247,98,101,33,156,118,129,167,64,12,123,8,104,211,8,28,168,163,35,145,195,59,71,112,6,215,167,12,33,211,86,215,97,151,84,210,184,31,106,23,136,147,162,118,41,57,195,159,253,105,35,233,21,229,88,179,72,240,108,59,43,248,54,131,170,157,150,163,108,236,28,140,233,172,145,171,68,61,138,177,123,94,130,36,25,127,65,83,45,42,109,127,188,162,217,148,35,125,30,110,16,243,79,77,83,86,51,236,79,101,89,142,209,128,214,55,41,254,37,181,99,79,40,122,127,19,125,253,254,185,154,104,190,176,84,121,23,85,86,142,7,36,142,168,225,15,185,207,153,146,243,188,216,126,71,147,115,15,75,215,197,246,37,71,148,105,23,58,136,163,120,108,39,153,120,32,239,124,25,50,131,141,118,111,124,214,100,156,141,117,113,226,51,117,248,173,244,167,177,11,67,97,220,47,162,243,148,241,42,219,242,44,51,233,145,67,213,7,225,85,113,79,41,215,74,208,39,55,10,71,198,62,212,146,76,135,44,130,241,119,3,101,156,117,164,183,64,182,190,85,87,174,8,213,88,247,212,161,101,202,250,62,49,231,211,108,125,34,132,236,206,242,136,145,89,96,152,101,80,182,163,217,76,83,134,245,99,157,181,57,211,21,222,81,69,85,107,188,84,152,83,14,211,212,78,54,108,92,48,179,81,151,19,29,173,131,205,4,100,151,206,30,255,123,154,227,79,123,118,27,164,193,194,244,46,70,82,25,69,193,225,178,27,192,123,4,42,34,144,207,73,42,209,135,72,45,120,167,136,214,176,148,220,209,188,0,97,148,251,219,226,107,112,88,46,73,108,160,215,105,185,196,249,164,96,227,68,31,11,101,45,45,140,233,222,239,241,213,44,149,7,41,179,168,229,56,29,29,110,29,106,137,7,208,227,109,63,162,67,113,32,225,223,183,14,180,27,158,242,72,174,46,89,167,243,244,190,198,114,199,246,166,198,240,180,39,116,11,55,19,180,34,122,101,139,91,241,63,60,79,107,225,254,252,176,0,159,252,119,39,3,113,46,186,199,50,100,221,27,133,90,86,127,242,255,229,226,95,141,199,67,12,87,252,115,164,16,25,134,126,212,242,135,87,36,10,23,32,239,142,71,29,77,214,157,90,34,67,94,164,206,251,49,58,173,228,38,42,77,147,176,142,199,230,197,95,37,218,126,165,117,178,217,254,120,153,30,175,121,183,104,108,209,202,71,142,89,135,240,126,240,47,179,250,251,250,77,217,189,151,189,77,147,171,193,71,228,151,151,106,249,145,151,193,82,64,178,212,13,215,130,255,3,4,241,118,208,151,7,0,0 }; diff --git a/src/dataSliderJS.h b/src/dataSliderJS.h index 810e18f..2791f31 100644 --- a/src/dataSliderJS.h +++ b/src/dataSliderJS.h @@ -11,4 +11,4 @@ var upFu=function(e){$(this).off(handlers);};var handlers={mouseup:upFu,touchend function slider_move(parents,newW,sliderW,send){var slider_new_val=parseInt(Math.round(newW/sliderW*100));var slider_fill=parents.find('.slider-fill');var slider_handle=parents.find('.slider-handle');var range=parents.find('input[type="range"]');slider_fill.css('width',slider_new_val+'%');slider_handle.css({'left':slider_new_val+'%','transition':'none','-webkit-transition':'none','-moz-transition':'none'});range.val(slider_new_val);if(parents.find('.slider-handle span').text()!=slider_new_val){parents.find('.slider-handle span').text(slider_new_val);var number=parents.attr('id').substring(2);if(send)websock.send('slvalue:'+slider_new_val+':'+number);}} )====="; -const uint8_t JS_SLIDER_GZIP[865] PROGMEM = { 31,139,8,0,56,43,252,91,2,255,237,86,207,111,155,48,20,190,247,175,72,163,174,134,149,184,89,143,33,238,101,211,164,29,118,218,164,77,170,170,200,1,83,172,16,131,176,73,182,209,252,239,123,254,1,1,66,170,110,167,29,118,194,246,251,252,252,222,247,62,243,156,84,34,82,60,23,147,114,179,141,87,37,21,79,236,75,198,99,86,122,146,101,44,82,121,233,215,59,90,78,96,150,4,210,88,86,123,30,171,180,153,228,73,34,153,10,162,170,20,202,173,125,224,50,42,153,98,129,113,231,22,67,237,129,92,29,221,134,93,111,68,91,177,25,122,173,197,186,182,38,59,246,124,156,177,68,133,253,115,12,98,176,134,25,141,82,47,113,217,121,60,216,249,181,137,17,66,80,41,151,126,104,102,152,22,5,19,177,215,223,188,82,219,34,131,195,252,208,100,64,44,52,225,0,68,92,20,149,122,80,63,11,70,166,198,58,125,68,77,196,61,32,182,107,173,113,149,240,44,35,118,220,135,204,180,229,136,75,169,136,51,54,142,180,182,35,54,163,107,118,198,169,49,1,82,87,207,4,186,218,209,140,20,180,148,236,147,80,158,89,194,176,164,211,236,68,136,35,41,61,100,42,129,130,118,223,13,122,51,12,208,2,117,57,206,225,76,4,46,42,89,80,129,124,172,216,15,119,180,70,251,225,193,15,109,121,133,135,182,121,37,89,156,239,197,68,229,85,148,74,69,75,112,61,76,61,104,107,202,252,154,39,30,195,235,74,169,92,16,66,238,252,26,170,7,37,152,36,52,147,44,60,92,232,220,33,99,38,148,108,234,142,221,28,136,210,146,159,181,85,50,42,239,74,210,1,91,85,118,0,78,153,13,162,47,78,141,139,82,22,109,236,117,106,81,47,232,7,115,136,103,17,115,73,215,25,139,33,24,72,172,235,130,16,85,86,236,36,189,38,37,26,199,239,51,170,203,193,229,140,2,59,59,230,18,218,230,59,246,177,34,93,206,44,39,79,236,59,97,216,124,159,159,161,150,169,62,39,254,170,137,103,242,97,254,104,77,221,156,5,219,183,196,128,105,214,163,66,7,60,196,45,73,151,206,235,235,203,83,4,154,35,223,175,221,178,142,213,115,100,5,67,104,255,223,99,216,8,15,7,19,95,85,12,50,108,104,129,208,60,171,154,18,238,123,191,12,184,195,20,46,153,62,123,132,66,123,64,227,131,212,70,162,26,187,176,196,6,70,169,221,5,131,168,138,133,14,202,90,225,247,98,102,135,240,202,139,243,168,218,66,20,190,22,252,49,180,215,223,130,255,242,31,164,119,34,78,39,234,127,65,158,23,127,160,206,81,165,253,133,142,14,97,115,214,100,188,167,153,251,111,198,4,45,99,190,155,68,90,246,100,106,209,211,123,116,115,49,178,110,90,212,244,126,121,11,150,115,16,27,7,128,78,77,166,19,128,69,119,129,251,249,242,214,124,173,179,142,75,59,10,93,149,77,140,64,226,32,159,126,29,160,0,223,28,247,240,5,138,220,107,229,88,158,94,211,251,76,85,138,203,188,2,37,234,157,183,110,231,219,119,243,185,223,83,184,233,213,131,63,70,191,89,119,192,174,97,143,195,219,142,221,246,225,215,220,136,179,29,185,159,217,185,182,92,219,190,188,56,69,7,72,193,33,146,107,70,209,2,137,92,64,75,69,179,61,91,111,184,154,141,218,182,249,175,17,195,193,61,142,204,19,162,127,142,185,191,47,177,49,233,190,6,252,75,50,216,94,191,122,239,240,92,205,177,168,182,107,120,138,53,62,168,82,37,144,12,127,21,44,171,181,84,37,23,79,222,157,9,209,232,5,50,151,121,180,193,122,2,207,148,12,252,84,108,129,110,134,212,193,146,245,172,251,206,111,101,146,232,206,54,11,0,0 }; +const uint8_t JS_SLIDER_GZIP[865] PROGMEM = { 31,139,8,0,198,31,124,92,2,255,237,86,207,111,155,48,20,190,247,175,72,163,174,134,149,184,89,143,33,238,101,211,164,29,118,218,164,77,170,170,200,1,83,172,16,131,176,73,182,209,252,239,123,254,1,1,66,170,110,167,29,118,194,246,251,252,252,222,247,62,243,156,84,34,82,60,23,147,114,179,141,87,37,21,79,236,75,198,99,86,122,146,101,44,82,121,233,215,59,90,78,96,150,4,210,88,86,123,30,171,180,153,228,73,34,153,10,162,170,20,202,173,125,224,50,42,153,98,129,113,231,22,67,237,129,92,29,221,134,93,111,68,91,177,25,122,173,197,186,182,38,59,246,124,156,177,68,133,253,115,12,98,176,134,25,141,82,47,113,217,121,60,216,249,181,137,17,66,80,41,151,126,104,102,152,22,5,19,177,215,223,188,82,219,34,131,195,252,208,100,64,44,52,225,0,68,92,20,149,122,80,63,11,70,166,198,58,125,68,77,196,61,32,182,107,173,113,149,240,44,35,118,220,135,204,180,229,136,75,169,136,51,54,142,180,182,35,54,163,107,118,198,169,49,1,82,87,207,4,186,218,209,140,20,180,148,236,147,80,158,89,194,176,164,211,236,68,136,35,41,61,100,42,129,130,118,223,13,122,51,12,208,2,117,57,206,225,76,4,46,42,89,80,129,124,172,216,15,119,180,70,251,225,193,15,109,121,133,135,182,121,37,89,156,239,197,68,229,85,148,74,69,75,112,61,76,61,104,107,202,252,154,39,30,195,235,74,169,92,16,66,238,252,26,170,7,37,152,36,52,147,44,60,92,232,220,33,99,38,148,108,234,142,221,28,136,210,146,159,181,85,50,42,239,74,210,1,91,85,118,0,78,153,13,162,47,78,141,139,82,22,109,236,117,106,81,47,232,7,115,136,103,17,115,73,215,25,139,33,24,72,172,235,130,16,85,86,236,36,189,38,37,26,199,239,51,170,203,193,229,140,2,59,59,230,18,218,230,59,246,177,34,93,206,44,39,79,236,59,97,216,124,159,159,161,150,169,62,39,254,170,137,103,242,97,254,104,77,221,156,5,219,183,196,128,105,214,163,66,7,60,196,45,73,151,206,235,235,203,83,4,154,35,223,175,221,178,142,213,115,100,5,67,104,255,223,99,216,8,15,7,19,95,85,12,50,108,104,129,208,60,171,154,18,238,123,191,12,184,195,20,46,153,62,123,132,66,123,64,227,131,212,70,162,26,187,176,196,6,70,169,221,5,131,168,138,133,14,202,90,225,247,98,102,135,240,202,139,243,168,218,66,20,190,22,252,49,180,215,223,130,255,242,31,164,119,34,78,39,234,127,65,158,23,127,160,206,81,165,253,133,142,14,97,115,214,100,188,167,153,251,111,198,4,45,99,190,155,68,90,246,100,106,209,211,123,116,115,49,178,110,90,212,244,126,121,11,150,115,16,27,7,128,78,77,166,19,128,69,119,129,251,249,242,214,124,173,179,142,75,59,10,93,149,77,140,64,226,32,159,126,29,160,0,223,28,247,240,5,138,220,107,229,88,158,94,211,251,76,85,138,203,188,2,37,234,157,183,110,231,219,119,243,185,223,83,184,233,213,131,63,70,191,89,119,192,174,97,143,195,219,142,221,246,225,215,220,136,179,29,185,159,217,185,182,92,219,190,188,56,69,7,72,193,33,146,107,70,209,2,137,92,64,75,69,179,61,91,111,184,154,141,218,182,249,175,17,195,193,61,142,204,19,162,127,142,185,191,47,177,49,233,190,6,252,75,50,216,94,191,122,239,240,92,205,177,168,182,107,120,138,53,62,168,82,37,144,12,127,21,44,171,181,84,37,23,79,222,157,9,209,232,5,50,151,121,180,193,122,2,207,148,12,252,84,108,129,110,134,212,193,146,245,172,251,206,111,101,146,232,206,54,11,0,0 }; diff --git a/src/dataStyleCSS.h b/src/dataStyleCSS.h index 0167465..8bfb694 100644 --- a/src/dataStyleCSS.h +++ b/src/dataStyleCSS.h @@ -2,4 +2,4 @@ const char CSS_STYLE[] PROGMEM = R"=====( .container{position:relative;width:79%;margin:20px;box-sizing:border-box}.column,.columns{width:100%;float:left}.card{margin-top:2%;border-radius:6px;box-shadow:0 4px 4px rgba(204,197,185,0.5);padding-left:20px;padding-right:20px;margin-bottom:10px;min-width:150px;color:#fff}.card-slider{padding-bottom:10px}.turquoise{background:#1abc9c;border-bottom:#16a085 3px solid}.emerald{background:#2ecc71;border-bottom:#27ae60 3px solid}.peterriver{background:#3498db;border-bottom:#2980b9 3px solid}.wetasphalt{background:#34495e;border-bottom:#2c3e50 3px solid}.sunflower{background:#f1c40f;border-bottom:#e6bb0f 3px solid}.carrot{background:#e67e22;border-bottom:#d35400 3px solid}.alizarin{background:#e74c3c;border-bottom:#c0392b 3px solid}.dark{background:#444857;border-bottom:#444857 3px solid}.label{box-sizing:border-box;white-space:nowrap;border-radius:.2em;padding:.12em .4em .14em;text-align:center;color:#fff;font-weight:700;line-height:1;margin-bottom:5px;display:inline-block;white-space:nowrap;vertical-align:baseline;position:relative;top:-.15em;background-color:#999;margin-bottom:10px}.label-wrap{width:90%;white-space:pre-wrap;word-wrap:break-word}.label.color-blue{background-color:#6f9ad1}.label.color-red{background-color:#d37c7c}.label.color-green{background-color:#9bc268}.label.color-orange{background-color:#dea154}.label.color-yellow{background-color:#e9d641}.label.color-purple{background-color:#9f83d1}@media(min-width:400px){.container{width:84%}}@media(min-width:630px){.container{width:98%}.column,.columns{margin-right:2%}.column:first-child,.columns:first-child{margin-left:0}.one.column,.one.columns{width:4.66666666667%}.two.columns{width:13.3333333333%}.three.columns{width:22%}.four.columns{width:30.6666666667%}.five.columns{width:39.3333333333%}.six.columns{width:48%}.seven.columns{width:56.6666666667%}.eight.columns{width:65.3333333333%}.nine.columns{width:74%}.ten.columns{width:82.6666666667%}.eleven.columns{width:91.3333333333%}.twelve.columns{width:100%;margin-left:0}.one-third.column{width:30.6666666667%}.two-thirds.column{width:65.3333333333%}.one-half.column{width:48%}.offset-by-one.column,.offset-by-one.columns{margin-left:8.66666666667%}.offset-by-two.column,.offset-by-two.columns{margin-left:17.3333333333%}.offset-by-three.column,.offset-by-three.columns{margin-left:26%}.offset-by-four.column,.offset-by-four.columns{margin-left:34.6666666667%}.offset-by-five.column,.offset-by-five.columns{margin-left:43.3333333333%}.offset-by-six.column,.offset-by-six.columns{margin-left:52%}.offset-by-seven.column,.offset-by-seven.columns{margin-left:60.6666666667%}.offset-by-eight.column,.offset-by-eight.columns{margin-left:69.3333333333%}.offset-by-nine.column,.offset-by-nine.columns{margin-left:78%}.offset-by-ten.column,.offset-by-ten.columns{margin-left:86.6666666667%}.offset-by-eleven.column,.offset-by-eleven.columns{margin-left:95.3333333333%}.offset-by-one-third.column,.offset-by-one-third.columns{margin-left:34.6666666667%}.offset-by-two-thirds.column,.offset-by-two-thirds.columns{margin-left:69.3333333333%}.offset-by-one-half.column,.offset-by-one-half.columns{margin-left:52%}}html{font-size:62.5%}body{margin:0;font-size:1.5em;line-height:1;font-weight:400;font-family:"Open Sans",sans-serif;color:#222;background-color:#ecf0f1}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:300}h1{font-size:4rem;line-height:1.2;letter-spacing:-.1rem}h2{font-size:3.6rem;line-height:1.25;letter-spacing:-.1rem}h3{font-size:3rem;line-height:1.3;letter-spacing:-.1rem}h4{font-size:2.4rem;line-height:1.35;letter-spacing:-.08rem}h5{font-size:1.8rem;line-height:1.5;letter-spacing:-.05rem}h6{font-size:1.5rem;line-height:1.6;letter-spacing:0}@media(min-width:630px){h1{font-size:5rem}h2{font-size:4.2rem}h3{font-size:3.6rem}h4{font-size:3rem}h5{font-size:2rem}h6{font-size:1.5rem}}p{margin-top:0}a{color:#1eaedb}a:hover{color:#0fa0ce}button{display:inline-block;padding:10px;border-radius:3px;color:#fff;background-color:#999}#mainHeader{display:inline-block}#conStatus{position:inherit;font-size:.75em}button,.button{margin-bottom:1rem}.u-full-width{width:100%;box-sizing:border-box}.u-max-full-width{max-width:100%;box-sizing:border-box}.u-pull-right{float:right}.u-pull-left{float:left}.tcenter{text-align:center}hr{margin-top:.5rem;margin-bottom:1.2rem;border-width:0;border-top:1px solid #e1e1e1}.container:after,.row:after,.u-cf{content:"";display:table;clear:both}.control{background-color:#ddd;background-image:linear-gradient(hsla(0,0%,0%,0.1),hsla(0,0%,100%,0.1));border-radius:50%;box-shadow:inset 0 1px 1px 1px hsla(0,0%,100%,0.5),0 0 1px 1px hsla(0,0%,100%,0.75),0 0 1px 2px hsla(0,0%,100%,0.25),0 0 1px 3px hsla(0,0%,100%,0.25),0 0 1px 4px hsla(0,0%,100%,0.25),0 0 1px 6px hsla(0,0%,0%,0.75);height:9em;margin:3em auto;position:relative;width:9em}.control ul{height:100%;padding:0;transform:rotate(45deg)}.control li{border-radius:100% 0 0 0;box-shadow:inset -1px -1px 1px hsla(0,0%,100%,0.5),0 0 1px hsla(0,0%,0%,0.75);display:inline-block;height:50%;overflow:hidden;width:50%}.control ul li:nth-child(2){transform:rotate(90deg)}.control ul li:nth-child(3){transform:rotate(-90deg)}.control ul li:nth-child(4){transform:rotate(180deg)}.control ul a{height:200%;position:relative;transform:rotate(-45deg);width:200%}.control a:hover,.control a:focus{background-color:hsla(0,0%,100%,0.25)}.control a{border-radius:50%;color:#333;display:block;font:bold 1em/3 sans-serif;text-align:center;text-decoration:none;text-shadow:0 1px 1px hsla(0,0%,100%,0.4);transition:.15s}.control .confirm{background-color:#ddd;background-image:linear-gradient(hsla(0,0%,0%,0.15),hsla(0,0%,100%,0.25));box-shadow:inset 0 1px 1px 1px hsla(0,0%,100%,0.5),0 0 1px 1px hsla(0,0%,100%,0.25),0 0 1px 2px hsla(0,0%,100%,0.25),0 0 1px 3px hsla(0,0%,100%,0.25),0 0 1px 4px hsla(0,0%,100%,0.25),0 0 1px 6px hsla(0,0%,0%,0.85);left:50%;line-height:3;margin:-1.5em;position:absolute;top:50%;width:3em}.control .confirm:hover,.control .confirm:focus{background-color:#eee}.switch{display:inline-block !important;background-color:#bebebe;border-radius:4px;box-shadow:inset 0 0 6px rgba(0,0,0,0.3);color:#fff;cursor:pointer;display:block;font-size:14px;height:26px;margin-bottom:12px;position:relative;width:60px;-webkit-transition:background-color .2s ease-in-out;-moz-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;-ms-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.switch.checked{background-color:#76d21d}.switch input[type="checkbox"]{display:none;cursor:pointer;height:10px;left:12px;position:absolute;top:8px;width:10px}.in{position:absolute;top:8px;left:12px;-webkit-transition:left .08s ease-in-out;-moz-transition:left .08s ease-in-out;-o-transition:left .08s ease-in-out;-ms-transition:left .08s ease-in-out;transition:left .08s ease-in-out}.switch.checked div{left:38px}.switch .in:before{background:#fff;background:-moz-linear-gradient(top,#fff 0,#f0f0f0 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(100%,#f0f0f0));background:-webkit-linear-gradient(top,#fff 0,#f0f0f0 100%);background:-o-linear-gradient(top,#fff 0,#f0f0f0 100%);background:-ms-linear-gradient(top,#fff 0,#f0f0f0 100%);background:linear-gradient(to bottom,#fff 0,#f0f0f0 100%);border:1px solid #fff;border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,0.3);content:"";height:18px;position:absolute;top:-5px;left:-9px;width:26px}.switch .in:after{background:#f0f0f0;background:-moz-linear-gradient(top,#f0f0f0 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#f0f0f0),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#f0f0f0 0,#fff 100%);background:-o-linear-gradient(top,#f0f0f0 0,#fff 100%);background:-ms-linear-gradient(top,#f0f0f0 0,#fff 100%);background:linear-gradient(to bottom,#f0f0f0 0,#fff 100%);border-radius:10px;content:"";height:12px;margin:-1px 0 0 -1px;position:absolute;width:12px}.rkmd-slider{display:block;position:relative;font-size:16px;font-family:"Roboto",sans-serif}.rkmd-slider input[type="range"]{overflow:hidden;position:absolute;width:1px;height:1px;opacity:0}.rkmd-slider input[type="range"]+.slider{display:block;position:relative;width:100%;height:27px;border-radius:13px;background-color:#bebebe}@media(pointer:fine){.rkmd-slider input[type="range"]+.slider{height:4px;border-radius:0}}.rkmd-slider input[type="range"]+.slider .slider-fill{display:block;position:absolute;width:0;height:100%;user-select:none;z-index:1}.rkmd-slider input[type="range"]+.slider .slider-handle{cursor:pointer;position:absolute;top:12px;left:0;width:15px;height:15px;margin-left:-8px;border-radius:50%;transition:all .2s ease;user-select:none;z-index:2}@media(pointer:fine){.rkmd-slider input[type="range"]+.slider .slider-handle{top:-5.5px}}.rkmd-slider input[type="range"]:disabled+.slider{background-color:#b0b0b0 !important}.rkmd-slider input[type="range"]:disabled+.slider .slider-fill,.rkmd-slider input[type="range"]:disabled+.slider .slider-handle{cursor:default !important;background-color:#b0b0b0 !important}.rkmd-slider input[type="range"]:disabled+.slider .slider-fill .slider-label,.rkmd-slider input[type="range"]:disabled+.slider .slider-handle .slider-label{display:none;background-color:#b0b0b0 !important}.rkmd-slider input[type="range"]:disabled+.slider .slider-fill.is-active,.rkmd-slider input[type="range"]:disabled+.slider .slider-handle.is-active{top:-5.5px;width:15px;height:15px;margin-left:-8px}.rkmd-slider input[type="range"]:disabled+.slider .slider-fill.is-active .slider-label,.rkmd-slider input[type="range"]:disabled+.slider .slider-handle.is-active .slider-label{display:none;border-radius:50%;transform:none}.rkmd-slider input[type="range"]:disabled+.slider .slider-handle:active{box-shadow:none !important;transform:scale(1) !important}.rkmd-slider.slider-discrete .slider .slider-handle{position:relative;z-index:1}.rkmd-slider.slider-discrete .slider .slider-handle .slider-label{position:absolute;top:-17.5px;left:4px;width:30px;height:30px;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;border-radius:50%;-webkit-transform:scale(1) rotate(-45deg);transform:scale(1) rotate(-45deg);-webkit-transition:all .2s ease;transition:all .2s ease}@media(pointer:fine){.rkmd-slider.slider-discrete .slider .slider-handle .slider-label{left:-2px;-webkit-transform:scale(0.5) rotate(-45deg);transform:scale(0.5) rotate(-45deg)}}.rkmd-slider.slider-discrete .slider .slider-handle .slider-label span{position:absolute;top:7px;left:0;width:100%;color:#fff;font-size:16px;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media(pointer:fine){.rkmd-slider.slider-discrete .slider .slider-handle .slider-label span{font-size:12px}}.rkmd-slider.slider-discrete .slider .slider-handle.is-active{top:0;margin-left:-2px;width:4px;height:4px}.rkmd-slider.slider-discrete .slider .slider-handle.is-active .slider-label{top:-15px;left:-2px;border-radius:15px 15px 15px 0;-webkit-transform:rotate(-45deg) translate(23px,-25px);transform:rotate(-45deg) translate(23px,-25px)}.rkmd-slider.slider-discrete .slider .slider-handle.is-active .slider-label span{opacity:1}.rkmd-slider.slider-discrete.slider-turquoise .slider-label{background-color:#16a085}.rkmd-slider.slider-discrete.slider-emerald .slider-label{background-color:#27ae60}.peterriver{background:#3498db;border-bottom:#2980b9 3px solid}.rkmd-slider.slider-discrete.slider-peterriver .slider-label{background-color:#2980b9}.wetasphalt{background:#34495e;border-bottom:#2c3e50 3px solid}.rkmd-slider.slider-discrete.slider-wetasphalt .slider-label{background-color:#2c3e50}.sunflower{background:#f1c40f;border-bottom:#e6bb0f 3px solid}.rkmd-slider.slider-discrete.slider-sunflower .slider-label{background-color:#e6bb0f}.carrot{background:#e67e22;border-bottom:#d35400 3px solid}.rkmd-slider.slider-discrete.slider-carrot .slider-label{background-color:#d35400}.alizarin{background:#e74c3c;border-bottom:#c0392b 3px solid}.rkmd-slider.slider-discrete.slider-alizarin .slider-label{background-color:#c0392b}input{margin:0 auto 1.2rem auto;padding:2px 5px;width:100%;box-sizing:border-box;border:0;border-radius:4px;box-shadow:inset 0 0 6px rgba(0,0,0,0.3);background:rgba(255,255,255,0.8)}input[id^="num"]{max-width:6em;width:auto;text-align:right;font-weight:bold;font-size:115%} )====="; -const uint8_t CSS_STYLE_GZIP[2814] PROGMEM = { 31,139,8,0,126,24,117,92,2,255,197,26,89,111,179,72,242,175,120,19,69,138,181,192,54,167,13,104,164,125,220,183,149,118,30,71,51,82,3,77,64,193,224,229,24,39,159,197,127,223,62,56,250,34,118,190,100,180,113,226,64,83,85,93,119,87,87,99,165,77,221,195,178,70,237,245,220,116,101,95,54,117,212,162,10,246,229,159,40,190,148,89,95,68,135,240,41,62,193,246,165,172,35,7,156,223,226,164,121,51,187,242,71,89,191,68,73,211,102,168,53,241,200,104,165,77,53,156,106,99,250,223,93,25,178,13,192,83,156,87,13,236,163,10,229,61,6,131,109,118,101,228,204,190,57,71,206,83,60,81,105,97,86,14,93,20,204,83,20,48,107,46,17,216,121,231,55,250,215,190,36,240,217,1,158,97,135,7,195,62,250,6,176,252,125,124,134,89,134,89,49,9,117,198,223,60,210,150,47,197,52,52,205,151,52,125,223,156,48,79,100,8,223,79,44,250,228,30,179,221,180,209,99,158,231,140,71,179,171,202,140,104,101,162,198,225,142,86,63,180,255,29,154,178,67,215,4,166,175,47,109,51,212,89,244,104,195,36,13,211,120,81,10,69,120,180,3,8,142,254,206,197,18,116,13,166,57,90,232,132,90,88,101,2,174,131,210,244,96,203,184,206,1,162,0,240,184,103,212,163,182,197,198,105,5,116,215,11,143,89,162,160,135,71,144,132,60,250,5,245,176,59,23,176,234,37,116,47,244,145,130,158,186,200,23,102,239,134,26,219,242,34,77,158,219,169,7,114,25,27,5,73,2,114,30,27,171,181,109,196,137,81,112,64,142,35,163,102,174,239,1,97,98,88,149,63,96,91,214,34,242,193,75,93,69,223,41,112,67,39,225,145,51,216,190,10,136,158,231,29,253,131,140,200,70,121,196,10,38,168,186,106,253,61,190,20,101,143,204,238,12,83,20,213,205,165,133,103,201,143,45,7,157,102,95,140,44,27,223,237,44,143,124,217,248,59,238,209,91,111,98,169,94,234,40,69,53,182,41,231,128,113,142,99,210,188,32,234,191,7,0,226,10,199,167,89,176,123,91,114,102,31,251,110,86,118,231,10,190,71,101,77,33,147,170,73,95,117,12,98,175,233,203,20,86,211,196,9,236,16,65,136,213,200,39,145,105,90,182,143,57,93,21,103,78,44,134,97,168,137,168,73,93,38,153,105,10,254,16,199,62,207,198,185,69,244,113,124,193,154,162,87,81,210,34,248,106,146,251,9,223,162,147,96,25,6,62,184,230,169,131,60,132,153,45,130,182,40,211,64,102,238,33,61,164,34,228,75,139,80,173,129,13,147,212,9,142,34,108,211,194,250,69,199,66,134,160,237,123,34,240,59,170,112,88,104,128,81,152,5,158,196,239,121,104,207,149,142,114,152,31,93,44,220,63,79,40,43,225,243,154,160,112,44,156,223,246,87,107,77,213,108,252,232,61,141,42,116,224,234,161,195,227,147,154,164,39,51,78,169,114,1,136,242,178,237,122,51,45,202,42,91,128,249,193,25,145,102,93,48,90,77,141,22,218,235,245,188,8,120,86,176,252,28,240,36,253,165,145,151,9,215,114,151,31,2,81,96,83,73,48,14,225,47,111,134,86,26,119,129,37,80,207,177,3,203,32,161,72,190,43,223,100,22,137,118,58,244,39,170,165,7,126,32,82,167,81,40,193,4,190,72,190,46,21,21,28,60,34,149,66,253,232,72,212,43,13,11,161,45,41,231,130,42,69,68,186,208,170,86,49,251,162,108,179,9,118,67,97,216,28,12,172,19,225,100,177,8,57,188,116,228,34,20,213,92,147,231,29,234,205,228,221,20,60,65,51,218,9,174,115,148,60,99,197,88,125,196,208,142,138,116,236,131,196,234,138,193,121,146,177,49,46,210,114,2,129,0,231,113,134,126,88,68,119,61,107,67,36,206,49,13,253,176,72,201,115,183,132,90,253,215,208,142,138,116,124,71,68,230,92,204,216,24,23,9,4,96,75,36,62,26,140,141,113,137,86,184,37,20,23,53,134,126,88,164,116,16,29,175,215,10,213,111,136,116,12,54,69,170,54,244,35,197,38,79,45,244,183,132,146,67,208,248,224,217,189,126,164,196,171,241,209,195,123,213,47,69,183,177,253,72,245,174,177,232,79,213,149,150,45,184,82,66,81,224,88,254,211,152,52,217,251,4,26,129,120,125,106,91,164,174,16,139,26,190,228,193,235,29,187,207,225,169,172,222,163,135,127,159,81,189,251,21,214,221,131,209,225,111,236,169,109,153,207,5,147,67,234,71,117,225,77,115,144,219,99,97,27,133,99,20,174,81,120,70,225,27,69,192,111,61,128,84,197,88,126,139,249,226,57,113,1,192,36,56,193,188,86,230,220,114,226,10,245,184,128,163,53,14,169,245,112,221,132,161,198,194,225,240,92,43,208,96,250,91,168,46,143,170,34,186,91,120,30,135,231,88,26,102,93,205,148,224,72,113,253,43,111,161,163,138,171,67,245,41,106,32,160,250,42,106,32,163,130,205,186,69,80,183,175,40,210,179,28,85,67,84,185,162,244,174,34,147,179,193,234,56,158,5,167,24,225,117,242,33,27,65,148,37,35,140,138,134,236,183,166,81,144,67,144,162,49,25,176,207,212,87,109,233,61,87,253,54,219,46,243,187,2,87,216,106,234,139,235,241,241,132,11,183,127,33,72,246,159,186,9,198,71,92,220,253,218,195,126,232,214,93,123,89,23,56,44,122,46,206,172,3,142,179,137,81,195,154,24,150,10,119,162,0,107,48,243,161,170,152,29,248,114,98,99,167,63,152,39,248,198,163,144,219,123,208,206,4,133,214,154,87,214,18,160,215,203,19,146,78,174,124,175,160,103,91,163,171,178,89,26,139,150,183,25,115,57,73,50,234,40,179,246,25,119,96,190,37,72,246,188,207,219,61,34,155,124,198,181,100,142,96,142,103,49,172,182,185,204,151,131,153,230,87,2,128,25,136,30,30,150,61,87,15,147,10,197,105,133,96,139,165,237,11,70,165,109,42,221,214,33,203,120,139,151,39,248,130,34,98,86,72,246,38,216,65,48,237,231,162,171,224,51,48,192,19,253,181,236,189,177,142,16,245,210,177,189,228,86,254,172,118,214,52,41,107,156,185,119,96,71,100,156,255,20,42,254,222,0,28,140,242,252,192,1,56,58,0,135,3,112,111,1,120,183,0,2,1,96,230,32,158,114,72,184,24,56,114,241,38,26,14,125,19,111,53,172,66,226,211,147,21,118,67,117,157,211,16,241,205,57,52,65,220,227,13,94,151,55,237,41,106,27,28,74,232,217,243,51,244,178,95,49,171,242,42,42,153,16,216,17,118,129,170,107,147,136,96,222,163,107,141,140,218,36,50,113,77,44,75,210,15,233,187,68,69,153,101,168,158,196,196,79,120,49,49,191,81,221,23,108,127,246,236,236,175,138,128,33,16,5,148,113,92,13,142,121,11,201,211,32,217,71,21,9,206,102,112,168,25,212,142,131,50,51,179,199,36,44,193,90,233,77,41,217,224,6,242,38,197,217,80,137,57,157,203,113,116,174,106,24,77,177,138,203,163,197,46,204,32,36,177,226,16,175,178,157,141,78,255,112,119,92,41,162,118,115,232,72,134,210,166,133,84,206,26,215,80,108,112,233,107,110,58,139,183,103,218,96,26,178,108,191,91,57,38,23,120,31,126,250,174,236,226,107,210,11,86,209,254,219,179,137,243,127,207,38,71,28,105,172,98,197,86,230,235,19,119,206,44,38,171,76,23,231,132,9,94,32,134,158,181,195,8,214,180,127,230,243,203,108,16,217,35,151,241,13,199,124,68,8,141,86,119,41,251,180,208,46,242,187,191,149,167,115,211,246,176,238,53,101,66,130,200,71,90,5,60,177,117,62,219,13,80,109,208,246,57,214,6,249,88,238,158,175,66,210,161,237,240,245,185,41,169,239,170,110,63,213,75,132,254,28,197,129,218,86,119,72,243,125,35,39,7,164,20,194,101,117,242,90,246,38,231,221,178,100,59,203,233,118,8,118,200,196,132,155,161,143,205,83,243,227,115,8,205,39,233,119,159,130,255,4,236,108,94,43,45,80,250,170,237,82,30,130,204,177,179,25,112,87,214,231,161,255,173,127,63,163,95,30,40,18,182,230,195,239,139,123,208,36,34,25,107,89,220,176,126,89,43,68,48,131,224,194,71,252,100,174,211,72,195,182,172,175,219,128,43,49,141,217,200,195,29,222,57,124,108,171,13,168,230,30,74,221,109,160,91,0,178,254,119,89,249,231,149,237,173,143,68,252,73,233,88,13,81,130,240,210,35,158,230,136,229,121,68,101,147,179,41,214,149,65,0,119,0,255,3,228,179,35,185,104,47,32,78,218,91,144,24,17,131,178,76,8,208,11,22,67,6,235,16,119,120,248,25,80,202,123,126,136,230,185,105,162,189,118,146,159,98,176,249,57,52,108,162,159,193,83,113,102,225,245,152,52,195,241,213,58,53,140,144,247,28,249,200,16,172,7,134,66,198,91,170,247,57,106,142,155,177,98,250,115,12,152,225,18,54,36,235,9,126,67,55,7,162,219,80,230,239,244,28,38,40,179,244,247,122,14,243,17,141,243,96,151,250,132,231,220,96,176,249,57,180,77,207,249,24,239,35,207,209,97,74,197,59,221,121,43,30,224,44,235,88,68,203,119,226,60,228,66,227,22,83,234,116,136,15,180,175,167,229,136,88,92,47,213,21,144,91,65,201,170,41,180,182,254,211,96,17,26,190,175,37,208,22,86,4,122,34,133,151,3,121,59,176,201,233,186,92,147,203,134,244,94,250,119,114,48,112,99,134,191,91,119,74,198,109,250,231,186,224,160,180,60,108,210,243,216,170,96,230,62,208,180,156,69,57,182,241,254,122,55,131,211,172,158,50,41,24,239,150,114,55,253,55,243,178,170,182,68,150,84,11,98,126,83,57,116,164,181,133,42,148,246,108,141,254,129,87,160,12,189,69,246,231,153,40,96,157,85,232,42,173,242,250,28,69,157,151,29,246,204,166,240,57,155,251,107,137,198,18,217,81,81,19,41,106,185,101,20,86,213,82,196,108,75,229,124,205,104,178,168,44,219,90,152,219,219,54,139,176,121,72,195,37,91,60,64,227,88,128,124,184,242,249,243,84,5,151,48,126,30,93,52,102,134,114,56,84,253,141,194,254,155,185,95,110,232,17,244,151,101,17,201,137,149,233,95,47,140,85,118,38,76,73,234,249,178,32,43,41,206,1,239,141,162,111,19,227,155,173,179,69,88,178,147,62,5,208,230,11,1,24,191,202,70,52,41,150,171,201,8,93,222,241,215,25,187,20,86,232,217,222,111,121,201,76,26,207,153,182,168,95,36,147,131,76,93,157,244,89,248,78,122,146,2,55,138,68,251,96,45,117,162,183,248,15,57,201,152,253,199,85,54,190,68,106,179,105,75,82,114,96,229,211,106,37,222,126,162,90,75,161,182,234,80,234,157,221,134,208,236,237,132,69,96,99,252,246,10,240,115,106,102,17,230,232,84,54,137,64,58,77,183,196,212,192,140,95,247,129,93,119,134,91,27,230,131,178,16,131,181,149,184,188,210,181,214,128,106,195,80,149,87,104,75,111,181,171,215,170,110,161,160,172,219,116,3,162,25,237,212,65,121,224,47,178,51,83,37,167,19,71,94,252,239,36,43,101,113,32,102,106,103,137,72,174,115,229,73,233,251,211,51,73,46,203,242,192,186,91,116,212,2,216,39,77,209,229,11,108,219,122,114,214,29,125,80,145,17,7,23,207,134,233,96,188,125,252,57,240,239,20,146,217,107,118,181,143,243,233,124,191,188,35,43,233,75,173,18,216,27,178,119,17,157,94,157,189,73,146,189,56,251,229,215,101,239,224,104,157,225,54,83,148,254,151,95,194,189,131,169,117,134,219,76,81,250,95,125,181,247,14,158,150,9,110,178,196,200,127,233,125,225,59,248,97,212,111,50,195,104,127,241,13,228,59,216,153,233,223,100,136,81,31,105,89,182,188,93,67,15,68,119,236,204,123,58,28,157,14,58,201,89,11,87,217,110,158,207,207,141,54,240,149,51,5,78,55,236,109,125,223,55,230,63,96,29,247,140,235,223,202,236,143,95,30,234,225,244,240,59,247,234,64,128,78,19,147,148,127,110,133,164,111,9,8,239,229,144,83,56,126,73,181,253,167,241,127,75,92,82,69,202,48,0,0 }; +const uint8_t CSS_STYLE_GZIP[2814] PROGMEM = { 31,139,8,0,198,31,124,92,2,255,197,26,89,111,179,72,242,175,120,19,69,138,181,192,54,167,13,104,164,125,220,183,149,118,30,71,51,82,3,77,64,193,224,229,24,39,159,197,127,223,62,56,250,34,118,190,100,180,113,226,64,83,85,93,119,87,87,99,165,77,221,195,178,70,237,245,220,116,101,95,54,117,212,162,10,246,229,159,40,190,148,89,95,68,135,240,41,62,193,246,165,172,35,7,156,223,226,164,121,51,187,242,71,89,191,68,73,211,102,168,53,241,200,104,165,77,53,156,106,99,250,223,93,25,178,13,192,83,156,87,13,236,163,10,229,61,6,131,109,118,101,228,204,190,57,71,206,83,60,81,105,97,86,14,93,20,204,83,20,48,107,46,17,216,121,231,55,250,215,190,36,240,217,1,158,97,135,7,195,62,250,6,176,252,125,124,134,89,134,89,49,9,117,198,223,60,210,150,47,197,52,52,205,151,52,125,223,156,48,79,100,8,223,79,44,250,228,30,179,221,180,209,99,158,231,140,71,179,171,202,140,104,101,162,198,225,142,86,63,180,255,29,154,178,67,215,4,166,175,47,109,51,212,89,244,104,195,36,13,211,120,81,10,69,120,180,3,8,142,254,206,197,18,116,13,166,57,90,232,132,90,88,101,2,174,131,210,244,96,203,184,206,1,162,0,240,184,103,212,163,182,197,198,105,5,116,215,11,143,89,162,160,135,71,144,132,60,250,5,245,176,59,23,176,234,37,116,47,244,145,130,158,186,200,23,102,239,134,26,219,242,34,77,158,219,169,7,114,25,27,5,73,2,114,30,27,171,181,109,196,137,81,112,64,142,35,163,102,174,239,1,97,98,88,149,63,96,91,214,34,242,193,75,93,69,223,41,112,67,39,225,145,51,216,190,10,136,158,231,29,253,131,140,200,70,121,196,10,38,168,186,106,253,61,190,20,101,143,204,238,12,83,20,213,205,165,133,103,201,143,45,7,157,102,95,140,44,27,223,237,44,143,124,217,248,59,238,209,91,111,98,169,94,234,40,69,53,182,41,231,128,113,142,99,210,188,32,234,191,7,0,226,10,199,167,89,176,123,91,114,102,31,251,110,86,118,231,10,190,71,101,77,33,147,170,73,95,117,12,98,175,233,203,20,86,211,196,9,236,16,65,136,213,200,39,145,105,90,182,143,57,93,21,103,78,44,134,97,168,137,168,73,93,38,153,105,10,254,16,199,62,207,198,185,69,244,113,124,193,154,162,87,81,210,34,248,106,146,251,9,223,162,147,96,25,6,62,184,230,169,131,60,132,153,45,130,182,40,211,64,102,238,33,61,164,34,228,75,139,80,173,129,13,147,212,9,142,34,108,211,194,250,69,199,66,134,160,237,123,34,240,59,170,112,88,104,128,81,152,5,158,196,239,121,104,207,149,142,114,152,31,93,44,220,63,79,40,43,225,243,154,160,112,44,156,223,246,87,107,77,213,108,252,232,61,141,42,116,224,234,161,195,227,147,154,164,39,51,78,169,114,1,136,242,178,237,122,51,45,202,42,91,128,249,193,25,145,102,93,48,90,77,141,22,218,235,245,188,8,120,86,176,252,28,240,36,253,165,145,151,9,215,114,151,31,2,81,96,83,73,48,14,225,47,111,134,86,26,119,129,37,80,207,177,3,203,32,161,72,190,43,223,100,22,137,118,58,244,39,170,165,7,126,32,82,167,81,40,193,4,190,72,190,46,21,21,28,60,34,149,66,253,232,72,212,43,13,11,161,45,41,231,130,42,69,68,186,208,170,86,49,251,162,108,179,9,118,67,97,216,28,12,172,19,225,100,177,8,57,188,116,228,34,20,213,92,147,231,29,234,205,228,221,20,60,65,51,218,9,174,115,148,60,99,197,88,125,196,208,142,138,116,236,131,196,234,138,193,121,146,177,49,46,210,114,2,129,0,231,113,134,126,88,68,119,61,107,67,36,206,49,13,253,176,72,201,115,183,132,90,253,215,208,142,138,116,124,71,68,230,92,204,216,24,23,9,4,96,75,36,62,26,140,141,113,137,86,184,37,20,23,53,134,126,88,164,116,16,29,175,215,10,213,111,136,116,12,54,69,170,54,244,35,197,38,79,45,244,183,132,146,67,208,248,224,217,189,126,164,196,171,241,209,195,123,213,47,69,183,177,253,72,245,174,177,232,79,213,149,150,45,184,82,66,81,224,88,254,211,152,52,217,251,4,26,129,120,125,106,91,164,174,16,139,26,190,228,193,235,29,187,207,225,169,172,222,163,135,127,159,81,189,251,21,214,221,131,209,225,111,236,169,109,153,207,5,147,67,234,71,117,225,77,115,144,219,99,97,27,133,99,20,174,81,120,70,225,27,69,192,111,61,128,84,197,88,126,139,249,226,57,113,1,192,36,56,193,188,86,230,220,114,226,10,245,184,128,163,53,14,169,245,112,221,132,161,198,194,225,240,92,43,208,96,250,91,168,46,143,170,34,186,91,120,30,135,231,88,26,102,93,205,148,224,72,113,253,43,111,161,163,138,171,67,245,41,106,32,160,250,42,106,32,163,130,205,186,69,80,183,175,40,210,179,28,85,67,84,185,162,244,174,34,147,179,193,234,56,158,5,167,24,225,117,242,33,27,65,148,37,35,140,138,134,236,183,166,81,144,67,144,162,49,25,176,207,212,87,109,233,61,87,253,54,219,46,243,187,2,87,216,106,234,139,235,241,241,132,11,183,127,33,72,246,159,186,9,198,71,92,220,253,218,195,126,232,214,93,123,89,23,56,44,122,46,206,172,3,142,179,137,81,195,154,24,150,10,119,162,0,107,48,243,161,170,152,29,248,114,98,99,167,63,152,39,248,198,163,144,219,123,208,206,4,133,214,154,87,214,18,160,215,203,19,146,78,174,124,175,160,103,91,163,171,178,89,26,139,150,183,25,115,57,73,50,234,40,179,246,25,119,96,190,37,72,246,188,207,219,61,34,155,124,198,181,100,142,96,142,103,49,172,182,185,204,151,131,153,230,87,2,128,25,136,30,30,150,61,87,15,147,10,197,105,133,96,139,165,237,11,70,165,109,42,221,214,33,203,120,139,151,39,248,130,34,98,86,72,246,38,216,65,48,237,231,162,171,224,51,48,192,19,253,181,236,189,177,142,16,245,210,177,189,228,86,254,172,118,214,52,41,107,156,185,119,96,71,100,156,255,20,42,254,222,0,28,140,242,252,192,1,56,58,0,135,3,112,111,1,120,183,0,2,1,96,230,32,158,114,72,184,24,56,114,241,38,26,14,125,19,111,53,172,66,226,211,147,21,118,67,117,157,211,16,241,205,57,52,65,220,227,13,94,151,55,237,41,106,27,28,74,232,217,243,51,244,178,95,49,171,242,42,42,153,16,216,17,118,129,170,107,147,136,96,222,163,107,141,140,218,36,50,113,77,44,75,210,15,233,187,68,69,153,101,168,158,196,196,79,120,49,49,191,81,221,23,108,127,246,236,236,175,138,128,33,16,5,148,113,92,13,142,121,11,201,211,32,217,71,21,9,206,102,112,168,25,212,142,131,50,51,179,199,36,44,193,90,233,77,41,217,224,6,242,38,197,217,80,137,57,157,203,113,116,174,106,24,77,177,138,203,163,197,46,204,32,36,177,226,16,175,178,157,141,78,255,112,119,92,41,162,118,115,232,72,134,210,166,133,84,206,26,215,80,108,112,233,107,110,58,139,183,103,218,96,26,178,108,191,91,57,38,23,120,31,126,250,174,236,226,107,210,11,86,209,254,219,179,137,243,127,207,38,71,28,105,172,98,197,86,230,235,19,119,206,44,38,171,76,23,231,132,9,94,32,134,158,181,195,8,214,180,127,230,243,203,108,16,217,35,151,241,13,199,124,68,8,141,86,119,41,251,180,208,46,242,187,191,149,167,115,211,246,176,238,53,101,66,130,200,71,90,5,60,177,117,62,219,13,80,109,208,246,57,214,6,249,88,238,158,175,66,210,161,237,240,245,185,41,169,239,170,110,63,213,75,132,254,28,197,129,218,86,119,72,243,125,35,39,7,164,20,194,101,117,242,90,246,38,231,221,178,100,59,203,233,118,8,118,200,196,132,155,161,143,205,83,243,227,115,8,205,39,233,119,159,130,255,4,236,108,94,43,45,80,250,170,237,82,30,130,204,177,179,25,112,87,214,231,161,255,173,127,63,163,95,30,40,18,182,230,195,239,139,123,208,36,34,25,107,89,220,176,126,89,43,68,48,131,224,194,71,252,100,174,211,72,195,182,172,175,219,128,43,49,141,217,200,195,29,222,57,124,108,171,13,168,230,30,74,221,109,160,91,0,178,254,119,89,249,231,149,237,173,143,68,252,73,233,88,13,81,130,240,210,35,158,230,136,229,121,68,101,147,179,41,214,149,65,0,119,0,255,3,228,179,35,185,104,47,32,78,218,91,144,24,17,131,178,76,8,208,11,22,67,6,235,16,119,120,248,25,80,202,123,126,136,230,185,105,162,189,118,146,159,98,176,249,57,52,108,162,159,193,83,113,102,225,245,152,52,195,241,213,58,53,140,144,247,28,249,200,16,172,7,134,66,198,91,170,247,57,106,142,155,177,98,250,115,12,152,225,18,54,36,235,9,126,67,55,7,162,219,80,230,239,244,28,38,40,179,244,247,122,14,243,17,141,243,96,151,250,132,231,220,96,176,249,57,180,77,207,249,24,239,35,207,209,97,74,197,59,221,121,43,30,224,44,235,88,68,203,119,226,60,228,66,227,22,83,234,116,136,15,180,175,167,229,136,88,92,47,213,21,144,91,65,201,170,41,180,182,254,211,96,17,26,190,175,37,208,22,86,4,122,34,133,151,3,121,59,176,201,233,186,92,147,203,134,244,94,250,119,114,48,112,99,134,191,91,119,74,198,109,250,231,186,224,160,180,60,108,210,243,216,170,96,230,62,208,180,156,69,57,182,241,254,122,55,131,211,172,158,50,41,24,239,150,114,55,253,55,243,178,170,182,68,150,84,11,98,126,83,57,116,164,181,133,42,148,246,108,141,254,129,87,160,12,189,69,246,231,153,40,96,157,85,232,42,173,242,250,28,69,157,151,29,246,204,166,240,57,155,251,107,137,198,18,217,81,81,19,41,106,185,101,20,86,213,82,196,108,75,229,124,205,104,178,168,44,219,90,152,219,219,54,139,176,121,72,195,37,91,60,64,227,88,128,124,184,242,249,243,84,5,151,48,126,30,93,52,102,134,114,56,84,253,141,194,254,155,185,95,110,232,17,244,151,101,17,201,137,149,233,95,47,140,85,118,38,76,73,234,249,178,32,43,41,206,1,239,141,162,111,19,227,155,173,179,69,88,178,147,62,5,208,230,11,1,24,191,202,70,52,41,150,171,201,8,93,222,241,215,25,187,20,86,232,217,222,111,121,201,76,26,207,153,182,168,95,36,147,131,76,93,157,244,89,248,78,122,146,2,55,138,68,251,96,45,117,162,183,248,15,57,201,152,253,199,85,54,190,68,106,179,105,75,82,114,96,229,211,106,37,222,126,162,90,75,161,182,234,80,234,157,221,134,208,236,237,132,69,96,99,252,246,10,240,115,106,102,17,230,232,84,54,137,64,58,77,183,196,212,192,140,95,247,129,93,119,134,91,27,230,131,178,16,131,181,149,184,188,210,181,214,128,106,195,80,149,87,104,75,111,181,171,215,170,110,161,160,172,219,116,3,162,25,237,212,65,121,224,47,178,51,83,37,167,19,71,94,252,239,36,43,101,113,32,102,106,103,137,72,174,115,229,73,233,251,211,51,73,46,203,242,192,186,91,116,212,2,216,39,77,209,229,11,108,219,122,114,214,29,125,80,145,17,7,23,207,134,233,96,188,125,252,57,240,239,20,146,217,107,118,181,143,243,233,124,191,188,35,43,233,75,173,18,216,27,178,119,17,157,94,157,189,73,146,189,56,251,229,215,101,239,224,104,157,225,54,83,148,254,151,95,194,189,131,169,117,134,219,76,81,250,95,125,181,247,14,158,150,9,110,178,196,200,127,233,125,225,59,248,97,212,111,50,195,104,127,241,13,228,59,216,153,233,223,100,136,81,31,105,89,182,188,93,67,15,68,119,236,204,123,58,28,157,14,58,201,89,11,87,217,110,158,207,207,141,54,240,149,51,5,78,55,236,109,125,223,55,230,63,96,29,247,140,235,223,202,236,143,95,30,234,225,244,240,59,247,234,64,128,78,19,147,148,127,110,133,164,111,9,8,239,229,144,83,56,126,73,181,253,167,241,127,75,92,82,69,202,48,0,0 }; diff --git a/src/dataZeptoJS.h b/src/dataZeptoJS.h index d0585e1..926afd1 100644 --- a/src/dataZeptoJS.h +++ b/src/dataZeptoJS.h @@ -2,4 +2,4 @@ const char JS_ZEPTO[] PROGMEM = R"=====( !function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t)}):e(t)}(this,function(t){var e=function(){function $(t){return null==t?String(t):S[C.call(t)]||"object"}function F(t){return"function"==$(t)}function k(t){return null!=t&&t==t.window}function M(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function R(t){return"object"==$(t)}function Z(t){return R(t)&&!k(t)&&Object.getPrototypeOf(t)==Object.prototype}function z(t){var e=!!t&&"length"in t&&t.length,n=r.type(t);return"function"!=n&&!k(t)&&("array"==n||0===e||"number"==typeof e&&e>0&&e-1 in t)}function q(t){return a.call(t,function(t){return null!=t})}function H(t){return t.length>0?r.fn.concat.apply([],t):t}function I(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function V(t){return t in l?l[t]:l[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function _(t,e){return"number"!=typeof e||h[I(t)]?e:e+"px"}function B(t){var e,n;return c[t]||(e=f.createElement(t),f.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),c[t]=n),c[t]}function U(t){return"children"in t?u.call(t.children):r.map(t.childNodes,function(t){return 1==t.nodeType?t:void 0})}function X(t,e){var n,r=t?t.length:0;for(n=0;r>n;n++)this[n]=t[n];this.length=r,this.selector=e||""}function J(t,r,i){for(n in r)i&&(Z(r[n])||L(r[n]))?(Z(r[n])&&!Z(t[n])&&(t[n]={}),L(r[n])&&!L(t[n])&&(t[n]=[]),J(t[n],r[n],i)):r[n]!==e&&(t[n]=r[n])}function W(t,e){return null==e?r(t):r(t).filter(e)}function Y(t,e,n,r){return F(e)?e.call(t,n,r):e}function G(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function K(t,n){var r=t.className||"",i=r&&r.baseVal!==e;return n===e?i?r.baseVal:r:void(i?r.baseVal=n:t.className=n)}function Q(t){try{return t?"true"==t||("false"==t?!1:"null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?r.parseJSON(t):t):t}catch(e){return t}}function tt(t,e){e(t);for(var n=0,r=t.childNodes.length;r>n;n++)tt(t.childNodes[n],e)}var e,n,r,i,O,P,o=[],s=o.concat,a=o.filter,u=o.slice,f=t.document,c={},l={},h={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},p=/^\s*<(\w+|!)[^>]*>/,d=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,m=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,g=/^(?:body|html)$/i,v=/([A-Z])/g,y=["val","css","html","text","data","width","height","offset"],x=["after","prepend","before","append"],b=f.createElement("table"),E=f.createElement("tr"),j={tr:f.createElement("tbody"),tbody:b,thead:b,tfoot:b,td:E,th:E,"*":f.createElement("div")},w=/complete|loaded|interactive/,T=/^[\w-]*$/,S={},C=S.toString,N={},A=f.createElement("div"),D={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},L=Array.isArray||function(t){return t instanceof Array};return N.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=A).appendChild(t),r=~N.qsa(i,e).indexOf(t),o&&A.removeChild(t),r},O=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},P=function(t){return a.call(t,function(e,n){return t.indexOf(e)==n})},N.fragment=function(t,n,i){var o,s,a;return d.test(t)&&(o=r(f.createElement(RegExp.$1))),o||(t.replace&&(t=t.replace(m,"<$1>")),n===e&&(n=p.test(t)&&RegExp.$1),n in j||(n="*"),a=j[n],a.innerHTML=""+t,o=r.each(u.call(a.childNodes),function(){a.removeChild(this)})),Z(i)&&(s=r(o),r.each(i,function(t,e){y.indexOf(t)>-1?s[t](e):s.attr(t,e)})),o},N.Z=function(t,e){return new X(t,e)},N.isZ=function(t){return t instanceof N.Z},N.init=function(t,n){var i;if(!t)return N.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&p.test(t))i=N.fragment(t,RegExp.$1,n),t=null;else{if(n!==e)return r(n).find(t);i=N.qsa(f,t)}else{if(F(t))return r(f).ready(t);if(N.isZ(t))return t;if(L(t))i=q(t);else if(R(t))i=[t],t=null;else if(p.test(t))i=N.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==e)return r(n).find(t);i=N.qsa(f,t)}}return N.Z(i,t)},r=function(t,e){return N.init(t,e)},r.extend=function(t){var e,n=u.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){J(t,n,e)}),t},N.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,s=T.test(o);return t.getElementById&&s&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:u.call(s&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},r.contains=f.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},r.type=$,r.isFunction=F,r.isWindow=k,r.isArray=L,r.isPlainObject=Z,r.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},r.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},r.inArray=function(t,e,n){return o.indexOf.call(e,t,n)},r.camelCase=O,r.trim=function(t){return null==t?"":String.prototype.trim.call(t)},r.uuid=0,r.support={},r.expr={},r.noop=function(){},r.map=function(t,e){var n,i,o,r=[];if(z(t))for(i=0;i=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return o.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return F(t)?this.not(this.not(t)):r(a.call(this,function(e){return N.matches(e,t)}))},add:function(t,e){return r(P(this.concat(r(t,e))))},is:function(t){return this.length>0&&N.matches(this[0],t)},not:function(t){var n=[];if(F(t)&&t.call!==e)this.each(function(e){t.call(this,e)||n.push(this)});else{var i="string"==typeof t?this.filter(t):z(t)&&F(t.item)?u.call(t):r(t);this.forEach(function(t){i.indexOf(t)<0&&n.push(t)})}return r(n)},has:function(t){return this.filter(function(){return R(t)?r.contains(this,t):r(this).find(t).size()})},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!R(t)?t:r(t)},last:function(){var t=this[this.length-1];return t&&!R(t)?t:r(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?r(t).filter(function(){var t=this;return o.some.call(n,function(e){return r.contains(e,t)})}):1==this.length?r(N.qsa(this[0],t)):this.map(function(){return N.qsa(this,t)}):r()},closest:function(t,e){var n=[],i="object"==typeof t&&r(t);return this.each(function(r,o){for(;o&&!(i?i.indexOf(o)>=0:N.matches(o,t));)o=o!==e&&!M(o)&&o.parentNode;o&&n.indexOf(o)<0&&n.push(o)}),r(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=r.map(n,function(t){return(t=t.parentNode)&&!M(t)&&e.indexOf(t)<0?(e.push(t),t):void 0});return W(e,t)},parent:function(t){return W(P(this.pluck("parentNode")),t)},children:function(t){return W(this.map(function(){return U(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||u.call(this.childNodes)})},siblings:function(t){return W(this.map(function(t,e){return a.call(U(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return r.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=B(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=F(t);if(this[0]&&!e)var n=r(t).get(0),i=n.parentNode||this.length>1;return this.each(function(o){r(this).wrapAll(e?t.call(this,o):i?n.cloneNode(!0):n)})},wrapAll:function(t){if(this[0]){r(this[0]).before(t=r(t));for(var e;(e=t.children()).length;)t=e.first();r(t).append(this)}return this},wrapInner:function(t){var e=F(t);return this.each(function(n){var i=r(this),o=i.contents(),s=e?t.call(this,n):t;o.length?o.wrapAll(s):i.append(s)})},unwrap:function(){return this.parent().each(function(){r(this).replaceWith(r(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var n=r(this);(t===e?"none"==n.css("display"):t)?n.show():n.hide()})},prev:function(t){return r(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return r(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;r(this).empty().append(Y(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=Y(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,r){var i;return"string"!=typeof t||1 in arguments?this.each(function(e){if(1===this.nodeType)if(R(t))for(n in t)G(this,n,t[n]);else G(this,t,Y(this,r,e,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(i=this[0].getAttribute(t))?i:e},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){G(this,t)},this)})},prop:function(t,e){return t=D[t]||t,1 in arguments?this.each(function(n){this[t]=Y(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=D[t]||t,this.each(function(){delete this[t]})},data:function(t,n){var r="data-"+t.replace(v,"-$1").toLowerCase(),i=1 in arguments?this.attr(r,n):this.attr(r);return null!==i?Q(i):e},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=Y(this,t,e,this.value)})):this[0]&&(this[0].multiple?r(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each(function(t){var n=r(this),i=Y(this,e,t,n.offset()),o=n.offsetParent().offset(),s={top:i.top-o.top,left:i.left-o.left};"static"==n.css("position")&&(s.position="relative"),n.css(s)});if(!this.length)return null;if(f.documentElement!==this[0]&&!r.contains(f.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(t,e){if(arguments.length<2){var i=this[0];if("string"==typeof t){if(!i)return;return i.style[O(t)]||getComputedStyle(i,"").getPropertyValue(t)}if(L(t)){if(!i)return;var o={},s=getComputedStyle(i,"");return r.each(t,function(t,e){o[e]=i.style[O(e)]||s.getPropertyValue(e)}),o}}var a="";if("string"==$(t))e||0===e?a=I(t)+":"+_(t,e):this.each(function(){this.style.removeProperty(I(t))});else for(n in t)t[n]||0===t[n]?a+=I(n)+":"+_(n,t[n])+";":this.each(function(){this.style.removeProperty(I(n))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(r(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return t?o.some.call(this,function(t){return this.test(K(t))},V(t)):!1},addClass:function(t){return t?this.each(function(e){if("className"in this){i=[];var n=K(this),o=Y(this,t,e,n);o.split(/\s+/g).forEach(function(t){r(this).hasClass(t)||i.push(t)},this),i.length&&K(this,n+(n?" ":"")+i.join(" "))}}):this},removeClass:function(t){return this.each(function(n){if("className"in this){if(t===e)return K(this,"");i=K(this),Y(this,t,n,i).split(/\s+/g).forEach(function(t){i=i.replace(V(t)," ")}),K(this,i.trim())}})},toggleClass:function(t,n){return t?this.each(function(i){var o=r(this),s=Y(this,t,i,K(this));s.split(/\s+/g).forEach(function(t){(n===e?!o.hasClass(t):n)?o.addClass(t):o.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return t===e?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return t===e?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),i=g.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(r(t).css("margin-top"))||0,n.left-=parseFloat(r(t).css("margin-left"))||0,i.top+=parseFloat(r(e[0]).css("border-top-width"))||0,i.left+=parseFloat(r(e[0]).css("border-left-width"))||0,{top:n.top-i.top,left:n.left-i.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||f.body;t&&!g.test(t.nodeName)&&"static"==r(t).css("position");)t=t.offsetParent;return t})}},r.fn.detach=r.fn.remove,["width","height"].forEach(function(t){var n=t.replace(/./,function(t){return t[0].toUpperCase()});r.fn[t]=function(i){var o,s=this[0];return i===e?k(s)?s["inner"+n]:M(s)?s.documentElement["scroll"+n]:(o=this.offset())&&o[t]:this.each(function(e){s=r(this),s.css(t,Y(this,i,e,s[t]()))})}}),x.forEach(function(n,i){var o=i%2;r.fn[n]=function(){var n,a,s=r.map(arguments,function(t){var i=[];return n=$(t),"array"==n?(t.forEach(function(t){return t.nodeType!==e?i.push(t):r.zepto.isZ(t)?i=i.concat(t.get()):void(i=i.concat(N.fragment(t)))}),i):"object"==n||null==t?t:N.fragment(t)}),u=this.length>1;return s.length<1?this:this.each(function(e,n){a=o?n:n.parentNode,n=0==i?n.nextSibling:1==i?n.firstChild:2==i?n:null;var c=r.contains(f.documentElement,a);s.forEach(function(e){if(u)e=e.cloneNode(!0);else if(!a)return r(e).remove();a.insertBefore(e,n),c&&tt(e,function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}})})})},r.fn[o?n+"To":"insert"+(i?"Before":"After")]=function(t){return r(t)[n](this),this}}),N.Z.prototype=X.prototype=r.fn,N.uniq=P,N.deserializeValue=Q,r.zepto=N,r}();return t.Zepto=e,void 0===t.$&&(t.$=e),function(e){function h(t){return t._zid||(t._zid=n++)}function p(t,e,n,r){if(e=d(e),e.ns)var i=m(e.ns);return(a[h(t)]||[]).filter(function(t){return t&&(!e.e||t.e==e.e)&&(!e.ns||i.test(t.ns))&&(!n||h(t.fn)===h(n))&&(!r||t.sel==r)})}function d(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function m(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function g(t,e){return t.del&&!f&&t.e in c||!!e}function v(t){return l[t]||f&&c[t]||t}function y(t,n,i,o,s,u,f){var c=h(t),p=a[c]||(a[c]=[]);n.split(/\s/).forEach(function(n){if("ready"==n)return e(document).ready(i);var a=d(n);a.fn=i,a.sel=s,a.e in l&&(i=function(t){var n=t.relatedTarget;return!n||n!==this&&!e.contains(this,n)?a.fn.apply(this,arguments):void 0}),a.del=u;var c=u||i;a.proxy=function(e){if(e=T(e),!e.isImmediatePropagationStopped()){e.data=o;var n=c.apply(t,e._args==r?[e]:[e].concat(e._args));return n===!1&&(e.preventDefault(),e.stopPropagation()),n}},a.i=p.length,p.push(a),"addEventListener"in t&&t.addEventListener(v(a.e),a.proxy,g(a,f))})}function x(t,e,n,r,i){var o=h(t);(e||"").split(/\s/).forEach(function(e){p(t,e,n,r).forEach(function(e){delete a[o][e.i],"removeEventListener"in t&&t.removeEventListener(v(e.e),e.proxy,g(e,i))})})}function T(t,n){return(n||!t.isDefaultPrevented)&&(n||(n=t),e.each(w,function(e,r){var i=n[e];t[e]=function(){return this[r]=b,i&&i.apply(n,arguments)},t[r]=E}),t.timeStamp||(t.timeStamp=Date.now()),(n.defaultPrevented!==r?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(t.isDefaultPrevented=b)),t}function S(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===r||(n[e]=t[e]);return T(n,t)}var r,n=1,i=Array.prototype.slice,o=e.isFunction,s=function(t){return"string"==typeof t},a={},u={},f="onfocusin"in t,c={focus:"focusin",blur:"focusout"},l={mouseenter:"mouseover",mouseleave:"mouseout"};u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:y,remove:x},e.proxy=function(t,n){var r=2 in arguments&&i.call(arguments,2);if(o(t)){var a=function(){return t.apply(n,r?r.concat(i.call(arguments)):arguments)};return a._zid=h(t),a}if(s(n))return r?(r.unshift(t[n],t),e.proxy.apply(null,r)):e.proxy(t[n],t);throw new TypeError("expected function")},e.fn.bind=function(t,e,n){return this.on(t,e,n)},e.fn.unbind=function(t,e){return this.off(t,e)},e.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var b=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,w={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};e.fn.delegate=function(t,e,n){return this.on(e,t,n)},e.fn.undelegate=function(t,e,n){return this.off(e,t,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,n,a,u,f){var c,l,h=this;return t&&!s(t)?(e.each(t,function(t,e){h.on(t,n,a,e,f)}),h):(s(n)||o(u)||u===!1||(u=a,a=n,n=r),(u===r||a===!1)&&(u=a,a=r),u===!1&&(u=E),h.each(function(r,o){f&&(c=function(t){return x(o,t.type,u),u.apply(this,arguments)}),n&&(l=function(t){var r,s=e(t.target).closest(n,o).get(0);return s&&s!==o?(r=e.extend(S(t),{currentTarget:s,liveFired:o}),(c||u).apply(s,[r].concat(i.call(arguments,1)))):void 0}),y(o,t,u,a,n,l||c)}))},e.fn.off=function(t,n,i){var a=this;return t&&!s(t)?(e.each(t,function(t,e){a.off(t,n,e)}),a):(s(n)||o(i)||i===!1||(i=n,n=r),i===!1&&(i=E),a.each(function(){x(this,t,i,n)}))},e.fn.trigger=function(t,n){return t=s(t)||e.isPlainObject(t)?e.Event(t):T(t),t._args=n,this.each(function(){t.type in c&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)})},e.fn.triggerHandler=function(t,n){var r,i;return this.each(function(o,a){r=S(s(t)?e.Event(t):t),r._args=n,r.target=a,e.each(p(a,t.type||t),function(t,e){return i=e.proxy(r),r.isImmediatePropagationStopped()?!1:void 0})}),i},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}}),e.Event=function(t,e){s(t)||(e=t,t=e.type);var n=document.createEvent(u[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),T(n)}}(e),function(e){function p(t,n,r){var i=e.Event(n);return e(t).trigger(i,r),!i.isDefaultPrevented()}function d(t,e,n,i){return t.global?p(e||r,n,i):void 0}function m(t){t.global&&0===e.active++&&d(t,null,"ajaxStart")}function g(t){t.global&&!--e.active&&d(t,null,"ajaxStop")}function v(t,e){var n=e.context;return e.beforeSend.call(n,t,e)===!1||d(e,n,"ajaxBeforeSend",[t,e])===!1?!1:void d(e,n,"ajaxSend",[t,e])}function y(t,e,n,r){var i=n.context,o="success";n.success.call(i,t,o,e),r&&r.resolveWith(i,[t,o,e]),d(n,i,"ajaxSuccess",[e,n,t]),b(o,e,n)}function x(t,e,n,r,i){var o=r.context;r.error.call(o,n,e,t),i&&i.rejectWith(o,[n,e,t]),d(r,o,"ajaxError",[n,r,t||e]),b(e,n,r)}function b(t,e,n){var r=n.context;n.complete.call(r,e,t),d(n,r,"ajaxComplete",[e,n]),g(n)}function E(t,e,n){if(n.dataFilter==j)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function j(){}function w(t){return t&&(t=t.split(";",2)[0]),t&&(t==c?"html":t==f?"json":a.test(t)?"script":u.test(t)&&"xml")||"text"}function T(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function S(t){t.processData&&t.data&&"string"!=e.type(t.data)&&(t.data=e.param(t.data,t.traditional)),!t.data||t.type&&"GET"!=t.type.toUpperCase()&&"jsonp"!=t.dataType||(t.url=T(t.url,t.data),t.data=void 0)}function C(t,n,r,i){return e.isFunction(n)&&(i=r,r=n,n=void 0),e.isFunction(r)||(i=r,r=void 0),{url:t,data:n,success:r,dataType:i}}function O(t,n,r,i){var o,s=e.isArray(n),a=e.isPlainObject(n);e.each(n,function(n,u){o=e.type(u),i&&(n=r?i:i+"["+(a||"object"==o||"array"==o?n:"")+"]"),!i&&s?t.add(u.name,u.value):"array"==o||!r&&"object"==o?O(t,u,r,n):t.add(n,u)})}var i,o,n=+new Date,r=t.document,s=/)<[^<]*)*<\/script>/gi,a=/^(?:text|application)\/javascript/i,u=/^(?:text|application)\/xml/i,f="application/json",c="text/html",l=/^\s*$/,h=r.createElement("a");h.href=t.location.href,e.active=0,e.ajaxJSONP=function(i,o){if(!("type"in i))return e.ajax(i);var c,p,s=i.jsonpCallback,a=(e.isFunction(s)?s():s)||"Zepto"+n++,u=r.createElement("script"),f=t[a],l=function(t){e(u).triggerHandler("error",t||"abort")},h={abort:l};return o&&o.promise(h),e(u).on("load error",function(n,r){clearTimeout(p),e(u).off().remove(),"error"!=n.type&&c?y(c[0],h,i,o):x(null,r||"error",h,i,o),t[a]=f,c&&e.isFunction(f)&&f(c[0]),f=c=void 0}),v(h,i)===!1?(l("abort"),h):(t[a]=function(){c=arguments},u.src=i.url.replace(/\?(.+)=\?/,"?$1="+a),r.head.appendChild(u),i.timeout>0&&(p=setTimeout(function(){l("timeout")},i.timeout)),h)},e.ajaxSettings={type:"GET",beforeSend:j,success:j,error:j,complete:j,context:null,global:!0,xhr:function(){return new t.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:f,xml:"application/xml, text/xml",html:c,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:j},e.ajax=function(n){var u,f,s=e.extend({},n||{}),a=e.Deferred&&e.Deferred();for(i in e.ajaxSettings)void 0===s[i]&&(s[i]=e.ajaxSettings[i]);m(s),s.crossDomain||(u=r.createElement("a"),u.href=s.url,u.href=u.href,s.crossDomain=h.protocol+"//"+h.host!=u.protocol+"//"+u.host),s.url||(s.url=t.location.toString()),(f=s.url.indexOf("#"))>-1&&(s.url=s.url.slice(0,f)),S(s);var c=s.dataType,p=/\?.+=\?/.test(s.url);if(p&&(c="jsonp"),s.cache!==!1&&(n&&n.cache===!0||"script"!=c&&"jsonp"!=c)||(s.url=T(s.url,"_="+Date.now())),"jsonp"==c)return p||(s.url=T(s.url,s.jsonp?s.jsonp+"=?":s.jsonp===!1?"":"callback=?")),e.ajaxJSONP(s,a);var P,d=s.accepts[c],g={},b=function(t,e){g[t.toLowerCase()]=[t,e]},C=/^([\w-]+:)\/\//.test(s.url)?RegExp.$1:t.location.protocol,N=s.xhr(),O=N.setRequestHeader;if(a&&a.promise(N),s.crossDomain||b("X-Requested-With","XMLHttpRequest"),b("Accept",d||"*/*"),(d=s.mimeType||d)&&(d.indexOf(",")>-1&&(d=d.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(d)),(s.contentType||s.contentType!==!1&&s.data&&"GET"!=s.type.toUpperCase())&&b("Content-Type",s.contentType||"application/x-www-form-urlencoded"),s.headers)for(o in s.headers)b(o,s.headers[o]);if(N.setRequestHeader=b,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=j,clearTimeout(P);var t,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==C){if(c=c||w(s.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)t=N.response;else{t=N.responseText;try{t=E(t,c,s),"script"==c?(1,eval)(t):"xml"==c?t=N.responseXML:"json"==c&&(t=l.test(t)?null:e.parseJSON(t))}catch(r){n=r}if(n)return x(n,"parsererror",N,s,a)}y(t,N,s,a)}else x(N.statusText||null,N.status?"error":"abort",N,s,a)}},v(N,s)===!1)return N.abort(),x(null,"abort",N,s,a),N;var A="async"in s?s.async:!0;if(N.open(s.type,s.url,A,s.username,s.password),s.xhrFields)for(o in s.xhrFields)N[o]=s.xhrFields[o];for(o in g)O.apply(N,g[o]);return s.timeout>0&&(P=setTimeout(function(){N.onreadystatechange=j,N.abort(),x(null,"timeout",N,s,a)},s.timeout)),N.send(s.data?s.data:null),N},e.get=function(){return e.ajax(C.apply(null,arguments))},e.post=function(){var t=C.apply(null,arguments);return t.type="POST",e.ajax(t)},e.getJSON=function(){var t=C.apply(null,arguments);return t.dataType="json",e.ajax(t)},e.fn.load=function(t,n,r){if(!this.length)return this;var a,i=this,o=t.split(/\s/),u=C(t,n,r),f=u.success;return o.length>1&&(u.url=o[0],a=o[1]),u.success=function(t){i.html(a?e("
").html(t.replace(s,"")).find(a):t),f&&f.apply(i,arguments)},e.ajax(u),this};var N=encodeURIComponent;e.param=function(t,n){var r=[];return r.add=function(t,n){e.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(t)+"="+N(n))},O(r,t,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(e){var n=getComputedStyle;t.getComputedStyle=function(t,e){try{return n(t,e)}catch(r){return null}}}}(),e}); )====="; -const uint8_t JS_ZEPTO_GZIP[9713] PROGMEM = { 31,139,8,0,56,43,252,91,2,255,173,125,107,119,219,182,150,246,95,145,56,25,45,178,130,101,59,243,126,121,169,32,92,105,154,180,61,77,156,156,218,61,109,35,171,93,148,4,217,76,40,82,37,41,95,98,105,126,251,60,123,3,32,65,137,78,115,102,205,89,61,22,9,226,142,125,121,246,198,6,210,95,110,178,121,149,228,153,95,9,21,60,120,246,213,147,178,186,95,171,124,217,91,168,101,146,169,193,64,255,142,226,213,34,210,143,126,93,52,120,40,84,181,41,178,158,242,171,96,23,132,252,227,87,215,73,41,154,234,131,135,155,184,232,41,233,148,178,143,189,39,244,217,212,145,109,210,20,141,71,231,85,145,100,87,248,16,158,79,94,142,230,113,154,226,121,186,221,122,249,236,163,154,87,222,174,46,253,186,41,237,246,159,42,109,50,125,218,107,162,47,171,193,160,66,67,163,219,36,91,228,183,77,206,183,157,57,71,89,190,80,23,152,18,42,242,221,187,151,191,188,125,117,118,241,231,217,187,239,94,53,37,127,118,58,98,122,185,223,141,15,78,229,148,125,48,232,127,226,159,119,156,127,116,165,170,247,69,94,229,52,249,239,150,248,34,165,249,178,182,201,77,101,159,155,89,237,247,209,73,47,85,217,85,117,237,37,89,143,187,172,95,69,38,139,17,21,68,238,241,254,52,245,101,86,119,193,247,226,162,136,239,209,231,108,187,61,145,82,42,204,118,182,89,205,84,209,144,3,40,65,61,63,193,159,163,211,30,181,227,140,237,47,103,108,177,89,177,22,1,180,39,117,231,20,253,193,249,108,251,253,252,36,42,70,203,108,52,207,179,121,92,141,226,245,58,189,247,39,83,1,138,168,154,146,63,182,74,22,106,157,198,115,229,31,135,225,241,149,240,142,189,160,73,242,39,47,142,62,76,135,129,254,157,196,71,159,167,1,101,122,114,250,231,147,167,237,140,248,118,185,152,154,156,221,153,254,164,212,35,164,84,249,155,252,86,21,47,227,82,249,206,136,254,229,246,139,102,42,141,210,73,53,13,233,143,204,212,109,239,103,117,245,234,110,237,123,254,31,219,203,203,50,240,134,213,208,243,241,180,125,18,120,78,61,127,106,198,52,235,102,86,163,95,175,198,118,123,61,161,41,152,70,42,84,67,111,125,231,240,197,183,53,121,136,204,44,124,111,142,230,183,91,31,108,56,154,23,42,174,212,171,84,173,84,86,33,171,88,142,102,249,226,158,38,90,101,139,151,215,73,186,240,85,0,234,1,77,190,204,87,235,77,165,22,231,213,125,170,124,37,60,12,92,147,234,90,21,213,253,191,226,116,163,124,111,145,148,152,157,123,47,16,106,180,142,11,84,123,6,166,193,156,173,242,27,85,87,232,101,121,166,136,200,64,113,153,244,102,105,62,255,132,34,115,158,24,253,219,140,225,23,135,165,230,84,3,106,101,250,142,54,134,194,70,54,57,8,139,209,42,94,219,20,106,186,236,34,191,83,226,96,203,205,81,21,222,228,201,162,119,226,82,227,111,122,206,105,234,50,81,64,22,89,146,12,79,198,203,188,64,175,79,198,197,243,108,156,13,135,1,73,185,73,54,149,21,254,140,233,197,100,149,133,224,183,82,165,224,222,188,96,102,114,22,231,31,104,163,16,9,132,32,85,72,4,82,4,9,102,228,131,95,160,166,96,187,125,163,31,130,200,38,129,79,33,61,244,19,255,202,135,93,32,222,212,31,223,180,63,78,166,129,248,7,63,10,202,129,166,48,65,120,232,131,175,109,30,46,218,244,233,87,151,214,140,32,86,81,65,50,152,254,140,150,73,90,169,2,107,216,20,249,157,138,8,204,82,93,236,53,190,71,202,178,63,125,9,29,145,245,189,206,31,60,232,218,179,168,50,228,241,162,130,188,159,129,198,80,60,172,48,109,149,147,130,2,77,21,63,81,181,122,117,176,54,163,121,26,151,229,89,188,226,249,21,137,44,6,131,98,52,3,55,130,40,105,172,150,242,51,18,104,81,18,213,31,195,130,151,222,119,146,100,22,58,21,74,183,213,127,18,5,85,197,125,205,211,145,87,21,27,162,227,10,252,228,45,227,180,228,151,168,127,26,122,52,56,126,161,135,144,56,155,223,134,85,120,252,199,228,114,114,249,48,61,30,85,170,36,174,67,227,96,149,82,253,227,252,221,25,77,52,75,55,200,187,249,181,223,44,69,181,107,58,82,85,122,149,88,156,19,241,48,153,202,19,193,147,81,83,190,33,195,134,78,171,22,99,16,69,96,29,141,116,32,74,20,239,196,123,145,131,108,68,41,115,35,116,69,140,71,189,234,98,131,199,50,77,230,74,44,209,208,34,159,111,72,110,136,57,168,80,164,244,231,90,62,120,243,60,221,172,178,163,121,190,201,42,47,60,21,250,189,196,147,183,204,179,234,232,86,37,87,215,252,197,75,1,33,142,174,235,247,124,29,207,147,234,158,190,124,62,130,70,86,119,148,250,57,207,87,225,233,78,172,229,241,31,151,229,55,207,252,203,219,225,182,31,76,254,120,62,253,230,249,177,88,32,153,211,2,124,188,60,142,158,251,81,248,236,242,248,242,244,249,54,120,114,44,86,242,248,153,31,245,33,137,226,237,172,216,162,51,91,5,249,185,216,94,23,219,100,117,181,77,50,8,181,45,58,242,105,187,82,85,188,197,66,196,171,192,247,39,151,183,33,20,5,183,18,92,30,63,63,190,74,196,21,154,66,237,36,33,183,215,213,42,69,253,137,184,145,199,141,142,184,151,19,239,38,78,61,225,205,203,18,127,41,23,126,42,117,87,225,103,17,87,49,126,110,147,5,20,52,62,234,129,11,47,95,46,65,235,222,84,220,161,120,188,196,76,35,113,13,53,3,25,140,167,153,194,18,43,60,104,169,140,124,179,3,209,237,85,241,44,85,16,161,175,58,62,21,72,255,40,65,185,225,225,55,26,12,62,243,111,56,131,188,82,241,130,126,151,121,94,209,239,34,124,133,68,252,241,190,241,14,139,47,146,27,40,42,113,43,143,231,208,14,169,170,212,54,205,227,5,166,55,201,48,140,24,228,122,163,142,197,133,36,154,191,61,154,126,131,21,57,39,66,121,41,207,161,53,53,190,19,103,148,242,66,118,215,46,190,67,207,227,25,147,67,72,195,252,145,9,67,32,235,34,207,210,251,208,163,167,119,120,242,136,192,10,47,228,89,127,157,211,36,50,31,35,165,230,103,79,172,226,59,35,200,61,60,190,209,104,73,204,85,154,150,68,126,217,21,114,227,229,92,191,232,47,235,120,177,168,191,188,215,47,232,65,126,139,34,25,58,144,223,34,123,230,17,169,235,20,60,232,148,77,169,160,143,66,15,191,111,227,181,39,150,160,46,53,203,139,133,42,66,143,95,190,229,23,42,139,25,195,127,139,132,151,146,234,224,132,87,38,193,219,137,55,242,5,129,179,81,82,242,239,118,219,161,217,8,103,148,85,156,205,9,26,112,182,157,149,126,103,80,141,144,41,170,148,109,192,159,44,253,62,36,103,31,66,236,180,239,42,198,64,23,236,159,142,181,124,169,108,5,219,45,32,179,154,125,74,170,183,58,225,220,104,56,250,176,202,63,119,164,230,93,57,219,73,99,116,36,11,172,168,182,218,67,5,220,58,164,19,218,111,16,5,196,84,63,177,35,203,161,204,18,249,34,104,225,22,160,153,66,254,247,217,232,175,50,246,19,84,51,98,18,98,64,45,80,224,69,11,147,80,230,157,120,39,187,102,180,1,124,71,67,127,20,68,224,243,246,4,90,203,7,42,175,202,127,65,23,12,18,12,161,236,193,29,239,187,106,61,4,199,172,18,235,54,109,103,21,208,127,70,181,156,141,64,46,87,196,24,238,242,101,4,31,104,126,114,81,138,216,206,199,194,106,22,204,75,46,11,127,159,179,52,238,28,61,57,13,2,204,5,116,87,61,70,66,5,178,25,241,74,120,207,158,156,62,127,118,252,228,233,115,47,32,32,168,145,67,38,215,77,19,77,109,130,65,204,71,84,8,80,247,13,120,55,150,31,73,203,196,24,78,166,138,31,46,222,190,145,30,80,46,22,175,24,169,24,250,205,32,184,216,81,75,129,112,204,195,184,189,74,64,83,48,46,3,241,193,79,104,108,37,198,150,99,229,116,93,201,222,178,220,59,43,254,252,232,52,42,129,42,9,89,148,163,24,176,130,243,80,93,57,205,237,7,217,185,164,4,210,53,18,164,76,73,249,65,254,29,203,161,42,206,154,37,237,117,210,171,148,16,141,247,171,160,230,200,15,126,64,73,94,201,146,176,49,177,170,0,169,180,18,72,95,249,0,204,207,232,219,228,100,58,24,212,51,31,36,178,33,10,180,81,175,3,90,19,149,36,220,49,86,128,36,196,224,25,193,32,219,44,192,38,1,185,140,200,126,76,149,16,139,44,97,84,237,108,118,50,167,155,220,75,178,121,226,197,61,103,95,250,60,17,78,134,138,18,223,232,14,145,253,199,141,246,144,246,179,78,195,180,187,221,161,47,143,141,193,14,247,255,96,40,59,103,142,19,74,128,52,232,92,99,189,88,102,145,65,74,119,144,186,11,121,224,180,0,237,91,98,45,174,24,247,148,226,180,54,166,103,121,158,170,216,113,153,192,248,134,133,85,81,231,71,229,117,178,172,124,98,159,17,20,212,43,162,213,186,122,16,198,63,152,143,137,24,69,69,180,131,33,236,245,212,90,33,222,127,160,1,5,42,128,48,236,3,228,122,35,251,14,134,218,110,19,8,32,134,103,254,41,0,55,48,220,133,158,230,220,118,179,199,206,5,35,5,190,189,255,113,49,24,148,128,202,145,79,178,189,253,5,133,130,8,188,27,78,166,97,91,43,12,6,255,127,239,253,180,157,33,66,17,51,85,168,157,250,233,86,94,126,123,255,210,106,99,64,241,199,62,161,253,112,239,219,69,124,197,95,216,56,248,107,163,138,123,171,57,94,160,41,21,240,242,145,214,140,193,143,64,19,22,159,154,26,234,79,81,39,25,84,218,40,106,178,145,141,19,182,179,18,212,30,43,94,89,215,186,13,198,196,173,10,178,209,114,118,255,100,108,117,39,117,138,104,66,62,193,67,82,190,54,21,202,215,252,250,43,59,158,228,39,126,97,117,45,223,240,243,251,20,125,208,110,31,249,129,83,94,173,214,213,189,73,57,160,78,182,2,148,246,198,212,90,219,246,101,199,229,207,48,25,69,50,63,44,43,207,216,163,64,58,48,171,201,119,188,239,253,170,73,156,221,69,181,196,234,147,163,200,218,198,100,130,162,161,248,12,115,55,24,96,176,196,89,180,96,64,23,60,17,73,166,199,232,78,171,163,246,114,43,177,53,245,40,65,130,147,87,21,235,158,146,82,149,239,104,58,33,36,228,35,78,37,178,177,60,47,212,200,178,113,152,113,25,235,65,164,26,55,155,100,65,6,211,168,220,172,215,121,81,17,4,37,230,95,23,250,41,203,243,181,235,167,164,52,32,185,78,198,76,68,14,230,156,76,73,14,146,63,46,160,197,72,228,201,56,121,102,103,102,156,192,254,202,36,12,182,73,66,118,184,208,243,154,145,161,186,222,148,215,144,3,90,56,82,209,92,175,163,206,158,131,185,59,179,155,65,255,224,23,90,110,65,172,116,139,141,186,91,15,214,113,145,53,253,34,187,144,136,215,204,13,105,235,76,176,19,1,228,220,63,173,101,252,174,238,93,161,123,231,22,42,166,176,30,233,103,175,80,45,118,168,131,87,0,21,221,18,56,110,176,222,78,84,35,50,131,65,97,142,81,44,233,143,126,173,181,189,247,173,166,199,158,166,222,158,94,241,158,229,47,141,125,123,223,1,245,24,55,91,79,243,78,239,85,81,192,54,24,149,235,20,82,223,235,121,193,30,108,56,159,120,19,237,185,237,121,67,53,244,166,222,84,170,61,23,31,245,98,153,201,7,200,10,240,193,134,100,80,8,69,35,172,139,72,24,57,31,230,86,226,195,94,89,108,230,10,9,250,65,208,50,226,141,126,68,9,2,196,51,253,8,234,23,231,211,15,194,112,68,88,243,134,208,118,121,232,16,39,45,52,115,18,17,33,173,81,133,69,174,158,213,138,202,46,118,133,197,86,178,78,38,197,156,145,203,77,107,116,246,217,84,57,79,28,192,107,237,53,41,141,223,213,232,125,194,96,17,251,181,154,188,236,231,39,86,37,99,167,131,51,65,53,218,47,215,218,15,104,35,94,195,242,90,19,162,42,214,100,225,225,6,67,1,208,168,59,196,181,213,163,97,249,79,48,165,171,3,183,90,19,46,53,144,57,175,64,22,144,80,218,219,25,85,96,33,216,182,176,235,94,221,160,166,55,73,9,8,0,129,232,125,247,238,237,75,109,133,189,97,171,214,115,161,105,197,140,7,106,103,39,223,78,64,87,117,181,92,177,207,201,122,42,105,242,120,182,38,213,115,121,18,85,97,53,116,28,134,83,144,191,158,211,142,113,115,62,52,226,211,220,36,159,213,99,89,116,85,52,23,4,156,31,203,165,90,40,68,251,226,32,231,233,83,163,216,160,14,219,9,93,104,124,39,168,174,174,161,231,35,117,3,45,221,12,253,43,150,190,79,2,100,103,231,84,251,157,186,234,38,132,170,169,48,203,43,191,121,32,15,167,31,119,54,233,32,62,99,121,146,134,209,196,134,181,15,59,101,83,225,191,215,181,107,174,243,181,221,16,80,153,164,236,92,239,102,13,104,143,164,105,139,87,253,100,202,80,20,93,13,247,245,112,102,52,200,107,54,170,244,164,48,212,237,88,47,244,175,114,198,72,10,54,211,138,193,44,138,70,203,108,114,200,67,227,66,79,156,113,229,86,65,248,153,155,68,195,35,168,235,85,80,83,171,246,249,106,151,246,1,114,69,183,19,199,194,122,134,193,218,62,16,85,56,0,125,39,174,227,199,231,202,116,227,144,78,127,214,174,209,26,143,241,80,117,159,104,144,22,246,143,136,25,124,77,136,127,117,180,114,116,74,192,76,15,89,163,227,74,179,160,125,19,195,106,120,26,16,177,21,229,161,88,149,102,221,106,93,6,140,195,61,171,120,114,118,2,136,245,177,82,14,45,28,157,62,94,3,13,36,236,50,56,168,188,45,165,8,216,212,59,138,245,74,186,78,249,206,78,212,62,18,168,151,149,209,216,89,23,87,56,51,173,217,98,23,132,180,79,210,140,1,141,105,3,171,33,101,51,147,36,219,15,23,176,201,204,245,97,180,24,236,60,205,75,229,206,88,3,85,200,241,12,114,61,24,36,80,79,179,111,217,37,190,10,64,36,13,206,115,204,173,159,68,13,97,230,1,228,108,216,112,97,78,157,30,7,185,204,53,222,239,191,69,150,193,32,119,132,28,85,146,57,21,56,148,157,179,234,103,146,214,249,219,100,109,93,241,138,70,98,150,47,171,133,193,56,160,93,88,154,170,172,99,79,138,173,125,199,166,224,174,17,91,170,22,147,69,64,93,134,201,136,23,236,198,149,157,156,95,245,218,153,222,117,241,220,175,86,160,173,211,205,252,147,239,53,77,146,131,135,202,218,205,180,238,210,95,88,239,95,172,244,209,213,104,205,89,62,166,129,186,235,176,178,150,138,126,103,12,184,237,214,81,159,174,167,104,199,170,112,150,66,186,149,95,219,219,14,224,249,139,223,178,230,186,54,12,217,58,220,217,161,41,50,197,190,86,179,114,162,235,255,162,94,243,228,119,34,165,46,156,212,184,24,105,99,148,6,125,157,223,126,109,251,118,175,85,139,60,218,188,29,153,77,90,114,246,29,36,162,131,205,254,236,193,182,47,119,236,111,118,126,187,171,253,214,42,233,133,34,43,62,224,197,51,126,198,95,147,234,250,81,253,160,183,63,72,204,105,240,65,66,228,182,216,195,153,154,235,94,27,15,149,145,79,96,33,21,104,201,194,98,146,192,211,73,0,17,147,57,203,13,235,213,209,216,167,95,144,50,144,49,86,245,80,251,236,116,136,92,53,156,7,97,18,101,35,72,184,76,81,213,126,255,36,8,51,30,168,41,208,234,115,211,81,91,49,61,214,227,229,62,55,219,123,106,76,254,164,122,167,219,15,2,139,234,131,10,246,9,43,47,31,114,128,6,170,221,224,134,27,157,1,233,126,252,72,180,248,216,236,61,62,124,235,194,148,102,18,68,46,19,203,169,165,31,136,82,182,103,35,131,110,24,231,86,117,228,245,156,1,0,39,182,135,154,133,55,89,123,61,219,235,175,151,202,15,14,8,219,46,134,67,68,190,77,115,166,169,6,147,188,46,255,27,105,228,174,39,245,247,58,89,60,90,207,188,44,27,86,48,124,68,86,109,126,117,149,170,71,105,124,127,104,53,209,210,96,198,190,182,33,234,160,137,118,35,180,95,28,145,147,49,191,133,37,150,141,168,119,26,14,173,11,117,211,109,141,181,20,0,114,37,249,166,52,110,178,115,45,79,161,12,106,128,184,221,146,51,31,168,85,221,85,127,95,31,229,250,251,186,104,143,174,171,174,19,242,46,212,54,93,212,141,125,205,118,84,75,176,142,237,210,179,112,246,107,38,248,221,0,16,118,52,17,10,225,22,40,45,50,44,215,212,17,146,21,132,197,122,100,156,255,70,223,156,86,181,169,140,42,141,41,105,240,180,147,34,109,32,132,231,133,158,55,204,14,58,105,167,214,41,3,17,252,49,79,50,31,178,216,244,154,54,53,92,84,85,216,45,7,227,162,174,29,118,22,86,109,183,167,95,51,32,136,41,70,208,86,122,243,206,160,245,238,215,145,43,85,240,189,97,123,237,61,210,222,172,239,237,52,152,249,40,236,124,92,185,177,29,85,208,94,152,193,192,224,78,90,156,198,205,172,77,84,63,169,63,237,87,18,37,161,178,118,239,139,246,108,124,153,221,14,198,71,246,87,227,32,234,180,125,190,175,129,173,168,13,225,53,52,98,183,25,89,201,239,56,234,170,18,127,63,231,153,198,12,228,152,49,211,70,166,177,73,162,137,170,213,155,121,32,80,96,134,253,190,221,131,142,246,59,39,96,161,104,239,190,103,218,160,161,80,172,66,120,184,129,85,72,142,98,56,242,134,205,38,225,141,240,142,158,156,238,135,193,65,205,118,13,149,183,222,10,86,14,205,107,208,246,54,203,36,250,167,159,80,204,144,184,137,191,70,74,248,198,243,203,187,151,132,95,30,49,153,41,245,134,208,202,1,127,114,42,185,2,154,201,181,26,121,180,218,164,85,178,78,57,10,202,42,105,182,61,189,124,205,1,148,193,227,54,172,19,255,165,22,187,192,50,50,55,231,213,141,217,230,133,142,4,9,247,216,175,222,237,234,24,86,181,167,44,48,237,53,209,96,213,70,186,70,218,124,202,165,125,123,111,53,170,253,8,221,253,80,129,112,18,44,225,250,40,167,191,34,85,203,10,9,244,115,148,243,207,110,12,25,18,87,201,188,209,65,235,188,76,244,20,208,110,236,200,190,74,175,80,105,76,177,31,30,109,122,81,86,118,74,240,230,103,131,182,2,103,213,233,219,193,150,77,191,22,3,180,143,212,216,167,7,25,133,93,24,83,37,143,230,68,143,225,100,55,110,244,133,17,27,223,230,155,140,130,56,94,166,9,74,255,140,213,241,45,13,62,112,161,140,71,60,36,139,236,74,253,246,142,231,73,80,165,25,77,142,73,255,221,164,115,64,79,248,54,174,174,71,5,85,236,103,35,78,10,132,14,241,105,127,210,105,193,14,128,164,44,195,131,80,140,125,167,237,179,167,22,119,89,71,68,247,126,49,135,113,36,102,252,150,159,18,13,194,39,239,116,220,244,1,156,79,186,177,60,122,103,183,116,219,213,114,164,1,109,144,148,178,187,174,113,109,198,48,153,86,123,190,245,124,162,166,178,233,148,162,78,149,135,237,243,94,104,190,227,208,180,24,12,221,30,50,69,83,7,202,132,39,71,177,164,216,215,33,52,231,80,199,201,134,143,91,97,218,34,105,36,37,181,232,83,113,235,49,235,57,250,140,212,152,110,132,158,162,120,136,134,50,219,144,209,114,67,111,236,253,251,237,49,14,25,255,173,205,168,75,131,72,46,160,246,135,18,77,13,99,18,205,58,20,170,75,200,71,6,18,105,119,1,153,2,196,19,97,27,70,55,208,184,113,44,24,238,97,71,29,111,193,118,87,239,250,144,14,66,251,221,241,176,179,253,39,158,88,241,47,118,202,210,254,95,188,88,124,161,242,71,209,135,19,189,101,0,2,146,201,89,170,217,250,167,218,28,105,65,189,113,110,52,248,241,101,57,60,190,234,86,226,22,51,218,97,35,109,187,77,106,47,166,48,34,213,176,226,96,240,147,193,56,67,31,96,173,71,104,45,24,38,6,136,1,40,128,169,245,108,91,117,252,248,112,59,213,254,99,131,93,106,11,192,202,203,159,106,51,124,156,212,195,175,7,79,33,65,95,49,244,4,124,104,53,56,45,145,160,1,128,237,76,229,137,9,197,160,33,89,243,101,127,52,174,15,191,107,249,108,104,82,173,155,202,102,137,18,211,16,44,220,242,43,122,235,235,208,221,126,238,46,21,108,107,144,164,165,42,74,200,71,206,188,251,198,137,169,23,164,156,23,121,154,94,236,193,35,99,131,91,133,100,116,169,87,103,182,139,224,58,128,185,39,89,109,61,52,21,219,20,71,55,56,194,33,139,14,24,220,150,148,213,46,124,236,163,239,188,253,166,253,178,118,48,111,72,83,125,245,104,40,247,87,15,135,171,118,199,243,219,87,143,135,138,126,121,64,194,121,255,93,15,200,34,7,183,84,215,104,106,119,188,80,26,177,183,17,141,113,186,54,192,38,145,87,90,24,41,107,75,176,243,41,106,3,132,80,213,37,106,36,202,80,72,242,158,243,235,52,215,59,63,129,70,61,43,232,232,36,59,66,6,176,60,84,132,208,104,225,203,185,41,135,201,206,48,107,216,206,173,24,86,114,1,29,30,74,213,31,233,80,97,91,138,33,201,223,21,227,158,184,229,30,106,216,114,148,52,200,206,116,89,87,186,219,89,232,249,126,207,111,252,69,39,137,117,77,85,135,75,177,221,234,189,213,49,109,118,152,37,168,154,249,31,12,26,40,217,204,84,131,38,201,167,85,181,42,108,66,9,136,92,248,80,208,66,85,20,243,192,207,154,237,197,100,63,184,122,218,41,77,108,56,107,29,216,57,58,238,84,101,68,51,173,136,78,82,219,104,142,76,179,3,41,7,233,182,199,90,9,179,214,39,96,223,168,156,120,236,101,128,117,63,13,223,114,202,62,134,157,24,62,229,44,126,222,38,100,218,162,160,163,67,221,74,178,108,36,44,207,100,109,111,39,80,133,28,246,200,22,54,68,185,184,235,8,65,171,99,72,101,242,159,79,245,0,179,169,220,119,71,137,24,35,212,238,233,38,2,110,127,86,89,47,215,167,45,158,176,94,169,79,148,69,32,129,78,45,108,247,129,173,249,221,231,99,26,86,13,135,197,232,179,90,87,185,9,59,140,18,237,119,164,221,216,74,111,136,7,230,20,71,243,193,13,42,228,177,99,140,97,179,179,148,109,183,54,88,168,10,91,121,145,115,35,59,61,194,53,32,63,101,89,217,185,20,164,17,99,153,71,89,232,186,152,33,149,78,200,168,205,70,228,27,51,78,49,218,91,163,36,118,220,242,134,122,248,148,83,216,157,195,216,102,46,191,104,243,196,164,58,15,230,83,99,166,77,64,33,106,45,207,101,29,124,217,143,155,232,73,213,120,213,199,20,165,91,2,162,126,171,29,208,52,24,49,31,12,42,8,79,177,87,125,223,88,220,170,102,233,237,214,59,127,249,243,143,239,47,188,190,155,220,102,159,237,86,113,44,28,216,159,92,89,199,31,227,155,24,68,159,172,43,93,138,190,81,158,178,152,7,150,75,33,154,111,193,56,118,47,40,218,123,135,20,88,198,48,208,255,149,168,219,176,26,103,35,5,91,218,238,114,170,198,181,199,56,70,239,57,16,125,99,137,134,222,69,14,4,167,199,236,13,253,36,242,244,200,145,248,130,15,97,4,83,217,237,237,12,192,31,134,225,24,92,128,104,206,70,31,154,104,51,249,155,243,76,237,225,243,38,75,254,146,239,241,176,80,104,48,137,211,228,179,98,107,71,254,83,24,2,151,103,162,216,249,78,176,230,7,78,85,66,239,242,145,37,50,122,66,142,137,209,19,233,110,83,41,231,24,237,117,139,161,254,252,156,44,56,188,155,30,36,197,122,53,135,136,214,205,177,45,142,94,228,131,121,88,185,50,208,140,188,242,249,197,244,198,143,39,215,218,136,156,76,15,253,29,78,155,232,95,95,141,104,91,101,164,104,77,73,216,83,74,86,18,178,182,138,160,12,56,25,124,120,77,66,33,163,192,49,138,106,227,84,62,28,80,42,208,87,17,184,103,242,22,205,94,133,79,97,228,22,230,122,163,218,240,124,80,33,199,195,102,101,216,196,194,114,96,149,31,52,56,221,57,74,181,114,227,7,221,35,153,81,248,199,182,23,184,126,46,148,4,72,30,125,211,139,128,250,41,67,111,239,156,230,85,219,229,135,149,78,161,253,150,228,76,228,208,204,249,118,219,239,59,7,225,110,156,182,83,118,207,33,175,62,157,233,156,110,189,215,97,254,130,34,252,55,98,169,103,96,46,121,7,120,45,227,201,156,14,115,210,15,29,247,3,3,212,96,250,56,232,12,55,38,35,131,163,160,72,14,6,245,169,109,43,93,108,172,119,162,207,93,196,160,139,140,100,195,50,147,137,136,121,89,74,252,242,128,82,62,119,209,173,89,211,184,82,139,11,104,10,101,117,55,173,118,102,92,58,180,53,183,23,217,1,48,79,173,116,199,118,213,27,221,104,26,211,42,55,70,64,110,64,84,232,28,184,237,206,137,42,53,110,51,121,65,36,141,134,146,242,199,213,74,45,18,116,137,204,240,248,42,166,108,231,0,67,107,181,128,250,120,80,35,242,106,202,220,152,148,115,219,9,240,195,159,232,68,9,74,140,38,106,26,226,255,86,195,152,47,65,224,30,46,236,159,82,112,240,136,182,84,104,255,90,139,38,159,216,170,68,99,78,219,28,13,14,32,3,153,43,215,246,144,246,90,107,188,152,116,230,94,44,90,125,158,251,32,72,237,198,199,98,208,180,240,28,136,43,63,6,141,180,216,230,206,50,122,163,231,137,120,198,62,31,151,12,190,76,48,152,202,70,80,116,126,54,190,227,120,146,79,39,152,234,169,240,180,70,233,238,127,199,55,12,129,196,4,29,24,54,67,80,116,82,117,215,26,196,133,107,110,250,25,29,87,194,178,154,25,126,175,231,91,45,72,124,100,124,252,164,162,250,88,59,223,186,81,103,118,83,68,102,88,202,113,69,238,168,110,172,59,41,166,114,38,146,193,32,49,180,144,57,212,184,227,96,87,249,138,182,22,71,85,178,82,231,85,188,90,179,160,173,223,36,133,158,66,15,222,210,82,251,153,213,83,117,87,251,68,83,135,201,116,156,141,58,193,170,129,102,45,139,8,221,214,73,76,100,64,23,236,51,115,169,140,98,84,14,18,25,56,250,93,51,37,103,20,237,209,204,239,185,27,119,244,144,23,9,108,150,56,229,117,10,171,157,27,94,254,209,24,84,208,230,60,127,146,142,30,248,52,159,146,222,107,126,184,32,39,153,62,94,90,160,206,83,216,98,250,248,90,19,148,173,207,146,66,195,57,129,241,162,236,80,186,135,254,78,176,14,249,33,55,244,103,41,189,60,91,66,126,149,137,62,24,78,39,82,249,61,244,108,178,152,165,155,194,188,230,155,202,227,3,171,171,124,83,42,154,14,124,225,103,144,102,225,9,126,76,85,124,163,108,50,21,24,111,128,167,146,249,39,185,25,113,226,2,56,196,62,111,214,246,137,168,91,122,111,233,145,39,175,244,136,14,233,73,62,80,144,225,189,141,203,188,219,89,130,151,93,219,44,79,91,59,28,68,134,123,103,79,158,178,59,61,103,31,173,22,212,29,132,92,211,110,161,3,233,72,112,237,215,4,244,236,80,246,184,14,141,97,200,192,90,38,38,111,112,73,218,217,66,160,200,47,0,104,244,185,22,142,25,175,106,246,181,77,2,31,130,219,130,208,36,219,108,227,234,186,200,111,89,213,18,210,231,96,108,223,83,119,107,222,33,233,213,151,82,80,148,13,105,3,58,248,249,216,113,1,109,33,217,84,83,96,147,29,20,217,43,176,92,154,80,115,206,15,132,188,87,191,115,144,189,213,2,4,232,105,160,55,19,102,135,147,77,199,44,94,117,36,159,238,196,71,58,55,204,103,132,183,14,39,63,217,166,241,189,42,38,191,253,62,125,178,53,167,41,65,24,108,10,82,90,112,44,110,229,67,91,149,0,174,30,112,178,39,72,183,116,41,56,202,253,5,197,167,11,238,229,239,200,182,27,43,109,110,167,10,31,212,223,173,134,61,181,97,86,227,235,138,97,77,90,229,210,228,70,201,78,79,99,131,84,216,193,16,212,253,242,91,119,45,112,101,38,240,67,119,63,249,218,10,155,62,255,77,149,121,214,62,138,25,59,248,76,164,226,186,21,127,73,142,16,114,73,82,0,95,231,222,200,245,168,174,6,246,22,25,162,215,65,200,108,183,221,230,48,232,182,219,13,11,127,8,219,141,140,33,254,50,186,213,5,186,101,163,69,112,172,207,94,64,222,235,207,5,89,178,6,146,108,228,43,84,215,25,53,137,175,243,46,51,231,142,66,37,217,34,19,27,212,212,13,203,208,73,58,12,148,30,96,192,130,194,129,72,29,50,0,12,70,38,234,19,146,40,183,113,88,181,93,61,24,148,80,134,57,100,10,153,11,124,252,206,39,117,36,30,230,155,130,108,104,141,34,195,82,16,85,188,78,10,104,201,28,45,251,192,211,155,192,116,172,20,208,200,143,137,56,65,7,93,29,12,121,79,99,195,98,197,152,237,116,187,157,235,24,112,189,166,203,101,231,249,218,248,223,91,204,216,136,25,115,174,47,118,86,50,161,45,6,187,146,137,93,197,196,46,85,66,75,21,31,236,8,221,53,142,243,204,233,46,212,226,213,149,42,186,41,187,146,122,67,67,181,207,147,81,191,213,136,181,19,121,87,46,56,148,212,224,220,172,59,62,64,19,2,219,48,176,221,15,47,136,210,129,3,156,105,26,185,47,116,8,154,2,149,40,250,150,91,244,90,113,45,173,79,212,25,101,54,100,204,184,126,136,179,69,74,97,67,66,135,209,185,99,54,223,186,180,167,72,190,20,198,135,213,120,40,228,185,95,238,77,4,157,1,175,167,161,48,164,11,86,50,75,188,6,178,174,140,139,162,10,186,143,128,39,210,170,187,34,224,67,119,95,180,59,232,158,144,250,230,25,144,192,78,88,184,210,179,56,69,63,244,8,188,244,232,102,133,94,161,40,220,189,167,93,133,189,77,198,137,140,75,122,139,89,170,31,106,120,210,51,224,164,87,67,147,94,13,115,122,22,217,244,26,20,212,107,144,79,111,126,29,103,87,104,136,133,95,239,147,186,231,10,241,11,141,84,150,244,128,122,213,254,89,170,78,255,158,218,119,153,170,47,134,84,205,56,174,191,222,201,53,203,77,190,185,29,161,12,94,175,61,253,174,233,220,28,184,213,126,164,192,216,114,181,112,55,71,224,121,181,55,108,100,123,6,161,209,69,1,253,147,49,71,90,88,159,118,66,29,83,129,55,219,204,102,169,42,61,114,205,33,87,95,77,146,105,152,225,143,164,167,102,183,128,78,58,26,74,2,78,232,159,4,226,130,194,196,119,254,99,142,154,181,185,25,199,216,35,150,14,155,131,125,28,242,106,7,159,32,167,232,39,29,64,222,111,59,72,24,168,36,14,2,188,74,243,89,156,70,107,178,246,10,254,102,105,174,237,3,177,57,7,3,222,87,31,233,187,59,134,195,193,128,106,101,56,231,197,31,227,59,24,55,69,181,231,245,112,75,247,143,142,108,225,195,162,180,99,210,242,127,52,177,255,218,29,0,241,95,143,223,68,194,158,67,31,88,135,30,229,55,162,115,193,7,134,184,222,111,235,124,158,152,32,139,57,134,88,179,151,147,213,205,212,118,177,40,119,53,50,219,25,24,39,94,185,153,207,65,242,30,249,86,244,163,238,78,130,238,228,130,78,36,210,177,76,112,69,158,222,232,40,212,132,90,200,169,13,177,32,247,186,105,219,212,35,38,28,207,133,143,51,8,163,246,197,70,29,182,122,209,76,204,136,249,77,183,158,147,110,33,220,205,54,106,161,72,178,115,227,185,152,240,23,110,28,58,94,55,174,79,61,210,39,224,24,168,4,110,93,143,185,105,125,102,177,153,182,65,234,89,24,211,147,190,223,69,55,94,232,166,105,112,133,174,255,165,249,174,71,135,218,175,124,119,92,175,108,205,116,128,159,157,45,175,217,133,40,229,199,230,180,232,126,171,53,115,53,249,109,243,12,224,235,218,63,210,1,221,250,237,118,207,29,73,91,73,70,66,141,61,216,77,180,101,38,244,7,57,143,244,29,61,33,158,151,145,247,177,132,86,11,227,250,98,38,207,120,167,195,77,115,221,133,119,135,252,144,54,250,86,159,182,135,162,185,165,141,14,230,71,85,232,87,67,111,224,13,149,115,107,220,100,16,77,31,78,197,211,221,177,240,34,151,29,206,53,35,65,127,16,153,124,135,49,147,195,100,193,191,77,244,166,50,247,248,241,7,109,221,179,239,138,143,48,196,43,243,74,154,170,136,23,188,157,22,167,48,245,251,58,157,60,171,198,3,255,253,43,242,213,235,215,182,155,30,31,105,34,214,252,153,74,93,176,210,67,213,155,34,149,23,250,87,152,30,152,95,169,133,138,51,156,151,90,192,57,194,200,53,243,65,29,12,118,10,200,94,130,64,166,184,104,229,41,2,134,72,148,199,126,127,64,211,97,165,195,19,51,97,248,49,44,132,237,102,152,56,206,221,119,77,23,236,22,157,178,231,236,209,1,17,203,125,104,68,199,176,205,246,182,112,54,200,54,193,67,110,103,126,195,44,231,3,181,69,73,152,12,189,137,55,244,227,230,78,74,32,89,188,216,61,47,218,10,162,32,17,111,234,145,252,6,212,141,216,135,231,111,70,89,188,2,180,54,161,127,97,83,98,187,229,171,29,154,234,34,26,198,70,232,160,73,46,76,29,218,105,215,10,249,133,51,57,36,123,154,28,78,124,3,88,125,49,87,41,143,159,105,10,190,156,77,254,120,54,253,198,143,66,63,234,63,187,60,214,169,207,131,103,156,28,124,211,36,209,69,87,177,190,232,138,8,124,75,240,58,153,51,112,9,46,157,29,155,227,4,230,197,99,217,192,34,248,190,148,158,147,124,204,204,37,230,82,239,253,232,171,177,82,125,169,215,147,99,65,27,185,123,247,63,197,94,48,190,30,93,23,138,110,27,75,115,93,13,191,11,171,98,228,9,61,66,254,208,9,113,231,162,157,132,108,27,222,168,242,104,209,8,117,38,181,251,66,151,176,30,238,185,88,99,162,146,17,147,252,75,136,151,89,60,255,132,41,240,91,164,72,59,182,0,179,37,49,62,111,203,120,195,108,56,196,20,28,244,218,136,140,128,238,72,155,196,83,209,54,142,136,126,246,209,173,167,97,20,201,101,47,158,229,172,94,233,42,53,126,14,211,157,115,205,81,78,226,97,149,128,75,175,193,43,84,23,170,245,24,4,154,74,28,170,133,58,155,3,204,21,23,201,138,128,158,191,182,69,96,154,52,251,126,194,52,223,135,228,213,162,97,30,221,251,115,218,69,185,166,109,135,32,188,51,222,28,116,207,52,162,63,8,26,159,92,210,38,97,107,174,150,116,180,154,107,160,73,152,203,218,238,186,241,81,208,40,103,63,245,237,96,217,208,213,117,53,38,199,188,57,167,190,3,155,148,197,28,107,4,230,111,4,233,101,228,143,134,129,188,140,72,144,62,57,149,222,48,38,208,77,55,152,181,46,130,34,134,101,191,44,230,128,142,228,250,107,89,170,202,78,138,211,36,122,100,178,209,2,212,101,2,234,224,206,208,217,185,170,42,58,110,38,31,104,174,66,150,162,162,1,42,225,199,90,38,125,20,60,89,248,181,186,147,31,89,181,241,30,175,208,144,41,236,159,136,187,235,162,35,230,130,152,186,26,253,246,246,205,15,85,181,254,89,253,181,129,10,218,137,24,213,175,171,50,124,208,132,22,238,111,165,138,94,139,233,30,73,191,59,114,54,95,5,209,126,184,20,96,219,176,197,178,72,16,61,174,159,148,158,62,180,49,215,231,35,116,179,107,146,157,222,78,192,28,129,202,202,87,120,11,251,167,194,204,92,120,34,28,109,70,3,157,67,180,42,122,104,84,122,248,209,206,173,220,63,107,180,17,75,22,217,198,41,240,176,19,217,118,75,55,94,146,224,6,16,198,4,171,5,17,159,125,246,245,121,41,13,222,91,235,21,212,123,168,37,112,59,69,43,51,134,111,229,65,74,48,94,249,58,140,162,25,16,59,92,186,132,19,200,146,133,83,201,250,208,188,232,159,118,13,242,90,59,189,231,121,58,244,142,143,189,33,164,90,94,86,125,100,110,167,111,56,157,218,71,141,104,151,127,93,225,103,239,204,227,77,5,211,114,29,198,233,253,135,23,208,77,87,28,139,77,5,245,103,189,13,122,66,219,66,2,86,175,145,122,248,104,117,38,93,173,120,25,141,134,196,74,26,231,112,65,118,48,175,217,63,100,240,0,79,12,173,96,223,56,43,50,218,117,224,20,98,234,19,8,136,122,59,127,238,160,136,121,80,143,229,66,255,10,239,79,240,171,179,69,2,49,164,115,3,147,89,57,189,62,40,85,106,41,29,153,223,161,39,35,47,52,47,90,172,208,17,154,185,17,226,248,24,4,174,126,240,75,10,154,160,225,191,23,11,76,128,97,165,201,124,42,174,104,35,97,182,103,86,94,145,27,195,61,212,48,149,108,58,208,253,133,228,210,165,43,13,135,33,244,221,229,113,107,226,162,250,254,170,208,89,59,187,212,226,12,77,131,227,33,122,223,201,51,186,230,212,240,246,15,144,92,138,175,107,1,226,139,107,73,127,118,64,143,51,223,251,237,200,20,82,139,35,130,253,158,240,218,130,194,35,128,239,189,224,17,122,98,65,231,174,142,233,74,54,159,6,190,2,127,106,80,199,91,102,139,134,132,132,103,40,104,33,23,22,53,139,26,53,159,141,200,117,80,36,11,245,214,212,64,55,28,236,167,249,11,162,206,250,24,175,110,168,245,106,232,167,180,232,86,99,209,178,3,139,162,123,24,134,57,244,116,68,101,61,177,87,115,91,98,29,221,222,222,30,65,8,172,142,176,18,42,155,231,116,111,7,205,224,53,207,110,25,212,55,236,52,73,100,135,213,111,147,124,106,174,57,219,95,25,57,163,9,200,120,127,156,194,215,148,246,145,200,118,204,226,255,147,88,84,231,154,145,135,206,50,80,5,174,106,126,175,201,18,112,21,19,99,90,71,238,77,249,92,62,61,225,107,36,244,235,179,255,58,1,151,253,215,9,55,162,147,56,70,221,190,144,119,46,161,219,35,165,124,201,189,153,203,249,118,123,235,187,75,126,70,14,216,159,85,185,206,179,82,233,145,249,246,182,201,35,70,75,129,141,218,154,109,150,75,190,249,155,70,164,11,152,57,159,65,119,29,164,7,149,147,160,175,160,112,83,40,142,125,76,247,231,86,146,236,193,185,128,164,181,2,131,76,49,255,84,80,244,78,64,206,56,182,178,40,209,173,0,20,30,106,27,77,146,124,129,1,151,214,166,26,95,179,171,90,23,233,6,230,18,93,224,32,160,245,157,123,189,36,32,141,240,56,111,97,32,205,25,93,160,24,236,200,21,96,30,57,94,234,174,94,9,234,189,14,27,19,54,41,50,120,40,52,72,198,150,220,1,233,224,177,125,27,210,217,136,51,129,235,13,158,106,23,18,103,76,1,47,128,153,203,251,108,78,136,181,132,156,227,151,80,123,167,64,72,64,53,190,102,19,173,35,196,11,250,197,40,216,154,160,40,255,178,188,205,139,5,17,60,68,204,235,68,165,139,22,201,55,137,103,32,116,233,36,224,117,92,103,188,10,222,217,91,127,196,21,115,68,29,5,231,34,169,247,143,32,169,71,72,254,112,10,44,222,178,51,39,74,7,117,17,7,210,33,97,150,18,145,254,97,228,132,79,132,25,200,61,219,241,15,16,104,116,255,210,221,136,108,93,18,164,232,156,82,37,15,110,203,120,164,68,19,142,197,225,92,222,251,119,231,23,158,209,42,124,72,128,59,194,215,84,253,251,85,90,21,172,53,236,94,181,180,15,6,100,223,222,143,208,225,90,93,199,168,120,131,130,247,42,132,62,44,36,242,218,243,193,209,29,176,86,140,81,78,184,124,99,189,89,205,13,33,54,228,145,118,140,88,239,230,100,5,196,248,57,157,18,218,49,5,100,251,14,24,66,133,126,28,41,223,123,182,72,110,158,123,129,78,105,2,167,248,168,130,57,51,23,179,159,125,73,119,47,233,169,73,90,113,21,102,252,27,179,207,198,195,57,147,90,140,255,242,243,143,228,101,202,51,10,7,54,238,142,206,189,243,38,4,181,32,115,121,47,207,161,23,34,147,58,30,71,159,194,213,87,210,219,67,132,28,145,115,198,39,140,0,88,206,248,236,142,120,231,155,205,192,194,196,148,13,220,127,22,224,63,159,158,208,63,12,48,244,246,221,191,236,222,193,162,214,241,127,123,151,225,213,1,24,124,155,156,72,186,111,163,53,30,246,168,137,165,181,46,93,115,55,220,3,201,130,80,9,246,44,132,20,48,237,238,134,232,131,163,102,215,202,4,248,43,115,199,162,104,239,13,102,50,215,162,70,225,129,5,140,98,253,66,210,66,17,198,203,221,56,79,7,38,13,6,253,156,246,118,232,222,226,5,57,175,54,179,85,82,233,155,3,61,8,115,101,159,103,155,170,178,255,2,5,43,46,123,187,32,249,174,114,147,14,116,57,255,52,203,239,244,93,131,249,136,223,57,214,39,241,233,114,75,114,161,232,115,254,5,93,31,231,78,240,33,71,54,180,97,246,118,221,165,240,187,35,156,42,61,175,135,84,72,17,146,20,206,206,180,209,249,89,123,119,248,14,130,134,84,108,47,121,86,246,163,214,218,59,34,65,179,35,98,103,145,110,68,182,161,188,29,167,61,42,179,145,96,179,155,227,230,234,47,255,164,217,78,200,232,88,102,215,94,130,185,13,67,239,208,154,30,250,237,59,36,218,52,173,47,196,63,56,12,104,189,129,245,45,246,186,115,251,249,198,28,192,221,74,218,131,224,206,117,251,58,165,209,233,206,233,209,29,254,71,97,118,187,96,252,63,228,97,87,78,206,102,0,0 }; +const uint8_t JS_ZEPTO_GZIP[9713] PROGMEM = { 31,139,8,0,198,31,124,92,2,255,173,125,107,119,219,182,150,246,95,145,56,25,45,178,130,101,59,243,126,121,169,32,92,105,154,180,61,77,156,156,218,61,109,35,171,93,148,4,217,76,40,82,37,41,95,98,105,126,251,60,123,3,32,65,137,78,115,102,205,89,61,22,9,226,142,125,121,246,198,6,210,95,110,178,121,149,228,153,95,9,21,60,120,246,213,147,178,186,95,171,124,217,91,168,101,146,169,193,64,255,142,226,213,34,210,143,126,93,52,120,40,84,181,41,178,158,242,171,96,23,132,252,227,87,215,73,41,154,234,131,135,155,184,232,41,233,148,178,143,189,39,244,217,212,145,109,210,20,141,71,231,85,145,100,87,248,16,158,79,94,142,230,113,154,226,121,186,221,122,249,236,163,154,87,222,174,46,253,186,41,237,246,159,42,109,50,125,218,107,162,47,171,193,160,66,67,163,219,36,91,228,183,77,206,183,157,57,71,89,190,80,23,152,18,42,242,221,187,151,191,188,125,117,118,241,231,217,187,239,94,53,37,127,118,58,98,122,185,223,141,15,78,229,148,125,48,232,127,226,159,119,156,127,116,165,170,247,69,94,229,52,249,239,150,248,34,165,249,178,182,201,77,101,159,155,89,237,247,209,73,47,85,217,85,117,237,37,89,143,187,172,95,69,38,139,17,21,68,238,241,254,52,245,101,86,119,193,247,226,162,136,239,209,231,108,187,61,145,82,42,204,118,182,89,205,84,209,144,3,40,65,61,63,193,159,163,211,30,181,227,140,237,47,103,108,177,89,177,22,1,180,39,117,231,20,253,193,249,108,251,253,252,36,42,70,203,108,52,207,179,121,92,141,226,245,58,189,247,39,83,1,138,168,154,146,63,182,74,22,106,157,198,115,229,31,135,225,241,149,240,142,189,160,73,242,39,47,142,62,76,135,129,254,157,196,71,159,167,1,101,122,114,250,231,147,167,237,140,248,118,185,152,154,156,221,153,254,164,212,35,164,84,249,155,252,86,21,47,227,82,249,206,136,254,229,246,139,102,42,141,210,73,53,13,233,143,204,212,109,239,103,117,245,234,110,237,123,254,31,219,203,203,50,240,134,213,208,243,241,180,125,18,120,78,61,127,106,198,52,235,102,86,163,95,175,198,118,123,61,161,41,152,70,42,84,67,111,125,231,240,197,183,53,121,136,204,44,124,111,142,230,183,91,31,108,56,154,23,42,174,212,171,84,173,84,86,33,171,88,142,102,249,226,158,38,90,101,139,151,215,73,186,240,85,0,234,1,77,190,204,87,235,77,165,22,231,213,125,170,124,37,60,12,92,147,234,90,21,213,253,191,226,116,163,124,111,145,148,152,157,123,47,16,106,180,142,11,84,123,6,166,193,156,173,242,27,85,87,232,101,121,166,136,200,64,113,153,244,102,105,62,255,132,34,115,158,24,253,219,140,225,23,135,165,230,84,3,106,101,250,142,54,134,194,70,54,57,8,139,209,42,94,219,20,106,186,236,34,191,83,226,96,203,205,81,21,222,228,201,162,119,226,82,227,111,122,206,105,234,50,81,64,22,89,146,12,79,198,203,188,64,175,79,198,197,243,108,156,13,135,1,73,185,73,54,149,21,254,140,233,197,100,149,133,224,183,82,165,224,222,188,96,102,114,22,231,31,104,163,16,9,132,32,85,72,4,82,4,9,102,228,131,95,160,166,96,187,125,163,31,130,200,38,129,79,33,61,244,19,255,202,135,93,32,222,212,31,223,180,63,78,166,129,248,7,63,10,202,129,166,48,65,120,232,131,175,109,30,46,218,244,233,87,151,214,140,32,86,81,65,50,152,254,140,150,73,90,169,2,107,216,20,249,157,138,8,204,82,93,236,53,190,71,202,178,63,125,9,29,145,245,189,206,31,60,232,218,179,168,50,228,241,162,130,188,159,129,198,80,60,172,48,109,149,147,130,2,77,21,63,81,181,122,117,176,54,163,121,26,151,229,89,188,226,249,21,137,44,6,131,98,52,3,55,130,40,105,172,150,242,51,18,104,81,18,213,31,195,130,151,222,119,146,100,22,58,21,74,183,213,127,18,5,85,197,125,205,211,145,87,21,27,162,227,10,252,228,45,227,180,228,151,168,127,26,122,52,56,126,161,135,144,56,155,223,134,85,120,252,199,228,114,114,249,48,61,30,85,170,36,174,67,227,96,149,82,253,227,252,221,25,77,52,75,55,200,187,249,181,223,44,69,181,107,58,82,85,122,149,88,156,19,241,48,153,202,19,193,147,81,83,190,33,195,134,78,171,22,99,16,69,96,29,141,116,32,74,20,239,196,123,145,131,108,68,41,115,35,116,69,140,71,189,234,98,131,199,50,77,230,74,44,209,208,34,159,111,72,110,136,57,168,80,164,244,231,90,62,120,243,60,221,172,178,163,121,190,201,42,47,60,21,250,189,196,147,183,204,179,234,232,86,37,87,215,252,197,75,1,33,142,174,235,247,124,29,207,147,234,158,190,124,62,130,70,86,119,148,250,57,207,87,225,233,78,172,229,241,31,151,229,55,207,252,203,219,225,182,31,76,254,120,62,253,230,249,177,88,32,153,211,2,124,188,60,142,158,251,81,248,236,242,248,242,244,249,54,120,114,44,86,242,248,153,31,245,33,137,226,237,172,216,162,51,91,5,249,185,216,94,23,219,100,117,181,77,50,8,181,45,58,242,105,187,82,85,188,197,66,196,171,192,247,39,151,183,33,20,5,183,18,92,30,63,63,190,74,196,21,154,66,237,36,33,183,215,213,42,69,253,137,184,145,199,141,142,184,151,19,239,38,78,61,225,205,203,18,127,41,23,126,42,117,87,225,103,17,87,49,126,110,147,5,20,52,62,234,129,11,47,95,46,65,235,222,84,220,161,120,188,196,76,35,113,13,53,3,25,140,167,153,194,18,43,60,104,169,140,124,179,3,209,237,85,241,44,85,16,161,175,58,62,21,72,255,40,65,185,225,225,55,26,12,62,243,111,56,131,188,82,241,130,126,151,121,94,209,239,34,124,133,68,252,241,190,241,14,139,47,146,27,40,42,113,43,143,231,208,14,169,170,212,54,205,227,5,166,55,201,48,140,24,228,122,163,142,197,133,36,154,191,61,154,126,131,21,57,39,66,121,41,207,161,53,53,190,19,103,148,242,66,118,215,46,190,67,207,227,25,147,67,72,195,252,145,9,67,32,235,34,207,210,251,208,163,167,119,120,242,136,192,10,47,228,89,127,157,211,36,50,31,35,165,230,103,79,172,226,59,35,200,61,60,190,209,104,73,204,85,154,150,68,126,217,21,114,227,229,92,191,232,47,235,120,177,168,191,188,215,47,232,65,126,139,34,25,58,144,223,34,123,230,17,169,235,20,60,232,148,77,169,160,143,66,15,191,111,227,181,39,150,160,46,53,203,139,133,42,66,143,95,190,229,23,42,139,25,195,127,139,132,151,146,234,224,132,87,38,193,219,137,55,242,5,129,179,81,82,242,239,118,219,161,217,8,103,148,85,156,205,9,26,112,182,157,149,126,103,80,141,144,41,170,148,109,192,159,44,253,62,36,103,31,66,236,180,239,42,198,64,23,236,159,142,181,124,169,108,5,219,45,32,179,154,125,74,170,183,58,225,220,104,56,250,176,202,63,119,164,230,93,57,219,73,99,116,36,11,172,168,182,218,67,5,220,58,164,19,218,111,16,5,196,84,63,177,35,203,161,204,18,249,34,104,225,22,160,153,66,254,247,217,232,175,50,246,19,84,51,98,18,98,64,45,80,224,69,11,147,80,230,157,120,39,187,102,180,1,124,71,67,127,20,68,224,243,246,4,90,203,7,42,175,202,127,65,23,12,18,12,161,236,193,29,239,187,106,61,4,199,172,18,235,54,109,103,21,208,127,70,181,156,141,64,46,87,196,24,238,242,101,4,31,104,126,114,81,138,216,206,199,194,106,22,204,75,46,11,127,159,179,52,238,28,61,57,13,2,204,5,116,87,61,70,66,5,178,25,241,74,120,207,158,156,62,127,118,252,228,233,115,47,32,32,168,145,67,38,215,77,19,77,109,130,65,204,71,84,8,80,247,13,120,55,150,31,73,203,196,24,78,166,138,31,46,222,190,145,30,80,46,22,175,24,169,24,250,205,32,184,216,81,75,129,112,204,195,184,189,74,64,83,48,46,3,241,193,79,104,108,37,198,150,99,229,116,93,201,222,178,220,59,43,254,252,232,52,42,129,42,9,89,148,163,24,176,130,243,80,93,57,205,237,7,217,185,164,4,210,53,18,164,76,73,249,65,254,29,203,161,42,206,154,37,237,117,210,171,148,16,141,247,171,160,230,200,15,126,64,73,94,201,146,176,49,177,170,0,169,180,18,72,95,249,0,204,207,232,219,228,100,58,24,212,51,31,36,178,33,10,180,81,175,3,90,19,149,36,220,49,86,128,36,196,224,25,193,32,219,44,192,38,1,185,140,200,126,76,149,16,139,44,97,84,237,108,118,50,167,155,220,75,178,121,226,197,61,103,95,250,60,17,78,134,138,18,223,232,14,145,253,199,141,246,144,246,179,78,195,180,187,221,161,47,143,141,193,14,247,255,96,40,59,103,142,19,74,128,52,232,92,99,189,88,102,145,65,74,119,144,186,11,121,224,180,0,237,91,98,45,174,24,247,148,226,180,54,166,103,121,158,170,216,113,153,192,248,134,133,85,81,231,71,229,117,178,172,124,98,159,17,20,212,43,162,213,186,122,16,198,63,152,143,137,24,69,69,180,131,33,236,245,212,90,33,222,127,160,1,5,42,128,48,236,3,228,122,35,251,14,134,218,110,19,8,32,134,103,254,41,0,55,48,220,133,158,230,220,118,179,199,206,5,35,5,190,189,255,113,49,24,148,128,202,145,79,178,189,253,5,133,130,8,188,27,78,166,97,91,43,12,6,255,127,239,253,180,157,33,66,17,51,85,168,157,250,233,86,94,126,123,255,210,106,99,64,241,199,62,161,253,112,239,219,69,124,197,95,216,56,248,107,163,138,123,171,57,94,160,41,21,240,242,145,214,140,193,143,64,19,22,159,154,26,234,79,81,39,25,84,218,40,106,178,145,141,19,182,179,18,212,30,43,94,89,215,186,13,198,196,173,10,178,209,114,118,255,100,108,117,39,117,138,104,66,62,193,67,82,190,54,21,202,215,252,250,43,59,158,228,39,126,97,117,45,223,240,243,251,20,125,208,110,31,249,129,83,94,173,214,213,189,73,57,160,78,182,2,148,246,198,212,90,219,246,101,199,229,207,48,25,69,50,63,44,43,207,216,163,64,58,48,171,201,119,188,239,253,170,73,156,221,69,181,196,234,147,163,200,218,198,100,130,162,161,248,12,115,55,24,96,176,196,89,180,96,64,23,60,17,73,166,199,232,78,171,163,246,114,43,177,53,245,40,65,130,147,87,21,235,158,146,82,149,239,104,58,33,36,228,35,78,37,178,177,60,47,212,200,178,113,152,113,25,235,65,164,26,55,155,100,65,6,211,168,220,172,215,121,81,17,4,37,230,95,23,250,41,203,243,181,235,167,164,52,32,185,78,198,76,68,14,230,156,76,73,14,146,63,46,160,197,72,228,201,56,121,102,103,102,156,192,254,202,36,12,182,73,66,118,184,208,243,154,145,161,186,222,148,215,144,3,90,56,82,209,92,175,163,206,158,131,185,59,179,155,65,255,224,23,90,110,65,172,116,139,141,186,91,15,214,113,145,53,253,34,187,144,136,215,204,13,105,235,76,176,19,1,228,220,63,173,101,252,174,238,93,161,123,231,22,42,166,176,30,233,103,175,80,45,118,168,131,87,0,21,221,18,56,110,176,222,78,84,35,50,131,65,97,142,81,44,233,143,126,173,181,189,247,173,166,199,158,166,222,158,94,241,158,229,47,141,125,123,223,1,245,24,55,91,79,243,78,239,85,81,192,54,24,149,235,20,82,223,235,121,193,30,108,56,159,120,19,237,185,237,121,67,53,244,166,222,84,170,61,23,31,245,98,153,201,7,200,10,240,193,134,100,80,8,69,35,172,139,72,24,57,31,230,86,226,195,94,89,108,230,10,9,250,65,208,50,226,141,126,68,9,2,196,51,253,8,234,23,231,211,15,194,112,68,88,243,134,208,118,121,232,16,39,45,52,115,18,17,33,173,81,133,69,174,158,213,138,202,46,118,133,197,86,178,78,38,197,156,145,203,77,107,116,246,217,84,57,79,28,192,107,237,53,41,141,223,213,232,125,194,96,17,251,181,154,188,236,231,39,86,37,99,167,131,51,65,53,218,47,215,218,15,104,35,94,195,242,90,19,162,42,214,100,225,225,6,67,1,208,168,59,196,181,213,163,97,249,79,48,165,171,3,183,90,19,46,53,144,57,175,64,22,144,80,218,219,25,85,96,33,216,182,176,235,94,221,160,166,55,73,9,8,0,129,232,125,247,238,237,75,109,133,189,97,171,214,115,161,105,197,140,7,106,103,39,223,78,64,87,117,181,92,177,207,201,122,42,105,242,120,182,38,213,115,121,18,85,97,53,116,28,134,83,144,191,158,211,142,113,115,62,52,226,211,220,36,159,213,99,89,116,85,52,23,4,156,31,203,165,90,40,68,251,226,32,231,233,83,163,216,160,14,219,9,93,104,124,39,168,174,174,161,231,35,117,3,45,221,12,253,43,150,190,79,2,100,103,231,84,251,157,186,234,38,132,170,169,48,203,43,191,121,32,15,167,31,119,54,233,32,62,99,121,146,134,209,196,134,181,15,59,101,83,225,191,215,181,107,174,243,181,221,16,80,153,164,236,92,239,102,13,104,143,164,105,139,87,253,100,202,80,20,93,13,247,245,112,102,52,200,107,54,170,244,164,48,212,237,88,47,244,175,114,198,72,10,54,211,138,193,44,138,70,203,108,114,200,67,227,66,79,156,113,229,86,65,248,153,155,68,195,35,168,235,85,80,83,171,246,249,106,151,246,1,114,69,183,19,199,194,122,134,193,218,62,16,85,56,0,125,39,174,227,199,231,202,116,227,144,78,127,214,174,209,26,143,241,80,117,159,104,144,22,246,143,136,25,124,77,136,127,117,180,114,116,74,192,76,15,89,163,227,74,179,160,125,19,195,106,120,26,16,177,21,229,161,88,149,102,221,106,93,6,140,195,61,171,120,114,118,2,136,245,177,82,14,45,28,157,62,94,3,13,36,236,50,56,168,188,45,165,8,216,212,59,138,245,74,186,78,249,206,78,212,62,18,168,151,149,209,216,89,23,87,56,51,173,217,98,23,132,180,79,210,140,1,141,105,3,171,33,101,51,147,36,219,15,23,176,201,204,245,97,180,24,236,60,205,75,229,206,88,3,85,200,241,12,114,61,24,36,80,79,179,111,217,37,190,10,64,36,13,206,115,204,173,159,68,13,97,230,1,228,108,216,112,97,78,157,30,7,185,204,53,222,239,191,69,150,193,32,119,132,28,85,146,57,21,56,148,157,179,234,103,146,214,249,219,100,109,93,241,138,70,98,150,47,171,133,193,56,160,93,88,154,170,172,99,79,138,173,125,199,166,224,174,17,91,170,22,147,69,64,93,134,201,136,23,236,198,149,157,156,95,245,218,153,222,117,241,220,175,86,160,173,211,205,252,147,239,53,77,146,131,135,202,218,205,180,238,210,95,88,239,95,172,244,209,213,104,205,89,62,166,129,186,235,176,178,150,138,126,103,12,184,237,214,81,159,174,167,104,199,170,112,150,66,186,149,95,219,219,14,224,249,139,223,178,230,186,54,12,217,58,220,217,161,41,50,197,190,86,179,114,162,235,255,162,94,243,228,119,34,165,46,156,212,184,24,105,99,148,6,125,157,223,126,109,251,118,175,85,139,60,218,188,29,153,77,90,114,246,29,36,162,131,205,254,236,193,182,47,119,236,111,118,126,187,171,253,214,42,233,133,34,43,62,224,197,51,126,198,95,147,234,250,81,253,160,183,63,72,204,105,240,65,66,228,182,216,195,153,154,235,94,27,15,149,145,79,96,33,21,104,201,194,98,146,192,211,73,0,17,147,57,203,13,235,213,209,216,167,95,144,50,144,49,86,245,80,251,236,116,136,92,53,156,7,97,18,101,35,72,184,76,81,213,126,255,36,8,51,30,168,41,208,234,115,211,81,91,49,61,214,227,229,62,55,219,123,106,76,254,164,122,167,219,15,2,139,234,131,10,246,9,43,47,31,114,128,6,170,221,224,134,27,157,1,233,126,252,72,180,248,216,236,61,62,124,235,194,148,102,18,68,46,19,203,169,165,31,136,82,182,103,35,131,110,24,231,86,117,228,245,156,1,0,39,182,135,154,133,55,89,123,61,219,235,175,151,202,15,14,8,219,46,134,67,68,190,77,115,166,169,6,147,188,46,255,27,105,228,174,39,245,247,58,89,60,90,207,188,44,27,86,48,124,68,86,109,126,117,149,170,71,105,124,127,104,53,209,210,96,198,190,182,33,234,160,137,118,35,180,95,28,145,147,49,191,133,37,150,141,168,119,26,14,173,11,117,211,109,141,181,20,0,114,37,249,166,52,110,178,115,45,79,161,12,106,128,184,221,146,51,31,168,85,221,85,127,95,31,229,250,251,186,104,143,174,171,174,19,242,46,212,54,93,212,141,125,205,118,84,75,176,142,237,210,179,112,246,107,38,248,221,0,16,118,52,17,10,225,22,40,45,50,44,215,212,17,146,21,132,197,122,100,156,255,70,223,156,86,181,169,140,42,141,41,105,240,180,147,34,109,32,132,231,133,158,55,204,14,58,105,167,214,41,3,17,252,49,79,50,31,178,216,244,154,54,53,92,84,85,216,45,7,227,162,174,29,118,22,86,109,183,167,95,51,32,136,41,70,208,86,122,243,206,160,245,238,215,145,43,85,240,189,97,123,237,61,210,222,172,239,237,52,152,249,40,236,124,92,185,177,29,85,208,94,152,193,192,224,78,90,156,198,205,172,77,84,63,169,63,237,87,18,37,161,178,118,239,139,246,108,124,153,221,14,198,71,246,87,227,32,234,180,125,190,175,129,173,168,13,225,53,52,98,183,25,89,201,239,56,234,170,18,127,63,231,153,198,12,228,152,49,211,70,166,177,73,162,137,170,213,155,121,32,80,96,134,253,190,221,131,142,246,59,39,96,161,104,239,190,103,218,160,161,80,172,66,120,184,129,85,72,142,98,56,242,134,205,38,225,141,240,142,158,156,238,135,193,65,205,118,13,149,183,222,10,86,14,205,107,208,246,54,203,36,250,167,159,80,204,144,184,137,191,70,74,248,198,243,203,187,151,132,95,30,49,153,41,245,134,208,202,1,127,114,42,185,2,154,201,181,26,121,180,218,164,85,178,78,57,10,202,42,105,182,61,189,124,205,1,148,193,227,54,172,19,255,165,22,187,192,50,50,55,231,213,141,217,230,133,142,4,9,247,216,175,222,237,234,24,86,181,167,44,48,237,53,209,96,213,70,186,70,218,124,202,165,125,123,111,53,170,253,8,221,253,80,129,112,18,44,225,250,40,167,191,34,85,203,10,9,244,115,148,243,207,110,12,25,18,87,201,188,209,65,235,188,76,244,20,208,110,236,200,190,74,175,80,105,76,177,31,30,109,122,81,86,118,74,240,230,103,131,182,2,103,213,233,219,193,150,77,191,22,3,180,143,212,216,167,7,25,133,93,24,83,37,143,230,68,143,225,100,55,110,244,133,17,27,223,230,155,140,130,56,94,166,9,74,255,140,213,241,45,13,62,112,161,140,71,60,36,139,236,74,253,246,142,231,73,80,165,25,77,142,73,255,221,164,115,64,79,248,54,174,174,71,5,85,236,103,35,78,10,132,14,241,105,127,210,105,193,14,128,164,44,195,131,80,140,125,167,237,179,167,22,119,89,71,68,247,126,49,135,113,36,102,252,150,159,18,13,194,39,239,116,220,244,1,156,79,186,177,60,122,103,183,116,219,213,114,164,1,109,144,148,178,187,174,113,109,198,48,153,86,123,190,245,124,162,166,178,233,148,162,78,149,135,237,243,94,104,190,227,208,180,24,12,221,30,50,69,83,7,202,132,39,71,177,164,216,215,33,52,231,80,199,201,134,143,91,97,218,34,105,36,37,181,232,83,113,235,49,235,57,250,140,212,152,110,132,158,162,120,136,134,50,219,144,209,114,67,111,236,253,251,237,49,14,25,255,173,205,168,75,131,72,46,160,246,135,18,77,13,99,18,205,58,20,170,75,200,71,6,18,105,119,1,153,2,196,19,97,27,70,55,208,184,113,44,24,238,97,71,29,111,193,118,87,239,250,144,14,66,251,221,241,176,179,253,39,158,88,241,47,118,202,210,254,95,188,88,124,161,242,71,209,135,19,189,101,0,2,146,201,89,170,217,250,167,218,28,105,65,189,113,110,52,248,241,101,57,60,190,234,86,226,22,51,218,97,35,109,187,77,106,47,166,48,34,213,176,226,96,240,147,193,56,67,31,96,173,71,104,45,24,38,6,136,1,40,128,169,245,108,91,117,252,248,112,59,213,254,99,131,93,106,11,192,202,203,159,106,51,124,156,212,195,175,7,79,33,65,95,49,244,4,124,104,53,56,45,145,160,1,128,237,76,229,137,9,197,160,33,89,243,101,127,52,174,15,191,107,249,108,104,82,173,155,202,102,137,18,211,16,44,220,242,43,122,235,235,208,221,126,238,46,21,108,107,144,164,165,42,74,200,71,206,188,251,198,137,169,23,164,156,23,121,154,94,236,193,35,99,131,91,133,100,116,169,87,103,182,139,224,58,128,185,39,89,109,61,52,21,219,20,71,55,56,194,33,139,14,24,220,150,148,213,46,124,236,163,239,188,253,166,253,178,118,48,111,72,83,125,245,104,40,247,87,15,135,171,118,199,243,219,87,143,135,138,126,121,64,194,121,255,93,15,200,34,7,183,84,215,104,106,119,188,80,26,177,183,17,141,113,186,54,192,38,145,87,90,24,41,107,75,176,243,41,106,3,132,80,213,37,106,36,202,80,72,242,158,243,235,52,215,59,63,129,70,61,43,232,232,36,59,66,6,176,60,84,132,208,104,225,203,185,41,135,201,206,48,107,216,206,173,24,86,114,1,29,30,74,213,31,233,80,97,91,138,33,201,223,21,227,158,184,229,30,106,216,114,148,52,200,206,116,89,87,186,219,89,232,249,126,207,111,252,69,39,137,117,77,85,135,75,177,221,234,189,213,49,109,118,152,37,168,154,249,31,12,26,40,217,204,84,131,38,201,167,85,181,42,108,66,9,136,92,248,80,208,66,85,20,243,192,207,154,237,197,100,63,184,122,218,41,77,108,56,107,29,216,57,58,238,84,101,68,51,173,136,78,82,219,104,142,76,179,3,41,7,233,182,199,90,9,179,214,39,96,223,168,156,120,236,101,128,117,63,13,223,114,202,62,134,157,24,62,229,44,126,222,38,100,218,162,160,163,67,221,74,178,108,36,44,207,100,109,111,39,80,133,28,246,200,22,54,68,185,184,235,8,65,171,99,72,101,242,159,79,245,0,179,169,220,119,71,137,24,35,212,238,233,38,2,110,127,86,89,47,215,167,45,158,176,94,169,79,148,69,32,129,78,45,108,247,129,173,249,221,231,99,26,86,13,135,197,232,179,90,87,185,9,59,140,18,237,119,164,221,216,74,111,136,7,230,20,71,243,193,13,42,228,177,99,140,97,179,179,148,109,183,54,88,168,10,91,121,145,115,35,59,61,194,53,32,63,101,89,217,185,20,164,17,99,153,71,89,232,186,152,33,149,78,200,168,205,70,228,27,51,78,49,218,91,163,36,118,220,242,134,122,248,148,83,216,157,195,216,102,46,191,104,243,196,164,58,15,230,83,99,166,77,64,33,106,45,207,101,29,124,217,143,155,232,73,213,120,213,199,20,165,91,2,162,126,171,29,208,52,24,49,31,12,42,8,79,177,87,125,223,88,220,170,102,233,237,214,59,127,249,243,143,239,47,188,190,155,220,102,159,237,86,113,44,28,216,159,92,89,199,31,227,155,24,68,159,172,43,93,138,190,81,158,178,152,7,150,75,33,154,111,193,56,118,47,40,218,123,135,20,88,198,48,208,255,149,168,219,176,26,103,35,5,91,218,238,114,170,198,181,199,56,70,239,57,16,125,99,137,134,222,69,14,4,167,199,236,13,253,36,242,244,200,145,248,130,15,97,4,83,217,237,237,12,192,31,134,225,24,92,128,104,206,70,31,154,104,51,249,155,243,76,237,225,243,38,75,254,146,239,241,176,80,104,48,137,211,228,179,98,107,71,254,83,24,2,151,103,162,216,249,78,176,230,7,78,85,66,239,242,145,37,50,122,66,142,137,209,19,233,110,83,41,231,24,237,117,139,161,254,252,156,44,56,188,155,30,36,197,122,53,135,136,214,205,177,45,142,94,228,131,121,88,185,50,208,140,188,242,249,197,244,198,143,39,215,218,136,156,76,15,253,29,78,155,232,95,95,141,104,91,101,164,104,77,73,216,83,74,86,18,178,182,138,160,12,56,25,124,120,77,66,33,163,192,49,138,106,227,84,62,28,80,42,208,87,17,184,103,242,22,205,94,133,79,97,228,22,230,122,163,218,240,124,80,33,199,195,102,101,216,196,194,114,96,149,31,52,56,221,57,74,181,114,227,7,221,35,153,81,248,199,182,23,184,126,46,148,4,72,30,125,211,139,128,250,41,67,111,239,156,230,85,219,229,135,149,78,161,253,150,228,76,228,208,204,249,118,219,239,59,7,225,110,156,182,83,118,207,33,175,62,157,233,156,110,189,215,97,254,130,34,252,55,98,169,103,96,46,121,7,120,45,227,201,156,14,115,210,15,29,247,3,3,212,96,250,56,232,12,55,38,35,131,163,160,72,14,6,245,169,109,43,93,108,172,119,162,207,93,196,160,139,140,100,195,50,147,137,136,121,89,74,252,242,128,82,62,119,209,173,89,211,184,82,139,11,104,10,101,117,55,173,118,102,92,58,180,53,183,23,217,1,48,79,173,116,199,118,213,27,221,104,26,211,42,55,70,64,110,64,84,232,28,184,237,206,137,42,53,110,51,121,65,36,141,134,146,242,199,213,74,45,18,116,137,204,240,248,42,166,108,231,0,67,107,181,128,250,120,80,35,242,106,202,220,152,148,115,219,9,240,195,159,232,68,9,74,140,38,106,26,226,255,86,195,152,47,65,224,30,46,236,159,82,112,240,136,182,84,104,255,90,139,38,159,216,170,68,99,78,219,28,13,14,32,3,153,43,215,246,144,246,90,107,188,152,116,230,94,44,90,125,158,251,32,72,237,198,199,98,208,180,240,28,136,43,63,6,141,180,216,230,206,50,122,163,231,137,120,198,62,31,151,12,190,76,48,152,202,70,80,116,126,54,190,227,120,146,79,39,152,234,169,240,180,70,233,238,127,199,55,12,129,196,4,29,24,54,67,80,116,82,117,215,26,196,133,107,110,250,25,29,87,194,178,154,25,126,175,231,91,45,72,124,100,124,252,164,162,250,88,59,223,186,81,103,118,83,68,102,88,202,113,69,238,168,110,172,59,41,166,114,38,146,193,32,49,180,144,57,212,184,227,96,87,249,138,182,22,71,85,178,82,231,85,188,90,179,160,173,223,36,133,158,66,15,222,210,82,251,153,213,83,117,87,251,68,83,135,201,116,156,141,58,193,170,129,102,45,139,8,221,214,73,76,100,64,23,236,51,115,169,140,98,84,14,18,25,56,250,93,51,37,103,20,237,209,204,239,185,27,119,244,144,23,9,108,150,56,229,117,10,171,157,27,94,254,209,24,84,208,230,60,127,146,142,30,248,52,159,146,222,107,126,184,32,39,153,62,94,90,160,206,83,216,98,250,248,90,19,148,173,207,146,66,195,57,129,241,162,236,80,186,135,254,78,176,14,249,33,55,244,103,41,189,60,91,66,126,149,137,62,24,78,39,82,249,61,244,108,178,152,165,155,194,188,230,155,202,227,3,171,171,124,83,42,154,14,124,225,103,144,102,225,9,126,76,85,124,163,108,50,21,24,111,128,167,146,249,39,185,25,113,226,2,56,196,62,111,214,246,137,168,91,122,111,233,145,39,175,244,136,14,233,73,62,80,144,225,189,141,203,188,219,89,130,151,93,219,44,79,91,59,28,68,134,123,103,79,158,178,59,61,103,31,173,22,212,29,132,92,211,110,161,3,233,72,112,237,215,4,244,236,80,246,184,14,141,97,200,192,90,38,38,111,112,73,218,217,66,160,200,47,0,104,244,185,22,142,25,175,106,246,181,77,2,31,130,219,130,208,36,219,108,227,234,186,200,111,89,213,18,210,231,96,108,223,83,119,107,222,33,233,213,151,82,80,148,13,105,3,58,248,249,216,113,1,109,33,217,84,83,96,147,29,20,217,43,176,92,154,80,115,206,15,132,188,87,191,115,144,189,213,2,4,232,105,160,55,19,102,135,147,77,199,44,94,117,36,159,238,196,71,58,55,204,103,132,183,14,39,63,217,166,241,189,42,38,191,253,62,125,178,53,167,41,65,24,108,10,82,90,112,44,110,229,67,91,149,0,174,30,112,178,39,72,183,116,41,56,202,253,5,197,167,11,238,229,239,200,182,27,43,109,110,167,10,31,212,223,173,134,61,181,97,86,227,235,138,97,77,90,229,210,228,70,201,78,79,99,131,84,216,193,16,212,253,242,91,119,45,112,101,38,240,67,119,63,249,218,10,155,62,255,77,149,121,214,62,138,25,59,248,76,164,226,186,21,127,73,142,16,114,73,82,0,95,231,222,200,245,168,174,6,246,22,25,162,215,65,200,108,183,221,230,48,232,182,219,13,11,127,8,219,141,140,33,254,50,186,213,5,186,101,163,69,112,172,207,94,64,222,235,207,5,89,178,6,146,108,228,43,84,215,25,53,137,175,243,46,51,231,142,66,37,217,34,19,27,212,212,13,203,208,73,58,12,148,30,96,192,130,194,129,72,29,50,0,12,70,38,234,19,146,40,183,113,88,181,93,61,24,148,80,134,57,100,10,153,11,124,252,206,39,117,36,30,230,155,130,108,104,141,34,195,82,16,85,188,78,10,104,201,28,45,251,192,211,155,192,116,172,20,208,200,143,137,56,65,7,93,29,12,121,79,99,195,98,197,152,237,116,187,157,235,24,112,189,166,203,101,231,249,218,248,223,91,204,216,136,25,115,174,47,118,86,50,161,45,6,187,146,137,93,197,196,46,85,66,75,21,31,236,8,221,53,142,243,204,233,46,212,226,213,149,42,186,41,187,146,122,67,67,181,207,147,81,191,213,136,181,19,121,87,46,56,148,212,224,220,172,59,62,64,19,2,219,48,176,221,15,47,136,210,129,3,156,105,26,185,47,116,8,154,2,149,40,250,150,91,244,90,113,45,173,79,212,25,101,54,100,204,184,126,136,179,69,74,97,67,66,135,209,185,99,54,223,186,180,167,72,190,20,198,135,213,120,40,228,185,95,238,77,4,157,1,175,167,161,48,164,11,86,50,75,188,6,178,174,140,139,162,10,186,143,128,39,210,170,187,34,224,67,119,95,180,59,232,158,144,250,230,25,144,192,78,88,184,210,179,56,69,63,244,8,188,244,232,102,133,94,161,40,220,189,167,93,133,189,77,198,137,140,75,122,139,89,170,31,106,120,210,51,224,164,87,67,147,94,13,115,122,22,217,244,26,20,212,107,144,79,111,126,29,103,87,104,136,133,95,239,147,186,231,10,241,11,141,84,150,244,128,122,213,254,89,170,78,255,158,218,119,153,170,47,134,84,205,56,174,191,222,201,53,203,77,190,185,29,161,12,94,175,61,253,174,233,220,28,184,213,126,164,192,216,114,181,112,55,71,224,121,181,55,108,100,123,6,161,209,69,1,253,147,49,71,90,88,159,118,66,29,83,129,55,219,204,102,169,42,61,114,205,33,87,95,77,146,105,152,225,143,164,167,102,183,128,78,58,26,74,2,78,232,159,4,226,130,194,196,119,254,99,142,154,181,185,25,199,216,35,150,14,155,131,125,28,242,106,7,159,32,167,232,39,29,64,222,111,59,72,24,168,36,14,2,188,74,243,89,156,70,107,178,246,10,254,102,105,174,237,3,177,57,7,3,222,87,31,233,187,59,134,195,193,128,106,101,56,231,197,31,227,59,24,55,69,181,231,245,112,75,247,143,142,108,225,195,162,180,99,210,242,127,52,177,255,218,29,0,241,95,143,223,68,194,158,67,31,88,135,30,229,55,162,115,193,7,134,184,222,111,235,124,158,152,32,139,57,134,88,179,151,147,213,205,212,118,177,40,119,53,50,219,25,24,39,94,185,153,207,65,242,30,249,86,244,163,238,78,130,238,228,130,78,36,210,177,76,112,69,158,222,232,40,212,132,90,200,169,13,177,32,247,186,105,219,212,35,38,28,207,133,143,51,8,163,246,197,70,29,182,122,209,76,204,136,249,77,183,158,147,110,33,220,205,54,106,161,72,178,115,227,185,152,240,23,110,28,58,94,55,174,79,61,210,39,224,24,168,4,110,93,143,185,105,125,102,177,153,182,65,234,89,24,211,147,190,223,69,55,94,232,166,105,112,133,174,255,165,249,174,71,135,218,175,124,119,92,175,108,205,116,128,159,157,45,175,217,133,40,229,199,230,180,232,126,171,53,115,53,249,109,243,12,224,235,218,63,210,1,221,250,237,118,207,29,73,91,73,70,66,141,61,216,77,180,101,38,244,7,57,143,244,29,61,33,158,151,145,247,177,132,86,11,227,250,98,38,207,120,167,195,77,115,221,133,119,135,252,144,54,250,86,159,182,135,162,185,165,141,14,230,71,85,232,87,67,111,224,13,149,115,107,220,100,16,77,31,78,197,211,221,177,240,34,151,29,206,53,35,65,127,16,153,124,135,49,147,195,100,193,191,77,244,166,50,247,248,241,7,109,221,179,239,138,143,48,196,43,243,74,154,170,136,23,188,157,22,167,48,245,251,58,157,60,171,198,3,255,253,43,242,213,235,215,182,155,30,31,105,34,214,252,153,74,93,176,210,67,213,155,34,149,23,250,87,152,30,152,95,169,133,138,51,156,151,90,192,57,194,200,53,243,65,29,12,118,10,200,94,130,64,166,184,104,229,41,2,134,72,148,199,126,127,64,211,97,165,195,19,51,97,248,49,44,132,237,102,152,56,206,221,119,77,23,236,22,157,178,231,236,209,1,17,203,125,104,68,199,176,205,246,182,112,54,200,54,193,67,110,103,126,195,44,231,3,181,69,73,152,12,189,137,55,244,227,230,78,74,32,89,188,216,61,47,218,10,162,32,17,111,234,145,252,6,212,141,216,135,231,111,70,89,188,2,180,54,161,127,97,83,98,187,229,171,29,154,234,34,26,198,70,232,160,73,46,76,29,218,105,215,10,249,133,51,57,36,123,154,28,78,124,3,88,125,49,87,41,143,159,105,10,190,156,77,254,120,54,253,198,143,66,63,234,63,187,60,214,169,207,131,103,156,28,124,211,36,209,69,87,177,190,232,138,8,124,75,240,58,153,51,112,9,46,157,29,155,227,4,230,197,99,217,192,34,248,190,148,158,147,124,204,204,37,230,82,239,253,232,171,177,82,125,169,215,147,99,65,27,185,123,247,63,197,94,48,190,30,93,23,138,110,27,75,115,93,13,191,11,171,98,228,9,61,66,254,208,9,113,231,162,157,132,108,27,222,168,242,104,209,8,117,38,181,251,66,151,176,30,238,185,88,99,162,146,17,147,252,75,136,151,89,60,255,132,41,240,91,164,72,59,182,0,179,37,49,62,111,203,120,195,108,56,196,20,28,244,218,136,140,128,238,72,155,196,83,209,54,142,136,126,246,209,173,167,97,20,201,101,47,158,229,172,94,233,42,53,126,14,211,157,115,205,81,78,226,97,149,128,75,175,193,43,84,23,170,245,24,4,154,74,28,170,133,58,155,3,204,21,23,201,138,128,158,191,182,69,96,154,52,251,126,194,52,223,135,228,213,162,97,30,221,251,115,218,69,185,166,109,135,32,188,51,222,28,116,207,52,162,63,8,26,159,92,210,38,97,107,174,150,116,180,154,107,160,73,152,203,218,238,186,241,81,208,40,103,63,245,237,96,217,208,213,117,53,38,199,188,57,167,190,3,155,148,197,28,107,4,230,111,4,233,101,228,143,134,129,188,140,72,144,62,57,149,222,48,38,208,77,55,152,181,46,130,34,134,101,191,44,230,128,142,228,250,107,89,170,202,78,138,211,36,122,100,178,209,2,212,101,2,234,224,206,208,217,185,170,42,58,110,38,31,104,174,66,150,162,162,1,42,225,199,90,38,125,20,60,89,248,181,186,147,31,89,181,241,30,175,208,144,41,236,159,136,187,235,162,35,230,130,152,186,26,253,246,246,205,15,85,181,254,89,253,181,129,10,218,137,24,213,175,171,50,124,208,132,22,238,111,165,138,94,139,233,30,73,191,59,114,54,95,5,209,126,184,20,96,219,176,197,178,72,16,61,174,159,148,158,62,180,49,215,231,35,116,179,107,146,157,222,78,192,28,129,202,202,87,120,11,251,167,194,204,92,120,34,28,109,70,3,157,67,180,42,122,104,84,122,248,209,206,173,220,63,107,180,17,75,22,217,198,41,240,176,19,217,118,75,55,94,146,224,6,16,198,4,171,5,17,159,125,246,245,121,41,13,222,91,235,21,212,123,168,37,112,59,69,43,51,134,111,229,65,74,48,94,249,58,140,162,25,16,59,92,186,132,19,200,146,133,83,201,250,208,188,232,159,118,13,242,90,59,189,231,121,58,244,142,143,189,33,164,90,94,86,125,100,110,167,111,56,157,218,71,141,104,151,127,93,225,103,239,204,227,77,5,211,114,29,198,233,253,135,23,208,77,87,28,139,77,5,245,103,189,13,122,66,219,66,2,86,175,145,122,248,104,117,38,93,173,120,25,141,134,196,74,26,231,112,65,118,48,175,217,63,100,240,0,79,12,173,96,223,56,43,50,218,117,224,20,98,234,19,8,136,122,59,127,238,160,136,121,80,143,229,66,255,10,239,79,240,171,179,69,2,49,164,115,3,147,89,57,189,62,40,85,106,41,29,153,223,161,39,35,47,52,47,90,172,208,17,154,185,17,226,248,24,4,174,126,240,75,10,154,160,225,191,23,11,76,128,97,165,201,124,42,174,104,35,97,182,103,86,94,145,27,195,61,212,48,149,108,58,208,253,133,228,210,165,43,13,135,33,244,221,229,113,107,226,162,250,254,170,208,89,59,187,212,226,12,77,131,227,33,122,223,201,51,186,230,212,240,246,15,144,92,138,175,107,1,226,139,107,73,127,118,64,143,51,223,251,237,200,20,82,139,35,130,253,158,240,218,130,194,35,128,239,189,224,17,122,98,65,231,174,142,233,74,54,159,6,190,2,127,106,80,199,91,102,139,134,132,132,103,40,104,33,23,22,53,139,26,53,159,141,200,117,80,36,11,245,214,212,64,55,28,236,167,249,11,162,206,250,24,175,110,168,245,106,232,167,180,232,86,99,209,178,3,139,162,123,24,134,57,244,116,68,101,61,177,87,115,91,98,29,221,222,222,30,65,8,172,142,176,18,42,155,231,116,111,7,205,224,53,207,110,25,212,55,236,52,73,100,135,213,111,147,124,106,174,57,219,95,25,57,163,9,200,120,127,156,194,215,148,246,145,200,118,204,226,255,147,88,84,231,154,145,135,206,50,80,5,174,106,126,175,201,18,112,21,19,99,90,71,238,77,249,92,62,61,225,107,36,244,235,179,255,58,1,151,253,215,9,55,162,147,56,70,221,190,144,119,46,161,219,35,165,124,201,189,153,203,249,118,123,235,187,75,126,70,14,216,159,85,185,206,179,82,233,145,249,246,182,201,35,70,75,129,141,218,154,109,150,75,190,249,155,70,164,11,152,57,159,65,119,29,164,7,149,147,160,175,160,112,83,40,142,125,76,247,231,86,146,236,193,185,128,164,181,2,131,76,49,255,84,80,244,78,64,206,56,182,178,40,209,173,0,20,30,106,27,77,146,124,129,1,151,214,166,26,95,179,171,90,23,233,6,230,18,93,224,32,160,245,157,123,189,36,32,141,240,56,111,97,32,205,25,93,160,24,236,200,21,96,30,57,94,234,174,94,9,234,189,14,27,19,54,41,50,120,40,52,72,198,150,220,1,233,224,177,125,27,210,217,136,51,129,235,13,158,106,23,18,103,76,1,47,128,153,203,251,108,78,136,181,132,156,227,151,80,123,167,64,72,64,53,190,102,19,173,35,196,11,250,197,40,216,154,160,40,255,178,188,205,139,5,17,60,68,204,235,68,165,139,22,201,55,137,103,32,116,233,36,224,117,92,103,188,10,222,217,91,127,196,21,115,68,29,5,231,34,169,247,143,32,169,71,72,254,112,10,44,222,178,51,39,74,7,117,17,7,210,33,97,150,18,145,254,97,228,132,79,132,25,200,61,219,241,15,16,104,116,255,210,221,136,108,93,18,164,232,156,82,37,15,110,203,120,164,68,19,142,197,225,92,222,251,119,231,23,158,209,42,124,72,128,59,194,215,84,253,251,85,90,21,172,53,236,94,181,180,15,6,100,223,222,143,208,225,90,93,199,168,120,131,130,247,42,132,62,44,36,242,218,243,193,209,29,176,86,140,81,78,184,124,99,189,89,205,13,33,54,228,145,118,140,88,239,230,100,5,196,248,57,157,18,218,49,5,100,251,14,24,66,133,126,28,41,223,123,182,72,110,158,123,129,78,105,2,167,248,168,130,57,51,23,179,159,125,73,119,47,233,169,73,90,113,21,102,252,27,179,207,198,195,57,147,90,140,255,242,243,143,228,101,202,51,10,7,54,238,142,206,189,243,38,4,181,32,115,121,47,207,161,23,34,147,58,30,71,159,194,213,87,210,219,67,132,28,145,115,198,39,140,0,88,206,248,236,142,120,231,155,205,192,194,196,148,13,220,127,22,224,63,159,158,208,63,12,48,244,246,221,191,236,222,193,162,214,241,127,123,151,225,213,1,24,124,155,156,72,186,111,163,53,30,246,168,137,165,181,46,93,115,55,220,3,201,130,80,9,246,44,132,20,48,237,238,134,232,131,163,102,215,202,4,248,43,115,199,162,104,239,13,102,50,215,162,70,225,129,5,140,98,253,66,210,66,17,198,203,221,56,79,7,38,13,6,253,156,246,118,232,222,226,5,57,175,54,179,85,82,233,155,3,61,8,115,101,159,103,155,170,178,255,2,5,43,46,123,187,32,249,174,114,147,14,116,57,255,52,203,239,244,93,131,249,136,223,57,214,39,241,233,114,75,114,161,232,115,254,5,93,31,231,78,240,33,71,54,180,97,246,118,221,165,240,187,35,156,42,61,175,135,84,72,17,146,20,206,206,180,209,249,89,123,119,248,14,130,134,84,108,47,121,86,246,163,214,218,59,34,65,179,35,98,103,145,110,68,182,161,188,29,167,61,42,179,145,96,179,155,227,230,234,47,255,164,217,78,200,232,88,102,215,94,130,185,13,67,239,208,154,30,250,237,59,36,218,52,173,47,196,63,56,12,104,189,129,245,45,246,186,115,251,249,198,28,192,221,74,218,131,224,206,117,251,58,165,209,233,206,233,209,29,254,71,97,118,187,96,252,63,228,97,87,78,206,102,0,0 };