Add Manual time setting from [ESP800],

Add time source selection setting (Internet/manual)
Add websocket IP to make it work with Apple Captive portal thanks @Nathan-ma
Add instant message error and abort command for files upload
Add Available FS space check before upload
Add [ESP290]<delay> command per @josedpedroso
Apply Astyle
Update version
This commit is contained in:
Luc 2019-08-27 11:35:36 +02:00
parent 7c13940d16
commit e93495c6c8
39 changed files with 1545 additions and 1259 deletions

View File

@ -50,8 +50,8 @@ Note:
* Get/Set Telnet port * Get/Set Telnet port
[ESP131]<port>pwd=<admin password> [ESP131]<port>pwd=<admin password>
* Init / Get current time * Sync / Set / Get current time
[ESP140]<INIT> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password> [ESP140]<SYNC> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password>
* Get/Set boot delay * Get/Set boot delay
[ESP150]<time in milliseconds>[pwd=<admin password>] [ESP150]<time in milliseconds>[pwd=<admin password>]
@ -83,6 +83,9 @@ Flash pins (6~11) cannot be used
No parameter just play beep No parameter just play beep
[ESP250]F=<frequency> D=<duration> [pwd=<user password>] [ESP250]F=<frequency> D=<duration> [pwd=<user password>]
* Delay command
[ESP290]<delay in ms>[pwd=<user password>]
* Get full EEPROM settings content * Get full EEPROM settings content
but do not give any passwords but do not give any passwords
[ESP400] pwd=<admin password> [ESP400] pwd=<admin password>
@ -103,7 +106,7 @@ ESP_NOTIFICATION_TYPE 116 //1 byte = flag
ESP_CALIBRATION 117 //1 byte = flag ESP_CALIBRATION 117 //1 byte = flag
ESP_AP_CHANNEL 118 //1 byte = flag ESP_AP_CHANNEL 118 //1 byte = flag
ESP_BUZZER 119 //1 byte = flag ESP_BUZZER 119 //1 byte = flag
FREE 120 //1 byte = flag ESP_INTERNET_TIME 120 //1 byte = flag
ESP_HTTP_PORT 121 //4 bytes = int ESP_HTTP_PORT 121 //4 bytes = int
ESP_TELNET_PORT 125 //4 bytes = int ESP_TELNET_PORT 125 //4 bytes = int
ESP_OUTPUT_FLAG 129 //1 bytes = flag ESP_OUTPUT_FLAG 129 //1 bytes = flag

View File

@ -1,4 +1,7 @@
cd %~dp0 cd %~dp0
cmd.exe /c npm install
cmd.exe /c npm audit fix
cmd.exe /c npm audit
cmd.exe /c gulp package cmd.exe /c gulp package
cmd.exe /c bin2c -o embedded.h -m tool.html.gz cmd.exe /c bin2c -o embedded.h -m tool.html.gz
cat header.txt > out.h cat header.txt > out.h

View File

@ -25,383 +25,398 @@
/* Generated by bin2c, do not edit manually */ /* Generated by bin2c, do not edit manually */
/* Contents of file tool.html.gz */ /* Contents of file tool.html.gz */
#define tool_html_gz_size 6005 #define tool_html_gz_size 6244
const unsigned char tool_html_gz[6005] PROGMEM = { const unsigned char tool_html_gz[6244] PROGMEM = {
0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xED, 0x3C, 0x69, 0x77, 0xDB, 0xB6, 0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xED, 0x3C, 0x89, 0x72, 0xDB, 0xC6,
0x96, 0x7F, 0x85, 0x41, 0x4F, 0x2D, 0x71, 0x4C, 0x4A, 0xDC, 0xB4, 0x5B, 0xCA, 0x4B, 0x9B, 0xA4, 0x92, 0xBF, 0x02, 0x4F, 0x2A, 0x26, 0xB1, 0x04, 0x48, 0x1C, 0xBC, 0x29, 0x52, 0xCF, 0x89, 0xED,
0xF5, 0x9C, 0xA4, 0xC9, 0x89, 0x9D, 0x97, 0x99, 0x93, 0xE4, 0xE4, 0x50, 0x22, 0x24, 0x71, 0x42, 0x44, 0x5B, 0xBE, 0x4A, 0x92, 0x9F, 0xF7, 0x95, 0xED, 0x52, 0x81, 0xC4, 0x90, 0xC4, 0x1A, 0x04,
0x91, 0x32, 0x09, 0x59, 0x76, 0x1C, 0xCF, 0x6F, 0x9F, 0x7B, 0x01, 0x90, 0x04, 0xB5, 0x79, 0x69, 0x28, 0x60, 0x68, 0x4A, 0x96, 0xB5, 0xDF, 0xBE, 0xDD, 0x33, 0x03, 0x60, 0xC0, 0x4B, 0x47, 0xFC,
0xDE, 0xBC, 0x7E, 0x68, 0x15, 0x89, 0x24, 0x96, 0x8B, 0xBB, 0x2F, 0x00, 0xDD, 0x93, 0x39, 0x5B, 0x36, 0xD9, 0xAA, 0x44, 0x16, 0x01, 0xCE, 0xD1, 0xD3, 0xD3, 0x77, 0xF7, 0x8C, 0x72, 0x34, 0x67,
0x44, 0xA3, 0x93, 0x39, 0xF5, 0x83, 0xD1, 0x49, 0xC6, 0xAE, 0x23, 0x3A, 0xC2, 0x96, 0x9B, 0x69, 0x8B, 0x70, 0x74, 0x34, 0xA7, 0x9E, 0x3F, 0x3A, 0x4A, 0xD9, 0x75, 0x48, 0x47, 0xD8, 0x72, 0x33,
0x12, 0x33, 0x73, 0xEA, 0x2F, 0xC2, 0xE8, 0xBA, 0x9F, 0xF9, 0x71, 0x66, 0x66, 0x34, 0x0D, 0xA7, 0x8D, 0x23, 0x66, 0x4E, 0xBD, 0x45, 0x10, 0x5E, 0xF7, 0x53, 0x2F, 0x4A, 0xCD, 0x94, 0x26, 0xC1,
0x03, 0x73, 0x91, 0x99, 0x8C, 0x5E, 0x31, 0x33, 0x0B, 0xBF, 0x51, 0xD3, 0x0F, 0xFE, 0x67, 0x95, 0x74, 0x60, 0x2E, 0x52, 0x93, 0xD1, 0x2B, 0x66, 0xA6, 0xC1, 0x37, 0x6A, 0x7A, 0xFE, 0x7F, 0xAF,
0xB1, 0xBE, 0x6D, 0x59, 0x3F, 0x0F, 0xCC, 0x35, 0x1D, 0x7F, 0x0D, 0xD9, 0x9E, 0x5E, 0x0E, 0x0E, 0x52, 0xD6, 0xB7, 0x2D, 0xEB, 0xE7, 0x81, 0xB9, 0xA6, 0xE3, 0x2F, 0x01, 0xDB, 0xD3, 0xCB, 0xC1,
0x5B, 0xE1, 0x71, 0x79, 0x75, 0x3B, 0x4E, 0x82, 0xEB, 0xCA, 0x12, 0xE4, 0x77, 0x1A, 0x5D, 0x52, 0x61, 0x2B, 0x7C, 0x5D, 0x5E, 0xDD, 0x8E, 0x63, 0xFF, 0xBA, 0xB4, 0x04, 0xF9, 0x9D, 0x86, 0x5F,
0x16, 0x4E, 0x7C, 0xED, 0x0F, 0xBA, 0xA2, 0xC4, 0x28, 0x9E, 0x8D, 0x67, 0x69, 0xE8, 0x47, 0x86, 0x29, 0x0B, 0x26, 0x9E, 0xF6, 0x86, 0xAE, 0x28, 0x31, 0xF2, 0xEF, 0xC6, 0xB3, 0x24, 0xF0, 0x42,
0x82, 0x83, 0x02, 0xCB, 0x5B, 0x5E, 0x0D, 0xA2, 0x30, 0xA6, 0xE6, 0x9C, 0x86, 0xB3, 0x39, 0xAC, 0x43, 0xC1, 0x41, 0x81, 0xD5, 0x5C, 0x5E, 0x0D, 0xC2, 0x20, 0xA2, 0xE6, 0x9C, 0x06, 0xB3, 0x39,
0xD5, 0xF0, 0x9C, 0x6E, 0xAB, 0x63, 0x7B, 0xEE, 0x60, 0x92, 0x44, 0x49, 0xDA, 0xFF, 0xC9, 0x75, 0xAC, 0x55, 0x6F, 0x3A, 0xDD, 0x56, 0xC7, 0x6E, 0xBA, 0x83, 0x49, 0x1C, 0xC6, 0x49, 0xFF, 0x27,
0xDD, 0xC1, 0xD8, 0x9F, 0x7C, 0x9D, 0xA5, 0xC9, 0x2A, 0x0E, 0x4C, 0xD9, 0x3A, 0x9D, 0x4E, 0x6F, 0xD7, 0x75, 0x07, 0x63, 0x6F, 0xF2, 0x65, 0x96, 0xC4, 0xAB, 0xC8, 0x37, 0x65, 0xEB, 0x74, 0x3A,
0x99, 0x3F, 0x8E, 0xE8, 0xCD, 0x38, 0x49, 0x03, 0x9A, 0xF6, 0xAD, 0x81, 0xB8, 0x31, 0xB3, 0xA5, 0xBD, 0x65, 0xDE, 0x38, 0xA4, 0x37, 0xE3, 0x38, 0xF1, 0x69, 0xD2, 0xB7, 0x06, 0xE2, 0xC5, 0x4C,
0x3F, 0x09, 0xE3, 0x19, 0x34, 0x2C, 0xFC, 0x2B, 0x73, 0x1D, 0x06, 0x6C, 0xCE, 0x29, 0xB8, 0x65, 0x97, 0xDE, 0x24, 0x88, 0x66, 0xD0, 0xB0, 0xF0, 0xAE, 0xCC, 0x75, 0xE0, 0xB3, 0x39, 0xDF, 0xC1,
0xC1, 0xCD, 0x7A, 0x1E, 0x32, 0xCA, 0x47, 0xD0, 0x7E, 0x9C, 0xAC, 0x53, 0x7F, 0x39, 0x58, 0xFA, 0x2D, 0xF3, 0x6F, 0xD6, 0xF3, 0x80, 0x51, 0x3E, 0x82, 0xF6, 0xA3, 0x78, 0x9D, 0x78, 0xCB, 0xC1,
0x41, 0x80, 0xC3, 0x9D, 0xC5, 0xE2, 0x96, 0xCD, 0x6F, 0x38, 0xF1, 0x7E, 0x14, 0xCE, 0xE2, 0x7E, 0xD2, 0xF3, 0x7D, 0x1C, 0xEE, 0x2C, 0x16, 0xB7, 0x6C, 0x7E, 0xC3, 0x37, 0xEF, 0x85, 0xC1, 0x2C,
0x44, 0xA7, 0xEC, 0xB6, 0xC1, 0x17, 0x19, 0x31, 0xA4, 0x77, 0xC4, 0xD2, 0x11, 0x0B, 0x8C, 0xAD, 0xEA, 0x87, 0x74, 0xCA, 0x6E, 0xEB, 0x7C, 0x91, 0x11, 0xC3, 0xFD, 0x8E, 0x58, 0x32, 0x62, 0xBE,
0xA6, 0x79, 0xD1, 0xC4, 0x85, 0x50, 0x1D, 0x55, 0x34, 0xCD, 0x6F, 0xF2, 0xA5, 0xBA, 0xFB, 0x69, 0xB1, 0xD5, 0x34, 0xCF, 0x9B, 0x38, 0x13, 0xCA, 0xA3, 0xF2, 0xA6, 0xF9, 0x4D, 0xB6, 0x54, 0x77,
0xBE, 0xA4, 0x29, 0xB2, 0x2C, 0x92, 0x28, 0xB0, 0x64, 0x99, 0x93, 0x05, 0xB7, 0x7D, 0x7B, 0x79, 0xFF, 0x9E, 0xBF, 0xD2, 0x04, 0x49, 0x16, 0x4A, 0x14, 0x58, 0xBC, 0xCC, 0xB6, 0x05, 0xAF, 0x7D,
0xA5, 0x65, 0x49, 0x14, 0x06, 0xDA, 0x4F, 0x41, 0x10, 0x48, 0xDC, 0xCC, 0x8C, 0xA5, 0xE1, 0x92, 0x7B, 0x79, 0xA5, 0xA5, 0x71, 0x18, 0xF8, 0xDA, 0x4F, 0xBE, 0xEF, 0x4B, 0xDC, 0xCC, 0x94, 0x25,
0x06, 0x05, 0x42, 0xFD, 0x98, 0xCD, 0xCD, 0x64, 0x6A, 0xB2, 0xEB, 0x25, 0xAD, 0x27, 0x41, 0xA0, 0xC1, 0x92, 0xFA, 0x39, 0x42, 0xFD, 0x88, 0xCD, 0xCD, 0x78, 0x6A, 0xB2, 0xEB, 0x25, 0xAD, 0xC6,
0xDF, 0xEC, 0x60, 0x5F, 0x0F, 0x3F, 0xB7, 0xFE, 0xCD, 0x32, 0xC9, 0x42, 0x16, 0x26, 0x71, 0x3F, 0xBE, 0xAF, 0xDF, 0xEC, 0x20, 0x5F, 0x0F, 0x7F, 0x6E, 0xBD, 0x9B, 0x65, 0x9C, 0x06, 0x2C, 0x88,
0xA5, 0x91, 0xCF, 0xC2, 0x4B, 0x3A, 0x08, 0xC2, 0x6C, 0x19, 0xF9, 0xD7, 0xFD, 0x71, 0x94, 0x4C, 0xA3, 0x7E, 0x42, 0x43, 0x8F, 0x05, 0x5F, 0xE9, 0xC0, 0x0F, 0xD2, 0x65, 0xE8, 0x5D, 0xF7, 0xC7,
0xBE, 0x16, 0xEC, 0x41, 0xA1, 0x6B, 0x76, 0x0B, 0x30, 0xE7, 0x1C, 0x0A, 0xE8, 0x24, 0x49, 0x7D, 0x61, 0x3C, 0xF9, 0x92, 0x93, 0x07, 0x99, 0xAE, 0xD9, 0x2D, 0xC0, 0x9C, 0x53, 0xC8, 0xA7, 0x93,
0x3E, 0x31, 0x4E, 0x62, 0x9A, 0xCB, 0x6A, 0x32, 0x99, 0xDC, 0x36, 0xFC, 0x09, 0xC2, 0xB9, 0x29, 0x38, 0xF1, 0xF8, 0xC4, 0x28, 0x8E, 0x68, 0xC6, 0xAB, 0xC9, 0x64, 0x72, 0x5B, 0xF7, 0x26, 0x08,
0x05, 0xB5, 0x43, 0x7C, 0x96, 0x65, 0xE5, 0x03, 0x35, 0xDF, 0xF0, 0xFB, 0xD3, 0x64, 0xB2, 0xCA, 0xE7, 0xA6, 0x60, 0xD4, 0x0E, 0xF6, 0x59, 0x96, 0x95, 0x0D, 0xD4, 0x3C, 0xC3, 0xEB, 0x4F, 0xE3,
0xE0, 0x3A, 0x4F, 0x80, 0x03, 0xCA, 0xD4, 0xDB, 0xC6, 0xD2, 0x8F, 0x69, 0x74, 0xB3, 0xF0, 0xD3, 0xC9, 0x2A, 0x85, 0xE7, 0x3C, 0x06, 0x0A, 0x28, 0x53, 0x6F, 0xEB, 0x4B, 0x2F, 0xA2, 0xE1, 0xCD,
0x59, 0x18, 0x9B, 0xE3, 0x84, 0xB1, 0x64, 0xD1, 0x77, 0x00, 0x99, 0xDD, 0x3A, 0x21, 0xB9, 0xB5, 0xC2, 0x4B, 0x66, 0x41, 0x64, 0x8E, 0x63, 0xC6, 0xE2, 0x45, 0xDF, 0x01, 0x64, 0x76, 0xCB, 0x84,
0xC1, 0xA9, 0x9C, 0x87, 0xA9, 0x1F, 0x84, 0xAB, 0xAC, 0x8F, 0x3A, 0x97, 0x2B, 0xFB, 0x38, 0xB9, 0xA4, 0xD6, 0x06, 0xA5, 0x32, 0x1A, 0x26, 0x9E, 0x1F, 0xAC, 0xD2, 0x3E, 0xCA, 0x5C, 0x26, 0xEC,
0x32, 0xB3, 0xB9, 0x1F, 0x24, 0xEB, 0xBE, 0xA5, 0xE1, 0x2C, 0xFC, 0xA6, 0xB3, 0xB1, 0x5F, 0xB7, 0xE3, 0xF8, 0xCA, 0x4C, 0xE7, 0x9E, 0x1F, 0xAF, 0xFB, 0x96, 0x86, 0xB3, 0xF0, 0x37, 0x99, 0x8D,
0x0C, 0xFC, 0x34, 0xAC, 0x96, 0x3E, 0xB8, 0xCF, 0x20, 0x89, 0xA9, 0xC9, 0x0D, 0xA3, 0xE0, 0x1A, 0xBD, 0xAA, 0x65, 0xE0, 0x4F, 0xDD, 0x6A, 0xE9, 0x83, 0xFB, 0x0C, 0x92, 0x98, 0x9A, 0x5C, 0x31,
0x30, 0x2C, 0xEF, 0x40, 0x45, 0x80, 0xB6, 0x9B, 0x6D, 0x8E, 0x1E, 0x56, 0xF4, 0x16, 0x7E, 0x72, 0x72, 0xAA, 0x01, 0xC1, 0xB2, 0x0E, 0x14, 0x04, 0x68, 0xBB, 0xD9, 0xA6, 0xE8, 0x61, 0x41, 0x6F,
0x0A, 0x64, 0xA3, 0x42, 0x13, 0xE8, 0x85, 0x99, 0xA2, 0x1A, 0xE5, 0xD4, 0xB9, 0xC8, 0x9B, 0xB2, 0xE1, 0x4F, 0xB6, 0x03, 0xD9, 0xA8, 0xEC, 0x09, 0xE4, 0xC2, 0x4C, 0x50, 0x8C, 0xB2, 0xDD, 0xB9,
0x0F, 0xB5, 0x78, 0x47, 0x97, 0xE4, 0xE4, 0xA6, 0x46, 0x4D, 0x93, 0x74, 0x01, 0x8B, 0xC4, 0x2C, 0x48, 0x9B, 0xA2, 0x0F, 0xA5, 0x78, 0x47, 0x97, 0xA4, 0xE4, 0xA6, 0x44, 0x4D, 0xE3, 0x64, 0x01,
0x4D, 0xA2, 0x9B, 0xAA, 0x26, 0x08, 0x4B, 0xF2, 0x57, 0x2C, 0x19, 0x48, 0xBD, 0x75, 0x91, 0x91, 0x8B, 0x44, 0x2C, 0x89, 0xC3, 0x9B, 0xB2, 0x24, 0x08, 0x4D, 0xF2, 0x56, 0x2C, 0x1E, 0x48, 0xB9,
0x39, 0x39, 0x6D, 0xA4, 0xC6, 0x81, 0x86, 0x07, 0x19, 0x77, 0xAB, 0xD5, 0xDA, 0x27, 0xC8, 0xB2, 0x75, 0x91, 0x90, 0xD9, 0x76, 0xDA, 0xB8, 0x1B, 0x07, 0x1A, 0x1E, 0xA4, 0xDC, 0xAD, 0x56, 0x6B,
0x35, 0x5C, 0xF8, 0x33, 0x2A, 0xF4, 0x6C, 0x5B, 0xBC, 0xA0, 0x72, 0xF7, 0x13, 0x6F, 0x18, 0x67, 0x1F, 0x23, 0x8B, 0xD6, 0x60, 0xE1, 0xCD, 0xA8, 0x90, 0xB3, 0x6D, 0xF6, 0x82, 0xC8, 0xDD, 0x8F,
0x94, 0x69, 0x7B, 0xE4, 0xD7, 0xA9, 0x4A, 0xF9, 0xCE, 0xB1, 0x66, 0x62, 0xB2, 0x14, 0x1C, 0x9A, 0xBD, 0x41, 0x94, 0x52, 0xA6, 0xED, 0xE1, 0x5F, 0xA7, 0xCC, 0xE5, 0x3B, 0xC7, 0x9A, 0xB1, 0xC9,
0xB0, 0x1D, 0x55, 0x38, 0x1A, 0xF5, 0x33, 0x6A, 0x82, 0xAE, 0x26, 0x2B, 0xA6, 0x35, 0xEC, 0x56, 0x12, 0x30, 0x68, 0x42, 0x77, 0x54, 0xE6, 0x68, 0xD4, 0x4B, 0xA9, 0x09, 0xB2, 0x1A, 0xAF, 0x98,
0x66, 0x94, 0x70, 0xB7, 0xFA, 0xAA, 0x0C, 0x17, 0x56, 0x70, 0x53, 0x15, 0x75, 0xBB, 0xED, 0x4F, 0x56, 0xB7, 0x5B, 0xA9, 0x51, 0xC0, 0xDD, 0xEA, 0x2B, 0x13, 0x5C, 0x68, 0xC1, 0x4D, 0x99, 0xD5,
0x69, 0x6F, 0x00, 0x33, 0x90, 0x93, 0xE0, 0xD5, 0x1E, 0x41, 0x9A, 0x61, 0x41, 0x67, 0x37, 0xEF, 0xED, 0xB6, 0x37, 0xA5, 0xBD, 0x01, 0xCC, 0x40, 0x4A, 0x82, 0x55, 0x7B, 0xC4, 0xD6, 0x0C, 0x0B,
0xB0, 0x2D, 0xC7, 0xB0, 0x3B, 0x2D, 0xC3, 0x71, 0x5D, 0xA3, 0xD1, 0xD6, 0x25, 0x0E, 0xC8, 0xEB, 0x3A, 0xBB, 0x59, 0x87, 0x6D, 0x39, 0x86, 0xDD, 0x69, 0x19, 0x8E, 0xEB, 0x1A, 0xF5, 0xB6, 0x2E,
0xE5, 0x86, 0x9D, 0x09, 0xF5, 0x1D, 0xB3, 0xB8, 0x50, 0x85, 0x30, 0xE6, 0xF2, 0x14, 0x1A, 0x51, 0x71, 0x40, 0x5A, 0x2F, 0x37, 0xF4, 0x4C, 0x88, 0xEF, 0x98, 0x45, 0xB9, 0x28, 0x04, 0x11, 0xE7,
0x1D, 0x6C, 0x09, 0xC9, 0xAF, 0x85, 0xA8, 0x3D, 0xCB, 0x1A, 0x28, 0xBE, 0x74, 0x42, 0x63, 0x46, 0xA7, 0x90, 0x88, 0xF2, 0x60, 0x4B, 0x70, 0x7E, 0x2D, 0x58, 0xDD, 0xB4, 0xAC, 0x81, 0x62, 0x4B,
0xD3, 0x4D, 0xF7, 0xB6, 0x08, 0x83, 0x20, 0xA2, 0x22, 0x24, 0x25, 0xAB, 0xC9, 0xDC, 0x44, 0x8F, 0x27, 0x34, 0x62, 0x34, 0xD9, 0x34, 0x6F, 0x8B, 0xC0, 0xF7, 0x43, 0x2A, 0x5C, 0x52, 0xBC, 0x9A,
0x00, 0xFC, 0x5C, 0xF8, 0x71, 0xB8, 0x5C, 0x45, 0xDC, 0xBF, 0x0C, 0xF6, 0xF7, 0x4C, 0x56, 0x69, 0xCC, 0x4D, 0xB4, 0x08, 0x40, 0xCF, 0x85, 0x17, 0x05, 0xCB, 0x55, 0xC8, 0xED, 0xCB, 0x60, 0x7F,
0x06, 0x2C, 0x5A, 0x26, 0x21, 0x07, 0x7E, 0x4F, 0x8D, 0xE1, 0x72, 0x5B, 0xFA, 0x29, 0x60, 0x34, 0xCF, 0x64, 0x95, 0xA4, 0x40, 0xA2, 0x65, 0x1C, 0x70, 0xE0, 0xF7, 0x94, 0x18, 0xCE, 0xB7, 0xA5,
0x38, 0x10, 0x0F, 0x1E, 0xA8, 0xCF, 0x3B, 0x54, 0x70, 0x91, 0x7C, 0x33, 0x57, 0x19, 0x46, 0x24, 0x97, 0x00, 0x46, 0x83, 0x03, 0xFE, 0xE0, 0x81, 0xF2, 0xBC, 0x43, 0x04, 0x17, 0xF1, 0x37, 0x73,
0x1A, 0xD1, 0x09, 0x13, 0xE8, 0x20, 0xAD, 0x5B, 0x8D, 0x9B, 0x0D, 0x9C, 0xE7, 0xE6, 0x32, 0x05, 0x95, 0xA2, 0x47, 0xA2, 0x21, 0x9D, 0x30, 0x81, 0x0E, 0xEE, 0x75, 0xAB, 0x71, 0xB3, 0x81, 0xD3,
0x32, 0xD2, 0xEB, 0xC3, 0x8E, 0xD4, 0x75, 0x3B, 0xFE, 0xB8, 0xB3, 0xE1, 0x1E, 0x1C, 0xDA, 0x0E, 0xDC, 0x5C, 0x26, 0xB0, 0x8D, 0xE4, 0xFA, 0xB0, 0x21, 0x75, 0xDD, 0x8E, 0x37, 0xEE, 0x6C, 0x98,
0x7C, 0xAF, 0x02, 0x45, 0x3A, 0x5B, 0xA3, 0xD2, 0x26, 0xBC, 0x6E, 0xA5, 0x89, 0x3B, 0xE0, 0x4A, 0x07, 0x87, 0xB6, 0x7D, 0xAF, 0x59, 0x82, 0x22, 0x8D, 0xAD, 0x51, 0x6A, 0x13, 0x56, 0xB7, 0xD4,
0x53, 0x7F, 0xC7, 0xCC, 0xFE, 0xF6, 0xCC, 0x2D, 0xD7, 0xBD, 0x03, 0x59, 0xA7, 0xDB, 0xB6, 0x7A, 0xC4, 0x0D, 0x70, 0xA9, 0xA9, 0xBF, 0x63, 0x66, 0x7F, 0x7B, 0xE6, 0x96, 0xE9, 0xDE, 0x81, 0xAC,
0xD6, 0x06, 0xB2, 0xB6, 0xE3, 0x8C, 0x3D, 0x8B, 0x23, 0x1B, 0x2E, 0x66, 0x37, 0x52, 0xA8, 0x73, 0xD3, 0x6D, 0x5B, 0x3D, 0x6B, 0x03, 0x59, 0xDB, 0x71, 0xC6, 0x4D, 0x8B, 0x23, 0x1B, 0x2C, 0x66,
0x3F, 0xDE, 0x74, 0xDB, 0xED, 0xC2, 0x7B, 0xA9, 0xF6, 0xCF, 0x83, 0x84, 0x98, 0x2B, 0x51, 0xD8, 0x37, 0x92, 0xA9, 0x73, 0x2F, 0xDA, 0x34, 0xDB, 0xED, 0xDC, 0x7A, 0xA9, 0xFA, 0xCF, 0x9D, 0x84,
0xE1, 0x4F, 0x2C, 0xFC, 0x6C, 0xAC, 0xDB, 0x9E, 0xE0, 0xE7, 0xD1, 0xE6, 0x84, 0xFA, 0x31, 0x4B, 0x98, 0x2B, 0x51, 0xD8, 0x61, 0x4F, 0x2C, 0xFC, 0xD9, 0x58, 0xB7, 0x3D, 0xC1, 0x9F, 0x47, 0xAB,
0xE9, 0xF5, 0x43, 0xDC, 0x46, 0x65, 0x22, 0xC7, 0x9A, 0xA3, 0x79, 0x98, 0x6C, 0xD7, 0x92, 0x46, 0x13, 0xCA, 0xC7, 0x2C, 0xA1, 0xD7, 0x0F, 0x31, 0x1B, 0xA5, 0x89, 0x1C, 0x6B, 0x8E, 0xE6, 0xE1,
0x98, 0x8F, 0xBD, 0x8B, 0xCC, 0x7F, 0x27, 0x45, 0x11, 0x20, 0x05, 0x16, 0xF2, 0xD5, 0x28, 0x6F, 0x6D, 0xBB, 0x96, 0x54, 0xC2, 0x6C, 0xEC, 0x5D, 0xDB, 0xFC, 0x33, 0x77, 0x14, 0x02, 0x52, 0xA0,
0xFB, 0xD5, 0x7C, 0x80, 0x47, 0xFE, 0xB2, 0xB3, 0xA2, 0x35, 0xD8, 0x17, 0xC6, 0xCB, 0x15, 0xFB, 0x21, 0x5F, 0x8C, 0xE2, 0xB5, 0x5F, 0x8E, 0x07, 0xB8, 0xE7, 0x2F, 0x3A, 0x4B, 0x52, 0x83, 0x7D,
0x88, 0xB9, 0xCB, 0x70, 0x1A, 0x46, 0xF4, 0x73, 0xBF, 0x9F, 0xD3, 0x83, 0x8F, 0xE6, 0x6A, 0x19, 0x41, 0xB4, 0x5C, 0xB1, 0x8F, 0x18, 0xBB, 0x0C, 0xA7, 0x41, 0x48, 0x3F, 0xF7, 0xFB, 0xD9, 0x7E,
0x25, 0x7E, 0x60, 0x8E, 0x57, 0xE0, 0x73, 0xFE, 0x76, 0x4B, 0xFF, 0xBF, 0x6E, 0x69, 0x70, 0xD0, 0xF0, 0xAB, 0xB9, 0x5A, 0x86, 0xB1, 0xE7, 0x9B, 0xE3, 0x15, 0xD8, 0x9C, 0xBF, 0xCD, 0xD2, 0xFF,
0xB8, 0x5B, 0xE3, 0x89, 0x15, 0xD0, 0x0D, 0x23, 0xF3, 0xDA, 0xE3, 0x6E, 0xE0, 0x3F, 0x48, 0xA8, 0xAD, 0x59, 0x1A, 0x1C, 0x54, 0xEE, 0xD6, 0x78, 0x62, 0xF9, 0x74, 0x43, 0xC9, 0x9A, 0xED, 0x71,
0x32, 0x0A, 0xFE, 0x2D, 0xDA, 0xBF, 0x8E, 0x68, 0x5D, 0x7B, 0x6C, 0x05, 0x9B, 0x39, 0xA8, 0x3D, 0xD7, 0xF7, 0x1E, 0xC4, 0x54, 0xE9, 0x05, 0xFF, 0x66, 0xED, 0x5F, 0x87, 0xB5, 0xAE, 0x3D, 0xB6,
0x6E, 0x07, 0xDD, 0xD6, 0xC3, 0x44, 0x2B, 0xAC, 0xFD, 0x6F, 0xD1, 0xFE, 0xC5, 0x45, 0xEB, 0xB4, 0xFC, 0xCD, 0x18, 0xD4, 0x1E, 0xB7, 0xFD, 0x6E, 0xEB, 0x61, 0xAC, 0x15, 0xDA, 0xFE, 0x37, 0x6B,
0x7B, 0xFE, 0x78, 0x92, 0x17, 0x2E, 0xD3, 0x24, 0x01, 0x8E, 0x1C, 0xA8, 0x5B, 0xEC, 0x8E, 0xD5, 0xFF, 0xE2, 0xAC, 0x75, 0xDA, 0x3D, 0x6F, 0x3C, 0xC9, 0x12, 0x97, 0x69, 0x1C, 0x03, 0x45, 0x0E,
0xDD, 0x05, 0xFB, 0x1E, 0xA5, 0xCB, 0x56, 0x01, 0xF2, 0x6F, 0x58, 0x72, 0x91, 0x04, 0x7E, 0x59, 0xE4, 0x2D, 0x76, 0xC7, 0xEA, 0xEE, 0x82, 0x7D, 0x8F, 0xD4, 0x65, 0x2B, 0x01, 0xF9, 0x13, 0x96,
0xEC, 0x70, 0x96, 0x15, 0x55, 0xF1, 0x34, 0xBC, 0xA2, 0xC1, 0xE0, 0x1B, 0xE4, 0xEC, 0x01, 0xBD, 0x5C, 0xC4, 0xBE, 0x57, 0x24, 0x3B, 0x9C, 0x64, 0x79, 0x56, 0x3C, 0x0D, 0xAE, 0xA8, 0x3F, 0xF8,
0xC2, 0x6D, 0x04, 0xD0, 0x44, 0x89, 0x95, 0x80, 0x65, 0x61, 0x29, 0x8A, 0x35, 0x16, 0xA8, 0x2C, 0x06, 0x31, 0xBB, 0x4F, 0xAF, 0xB0, 0x8C, 0x00, 0x92, 0x28, 0xB1, 0x12, 0xB0, 0x2C, 0x4C, 0x45,
0x36, 0x58, 0x83, 0x72, 0xC7, 0x21, 0xAF, 0x93, 0xF8, 0x3D, 0x6A, 0xFE, 0x34, 0x82, 0x90, 0xCA, 0x31, 0xC7, 0x02, 0x91, 0xC5, 0x06, 0x6B, 0x50, 0x54, 0x1C, 0xB2, 0x3C, 0x89, 0xBF, 0xA3, 0xE4,
0x2B, 0xA8, 0x9D, 0x15, 0xF1, 0x76, 0xAB, 0x1A, 0x6E, 0x3D, 0x5D, 0xA2, 0xCA, 0xCB, 0x05, 0x50, 0x4F, 0x43, 0x70, 0xA9, 0x3C, 0x83, 0xDA, 0x99, 0x11, 0x6F, 0xB7, 0xAA, 0xEE, 0xB6, 0xA9, 0x4B,
0xB8, 0x9B, 0x3D, 0x55, 0x9E, 0x6D, 0x55, 0x2B, 0xC0, 0x4A, 0x75, 0xA8, 0x76, 0x0A, 0x5B, 0xDB, 0x54, 0x79, 0xBA, 0x00, 0x02, 0x77, 0xB3, 0x27, 0xCB, 0xB3, 0xAD, 0x72, 0x06, 0x58, 0xCA, 0x0E,
0x3B, 0x57, 0x76, 0xEF, 0x9B, 0xDE, 0x77, 0x4A, 0x3E, 0x16, 0x59, 0xA8, 0x52, 0x27, 0x63, 0xBD, 0xD5, 0x4E, 0xA1, 0x6B, 0x7B, 0xE7, 0xCA, 0xEE, 0x7D, 0xD3, 0xFB, 0x4E, 0x41, 0xC7, 0x3C, 0x0A,
0x61, 0xA3, 0xE2, 0x5B, 0x95, 0xAC, 0xC1, 0xD1, 0x07, 0xDB, 0x7B, 0x0E, 0xC2, 0xF8, 0x05, 0x6B, 0x55, 0xF2, 0x64, 0xCC, 0x37, 0x6C, 0x14, 0x7C, 0xAB, 0x14, 0x35, 0x38, 0xFA, 0x60, 0xBB, 0xE6,
0x72, 0xA1, 0xEF, 0x60, 0xC7, 0x4F, 0x53, 0x8A, 0x9F, 0x9C, 0x0F, 0x58, 0x51, 0x2B, 0x5A, 0xE2, 0x20, 0x94, 0x5F, 0x90, 0x26, 0x63, 0xFA, 0x0E, 0x72, 0xFC, 0x34, 0xA5, 0xF8, 0x93, 0xD1, 0x01,
0xC8, 0x05, 0x73, 0x25, 0xE1, 0xD9, 0xD0, 0x4E, 0x25, 0x71, 0xF0, 0xB3, 0xAF, 0x48, 0x7E, 0x20, 0x33, 0x6A, 0x45, 0x4A, 0x1C, 0xB9, 0x60, 0x26, 0x24, 0x3C, 0x1A, 0xDA, 0x29, 0x24, 0x0E, 0xFE,
0xFB, 0x2A, 0xB5, 0xE8, 0x14, 0x3F, 0x39, 0x7A, 0xD5, 0x9D, 0x00, 0x4B, 0x62, 0x97, 0xF7, 0x6E, 0xEC, 0x4B, 0x92, 0x1F, 0x48, 0xBE, 0x52, 0x2E, 0x3A, 0xC5, 0x9F, 0x0C, 0xBD, 0x72, 0x25, 0xC0,
0xAA, 0x78, 0x3B, 0xC7, 0x5E, 0x2A, 0x8D, 0xD7, 0x68, 0xD1, 0xC5, 0xC3, 0x49, 0xD9, 0x46, 0xE7, 0x92, 0xD8, 0x65, 0xBD, 0x9B, 0x22, 0xDE, 0xCE, 0xB0, 0x97, 0x42, 0xD3, 0xAC, 0xB7, 0xE8, 0xE2,
0x4F, 0x4A, 0xFB, 0xB6, 0x31, 0x0F, 0x03, 0xFA, 0x25, 0x64, 0x15, 0x0B, 0xB9, 0xFD, 0xC7, 0x82, 0xE1, 0x5B, 0xD9, 0x46, 0xE7, 0x0F, 0x72, 0xFB, 0xB6, 0x3E, 0x0F, 0x7C, 0x7A, 0x11, 0xB0, 0x92,
0x06, 0xA1, 0xAF, 0xD5, 0x17, 0xE0, 0xB3, 0x85, 0xC6, 0x77, 0xDA, 0x20, 0x71, 0xFD, 0x66, 0x43, 0x86, 0xDC, 0xFE, 0x63, 0x41, 0xFD, 0xC0, 0xD3, 0xAA, 0x0B, 0xB0, 0xD9, 0x42, 0xE2, 0x3B, 0x6D,
0x47, 0x45, 0x5F, 0xAB, 0x8B, 0x90, 0xF2, 0x49, 0xD9, 0x24, 0xA5, 0x34, 0xD6, 0x20, 0xD5, 0x85, 0xE0, 0xB8, 0x7E, 0xB3, 0x21, 0xA3, 0xA2, 0xAF, 0xD5, 0x45, 0x48, 0xD9, 0xA4, 0x74, 0x92, 0x50,
0xF9, 0xC5, 0x1E, 0x5D, 0xA7, 0xDD, 0xD9, 0x3B, 0x9F, 0xEF, 0xDF, 0xDD, 0x9E, 0x34, 0xC5, 0xF6, 0x1A, 0x69, 0x10, 0xEA, 0xC2, 0xFC, 0xBC, 0x46, 0xD7, 0x69, 0x77, 0xF6, 0xCE, 0xE7, 0xF5, 0xBB,
0xE6, 0x09, 0x0B, 0x19, 0x5C, 0x5E, 0x9C, 0xBD, 0x75, 0x9F, 0x6B, 0x2C, 0x49, 0x22, 0x6D, 0x09, 0xDB, 0xA3, 0x86, 0x28, 0x6F, 0x1E, 0xB1, 0x80, 0xC1, 0xE3, 0xC5, 0xD9, 0x3B, 0xF7, 0xB9, 0xC6,
0x1E, 0xFA, 0xA4, 0x29, 0x9A, 0x4F, 0x9A, 0x62, 0x2B, 0x94, 0xEF, 0x86, 0x9D, 0x04, 0xE1, 0xA5, 0xE2, 0x38, 0xD4, 0x96, 0x60, 0xA1, 0x8F, 0x1A, 0xA2, 0xF9, 0xA8, 0x21, 0x4A, 0xA1, 0xBC, 0x1A,
0x36, 0x89, 0xFC, 0x2C, 0x1B, 0x12, 0xEE, 0x5A, 0x08, 0xCC, 0xC6, 0x5D, 0x33, 0x8D, 0x03, 0x1E, 0x76, 0xE4, 0x07, 0x5F, 0xB5, 0x49, 0xE8, 0xA5, 0xE9, 0x90, 0x70, 0xD3, 0x42, 0x60, 0x36, 0x56,
0x12, 0x84, 0x8C, 0x6D, 0x29, 0x7C, 0x61, 0x92, 0x9F, 0x0F, 0x16, 0x15, 0x05, 0xD1, 0xE6, 0x29, 0xCD, 0x34, 0x0E, 0x78, 0x48, 0x10, 0x32, 0xB6, 0x25, 0xF0, 0x0B, 0x93, 0xBC, 0x6C, 0xB0, 0xC8,
0x9D, 0x0E, 0xC9, 0x9C, 0xB1, 0x65, 0xD6, 0x6F, 0x36, 0xD7, 0xEB, 0x75, 0x63, 0x16, 0xB2, 0xF9, 0x28, 0x88, 0x36, 0x4F, 0xE8, 0x74, 0x48, 0xE6, 0x8C, 0x2D, 0xD3, 0x7E, 0xA3, 0xB1, 0x5E, 0xAF,
0x6A, 0xDC, 0x98, 0x24, 0x8B, 0x66, 0xB4, 0x9A, 0x98, 0xE2, 0xB1, 0xC9, 0x91, 0x69, 0x32, 0x20, 0xEB, 0xB3, 0x80, 0xCD, 0x57, 0xE3, 0xFA, 0x24, 0x5E, 0x34, 0xC2, 0xD5, 0xC4, 0x14, 0x5F, 0x1B,
0xAC, 0xE9, 0x36, 0x2C, 0xA2, 0x31, 0xD0, 0x68, 0xCA, 0x86, 0xE4, 0x0B, 0xA4, 0xBA, 0xF1, 0x57, 0x1C, 0x99, 0x06, 0x83, 0x8D, 0x35, 0xDC, 0xBA, 0x45, 0x34, 0x06, 0x12, 0x4D, 0xD9, 0x90, 0x5C,
0x58, 0x21, 0xBB, 0x9C, 0x15, 0x6B, 0xD2, 0x05, 0x00, 0xE6, 0x62, 0x96, 0x0F, 0x97, 0x21, 0x5D, 0x40, 0xA8, 0x1B, 0x7D, 0x81, 0x15, 0xD2, 0xAF, 0xB3, 0x7C, 0x4D, 0xBA, 0x00, 0xC0, 0x9C, 0xCD,
0xFF, 0x92, 0x5C, 0x0D, 0x09, 0xA6, 0xD3, 0xB6, 0x6B, 0xC1, 0x8F, 0x63, 0x59, 0x30, 0x6B, 0x26, 0xF2, 0xCB, 0xD7, 0x80, 0xAE, 0x7F, 0x89, 0xAF, 0x86, 0x04, 0xC3, 0x69, 0xDB, 0xB5, 0xE0, 0xC3,
0x22, 0x0C, 0x56, 0xE8, 0x43, 0xC2, 0x6F, 0xC1, 0x62, 0x68, 0xBD, 0x65, 0x19, 0x38, 0x40, 0x07, 0xB1, 0x2C, 0x98, 0x35, 0x13, 0x1E, 0x06, 0x33, 0xF4, 0x21, 0xE1, 0xAF, 0xA0, 0x31, 0xB4, 0xDA,
0x56, 0xFA, 0x11, 0xAD, 0xDB, 0x86, 0x66, 0xDA, 0x3A, 0x0C, 0x5F, 0xFA, 0x6C, 0xAE, 0x05, 0x43, 0xB2, 0x0C, 0x1C, 0xA0, 0x03, 0x29, 0xBD, 0x90, 0x56, 0x6D, 0x43, 0x33, 0x6D, 0x1D, 0x86, 0x2F,
0xF2, 0xBA, 0x8D, 0x20, 0xEC, 0x8E, 0x77, 0xE1, 0xBA, 0x00, 0xB1, 0xE3, 0x69, 0x66, 0x2B, 0x72, 0x3D, 0x36, 0xD7, 0xFC, 0x21, 0x79, 0xDD, 0x46, 0x10, 0x76, 0xA7, 0x79, 0xE9, 0xBA, 0x00, 0xB1,
0xBB, 0x30, 0xAA, 0xE5, 0x44, 0x2D, 0xB8, 0x5C, 0x78, 0x3D, 0xF8, 0xF5, 0xB4, 0x1E, 0xF4, 0xB8, 0xD3, 0xD4, 0xCC, 0x56, 0xE8, 0x76, 0x61, 0x54, 0xCB, 0x09, 0x5B, 0xF0, 0xB8, 0x6C, 0xF6, 0xE0,
0x3D, 0x6C, 0x72, 0x22, 0xDB, 0xF5, 0xB4, 0xAE, 0x75, 0xD1, 0xB6, 0x35, 0xD3, 0xEB, 0x6A, 0xB6, 0xB3, 0xA9, 0xF5, 0xA0, 0xC7, 0xED, 0x61, 0x93, 0x13, 0xDA, 0x6E, 0x53, 0xEB, 0x5A, 0x97, 0x6D,
0x05, 0x5D, 0xB6, 0xD5, 0x8A, 0xCC, 0xAE, 0x05, 0x37, 0xAE, 0x17, 0xB9, 0x00, 0xE4, 0xC2, 0x81, 0x5B, 0x33, 0x9B, 0x5D, 0xCD, 0xB6, 0xA0, 0xCB, 0xB6, 0x5A, 0xA1, 0xD9, 0xB5, 0xE0, 0xC5, 0x6D,
0xA1, 0x9E, 0xA7, 0xB9, 0x30, 0xBD, 0xE7, 0x46, 0x30, 0xB4, 0x1D, 0x01, 0x4C, 0x00, 0xD2, 0xBD, 0x86, 0x2E, 0x00, 0xB9, 0x74, 0x60, 0x68, 0xB3, 0xA9, 0xB9, 0x30, 0xBD, 0xE7, 0x86, 0x30, 0xB4,
0xC0, 0x1E, 0x57, 0x83, 0xDF, 0x8E, 0x7B, 0x01, 0x53, 0x5C, 0x5C, 0x14, 0x1E, 0xBC, 0xC8, 0x94, 0x1D, 0x02, 0x4C, 0x00, 0xD2, 0xBD, 0xC4, 0x1E, 0x57, 0x83, 0xCF, 0x8E, 0x7B, 0x09, 0x53, 0x5C,
0x23, 0xE0, 0x06, 0xC6, 0x5F, 0xC0, 0x23, 0x8C, 0xEC, 0xE1, 0xC2, 0x1C, 0x88, 0x89, 0x80, 0x23, 0x5C, 0x14, 0xBE, 0x34, 0x43, 0x53, 0x8E, 0x80, 0x17, 0x18, 0x7F, 0x09, 0x5F, 0x61, 0x64, 0x0F,
0xB9, 0xCA, 0x05, 0xAE, 0x6D, 0x22, 0x0E, 0x25, 0x02, 0x1C, 0x31, 0x3B, 0x42, 0x68, 0xEE, 0x05, 0x17, 0xE6, 0x40, 0x4C, 0x04, 0x1C, 0xCA, 0x55, 0x2E, 0x71, 0x6D, 0x13, 0x71, 0x28, 0x10, 0xE0,
0xAE, 0x6E, 0x22, 0x16, 0x12, 0x75, 0x93, 0xE3, 0x6E, 0x0A, 0xE2, 0x6C, 0xED, 0x02, 0x71, 0x10, 0x88, 0xD9, 0x21, 0x42, 0x73, 0x2F, 0x71, 0x75, 0x13, 0xB1, 0x90, 0xA8, 0x9B, 0x1C, 0x77, 0x53,
0xEB, 0x22, 0xBA, 0x26, 0xA7, 0x1F, 0x1F, 0x5A, 0x7C, 0x0C, 0x0C, 0xC1, 0x19, 0xCE, 0x05, 0x22, 0x6C, 0xCE, 0xD6, 0x2E, 0x11, 0x07, 0xB1, 0x2E, 0xA2, 0x6B, 0xF2, 0xFD, 0xE3, 0x97, 0x16, 0x1F,
0x00, 0xF4, 0x23, 0x14, 0x01, 0xC4, 0x15, 0xEB, 0x98, 0x5D, 0xFB, 0xC2, 0x6C, 0x5B, 0x1A, 0x62, 0x03, 0x43, 0x70, 0x86, 0x73, 0x89, 0x08, 0xC0, 0xFE, 0x11, 0x8A, 0x00, 0xE2, 0x8A, 0x75, 0xCC,
0x81, 0x18, 0x20, 0x02, 0x5D, 0x94, 0x89, 0x87, 0x78, 0x02, 0x40, 0x58, 0xDA, 0x43, 0x44, 0xBA, 0xAE, 0x7D, 0x69, 0xB6, 0x2D, 0x0D, 0xB1, 0x40, 0x0C, 0x10, 0x81, 0x2E, 0xF2, 0xA4, 0x89, 0x78,
0x1A, 0xA2, 0xEE, 0x68, 0xED, 0x88, 0xAF, 0x0B, 0xF4, 0x9B, 0x6D, 0xCD, 0x03, 0x3A, 0xDB, 0xC0, 0x02, 0x40, 0x58, 0xBA, 0x89, 0x88, 0x74, 0x35, 0x44, 0xDD, 0xD1, 0xDA, 0x21, 0x5F, 0x17, 0xF6,
0x6E, 0xA0, 0x1F, 0x16, 0x86, 0x3B, 0x60, 0x11, 0xEF, 0x8C, 0x60, 0xE0, 0x85, 0xED, 0x22, 0x58, 0x6F, 0xB6, 0xB5, 0x26, 0xEC, 0xB3, 0x0D, 0xE4, 0x86, 0xFD, 0xC3, 0xC2, 0xF0, 0x06, 0x24, 0xE2,
0x31, 0xD3, 0xD5, 0x04, 0x67, 0x91, 0x64, 0xAF, 0xA3, 0x01, 0xC1, 0xB0, 0x12, 0x5F, 0xCD, 0x86, 0x9D, 0x21, 0x0C, 0xBC, 0xB4, 0x5D, 0x04, 0x2B, 0x66, 0xBA, 0x9A, 0xA0, 0x2C, 0x6E, 0xB9, 0xD9,
0x99, 0xD0, 0x13, 0x21, 0x96, 0xB0, 0x12, 0xAC, 0x27, 0x70, 0x84, 0xDE, 0x88, 0x53, 0x00, 0xCD, 0xD1, 0x60, 0xC3, 0xB0, 0x12, 0x5F, 0xCD, 0x86, 0x99, 0xD0, 0x13, 0x22, 0x96, 0xB0, 0x12, 0xAC,
0xC8, 0x66, 0xA4, 0xE9, 0x1B, 0x17, 0x74, 0x17, 0x18, 0x7A, 0x61, 0x76, 0x7B, 0x48, 0x29, 0x67, 0x27, 0x70, 0x84, 0xDE, 0x90, 0xEF, 0x00, 0x9A, 0x91, 0xCC, 0xB8, 0xA7, 0x6F, 0x9C, 0xD1, 0x5D,
0x75, 0xDB, 0x65, 0xF0, 0xE5, 0x0C, 0x69, 0xB4, 0x58, 0x79, 0x97, 0x77, 0xE2, 0x15, 0x2E, 0xD0, 0x20, 0xE8, 0xA5, 0xD9, 0xED, 0xE1, 0x4E, 0x39, 0xA9, 0xDB, 0x2E, 0x83, 0x5F, 0x4E, 0x90, 0x7A,
0x21, 0xDA, 0xCD, 0xF2, 0x4E, 0x74, 0x7D, 0x03, 0x5D, 0x6A, 0xA2, 0x32, 0xC1, 0x65, 0x06, 0x5F, 0x8B, 0x15, 0x6F, 0x59, 0x27, 0x3E, 0xE1, 0x01, 0x1D, 0xA2, 0xDD, 0x2C, 0xDE, 0x44, 0xD7, 0x37,
0x50, 0xDE, 0x91, 0x76, 0x02, 0xA9, 0x4D, 0x5C, 0xD8, 0x47, 0x5E, 0xC1, 0x91, 0xD1, 0xCB, 0x30, 0x90, 0xA5, 0x06, 0x0A, 0x13, 0x3C, 0x66, 0xF0, 0x0B, 0xC2, 0x3B, 0xD2, 0x8E, 0x20, 0xB4, 0x89,
0x5D, 0xAC, 0x21, 0x05, 0x82, 0x61, 0x30, 0x00, 0x46, 0xFB, 0xF0, 0x45, 0x63, 0xFA, 0xF3, 0x06, 0x72, 0xFD, 0xC8, 0x32, 0x38, 0x32, 0x7A, 0x19, 0x24, 0x8B, 0x35, 0x84, 0x40, 0x30, 0x0C, 0x06,
0x65, 0x7E, 0x78, 0xF1, 0xCB, 0xFB, 0xD3, 0xBF, 0x98, 0x59, 0x59, 0x3D, 0xEF, 0xA2, 0xEB, 0x20, 0xC0, 0x68, 0x0F, 0x7E, 0x51, 0x99, 0xFE, 0xB8, 0x42, 0x99, 0x1F, 0x5E, 0xFC, 0xF2, 0xFE, 0xE4,
0xC4, 0xB6, 0xD5, 0x40, 0xED, 0x73, 0x90, 0xB5, 0x1E, 0x30, 0xBF, 0xD5, 0x63, 0xB6, 0xDD, 0xC6, 0x2F, 0xA6, 0x56, 0x56, 0xAF, 0x79, 0xD9, 0x75, 0x10, 0x62, 0xDB, 0xAA, 0xA3, 0xF4, 0x39, 0x48,
0xB6, 0x2E, 0xB6, 0xF5, 0x3C, 0xBC, 0xED, 0x81, 0x04, 0xBA, 0xFC, 0xE2, 0x39, 0x45, 0x17, 0xAA, 0xDA, 0x26, 0x10, 0xBF, 0xD5, 0x63, 0xB6, 0xDD, 0xC6, 0xB6, 0x2E, 0xB6, 0xF5, 0x9A, 0xF8, 0xDA,
0x5E, 0xAB, 0xC3, 0x19, 0x5E, 0xDC, 0xA1, 0xE2, 0xF2, 0x4E, 0xB3, 0xDD, 0x95, 0x13, 0xCD, 0x02, 0x03, 0x0E, 0x74, 0xF9, 0xA3, 0xE9, 0xE4, 0x5D, 0x28, 0x7A, 0xAD, 0x0E, 0x27, 0x78, 0xFE, 0x86,
0x84, 0xA9, 0x02, 0x36, 0xF3, 0xD5, 0x40, 0x5C, 0xBD, 0x02, 0x05, 0xF9, 0xE0, 0x14, 0x23, 0xF8, 0x82, 0xCB, 0x3B, 0xCD, 0x76, 0x57, 0x4E, 0x34, 0x73, 0x10, 0xA6, 0x0A, 0xD8, 0xCC, 0x56, 0x03,
0x00, 0x3E, 0x4D, 0xCC, 0xE2, 0xC0, 0x7A, 0x39, 0xFC, 0x9E, 0x58, 0x32, 0x07, 0xA8, 0x71, 0x24, 0x76, 0xF5, 0x72, 0x14, 0xE4, 0x17, 0x27, 0x1F, 0xC1, 0x07, 0xF0, 0x69, 0x62, 0x16, 0x07, 0xD6,
0xF2, 0x2B, 0x47, 0x95, 0x77, 0x01, 0xEE, 0xBD, 0x96, 0xC6, 0xF2, 0xB9, 0x0A, 0x3C, 0xB9, 0x84, 0xCB, 0xE0, 0xF7, 0xC4, 0x92, 0x19, 0x40, 0x8D, 0x23, 0x91, 0x3D, 0x39, 0xAA, 0xBC, 0x0B, 0x70,
0xE0, 0x02, 0xAE, 0xFA, 0xED, 0x75, 0xB7, 0xDB, 0x85, 0xBE, 0x1E, 0x37, 0x71, 0xB4, 0x72, 0x1B, 0xEF, 0xB5, 0x34, 0x96, 0xCD, 0x55, 0xE0, 0xC9, 0x25, 0x04, 0x15, 0x70, 0xD5, 0x6F, 0xAF, 0xBB,
0xF4, 0xD5, 0x61, 0x1C, 0x41, 0xEE, 0x39, 0x5A, 0x1D, 0xD4, 0x67, 0x40, 0xAA, 0x87, 0x1E, 0xC2, 0xDD, 0x2E, 0xF4, 0xF5, 0xB8, 0x8A, 0xA3, 0x96, 0xDB, 0x20, 0xAF, 0x0E, 0xE3, 0x08, 0x72, 0xCB,
0x76, 0xD0, 0xDE, 0x80, 0x37, 0x0E, 0x0C, 0xC2, 0x1F, 0x7C, 0x12, 0x37, 0x78, 0x85, 0x1E, 0xB8, 0xD1, 0xEA, 0xA0, 0x3C, 0x03, 0x52, 0x3D, 0xB4, 0x10, 0xB6, 0x83, 0xFA, 0x06, 0xB4, 0x71, 0x60,
0xBD, 0xC0, 0x45, 0x34, 0x07, 0x14, 0xD4, 0x06, 0xB6, 0x6B, 0x76, 0x4F, 0xF3, 0xF8, 0x72, 0x80, 0x10, 0x7E, 0xE0, 0x37, 0xF1, 0x82, 0x4F, 0xE8, 0x81, 0xD7, 0x4B, 0x5C, 0x44, 0x73, 0x40, 0x40,
0x73, 0x07, 0x49, 0x87, 0x11, 0x66, 0x07, 0x80, 0xB5, 0xD1, 0xA1, 0xB5, 0x11, 0x6A, 0x17, 0x9C, 0x6D, 0x20, 0xBB, 0x66, 0xF7, 0xB4, 0x26, 0x5F, 0x0E, 0x70, 0xEE, 0xE0, 0xD6, 0x61, 0x84, 0xD9,
0x88, 0x8D, 0x3A, 0xDF, 0xD6, 0x84, 0xAB, 0xB1, 0x50, 0x16, 0x70, 0x05, 0x14, 0x2F, 0x1C, 0xF4, 0x01, 0x60, 0x6D, 0x34, 0x68, 0x6D, 0x84, 0xDA, 0x05, 0x23, 0x62, 0xA3, 0xCC, 0xB7, 0x35, 0x61,
0x44, 0x60, 0xA8, 0x1D, 0x70, 0x0A, 0x36, 0xC3, 0x89, 0x5D, 0x87, 0xF5, 0x84, 0x60, 0x6C, 0xA0, 0x6A, 0x2C, 0xE4, 0x05, 0x3C, 0x01, 0xC5, 0x4B, 0x07, 0x2D, 0x11, 0x28, 0x6A, 0x07, 0x8C, 0x82,
0x0E, 0x9D, 0x47, 0x17, 0x89, 0x73, 0x5D, 0xCE, 0x58, 0x5C, 0x4C, 0x3E, 0x38, 0x1E, 0xEF, 0xE7, 0xCD, 0x70, 0x62, 0xD7, 0x61, 0x3D, 0xC1, 0x18, 0x1B, 0x76, 0x87, 0xC6, 0xA3, 0x8B, 0x9B, 0x73,
0xDD, 0x7C, 0x46, 0x17, 0x2D, 0xA6, 0x63, 0x89, 0x2B, 0x40, 0xEC, 0xC0, 0x42, 0x17, 0x36, 0x58, 0x5D, 0x4E, 0x58, 0x5C, 0x4C, 0x7E, 0x71, 0x9A, 0xBC, 0x9F, 0x77, 0xF3, 0x19, 0x5D, 0xD4, 0x98,
0x32, 0xB0, 0x4C, 0xF3, 0x72, 0xBE, 0x7A, 0xD0, 0x7B, 0x61, 0xF6, 0xB8, 0x3F, 0x46, 0xA4, 0x80, 0x8E, 0x25, 0x9E, 0x00, 0xB1, 0x03, 0x0B, 0x5D, 0xDA, 0xA0, 0xC9, 0x40, 0x32, 0xAD, 0x99, 0xD1,
0x92, 0x6E, 0xEF, 0xDB, 0x6B, 0x0F, 0x5C, 0x41, 0xC7, 0xE9, 0x80, 0x57, 0x41, 0x6F, 0x22, 0xBD, 0xB5, 0x09, 0xBD, 0x97, 0x66, 0x8F, 0xDB, 0x63, 0x44, 0x0A, 0x76, 0xD2, 0xED, 0x7D, 0x7B, 0xDD,
0x22, 0xFF, 0x72, 0x89, 0xBA, 0xB8, 0x0A, 0x17, 0x3E, 0x9F, 0xEF, 0xC2, 0x54, 0x94, 0x04, 0x92, 0x04, 0x53, 0xD0, 0x71, 0x3A, 0x60, 0x55, 0xD0, 0x9A, 0x48, 0xAB, 0xC8, 0x7F, 0x39, 0x47, 0x5D,
0x65, 0x83, 0x27, 0x41, 0xD2, 0x5C, 0xCD, 0xE5, 0x7A, 0x62, 0xDB, 0xCC, 0x45, 0xA1, 0xD8, 0x9D, 0x5C, 0x85, 0x33, 0x9F, 0xCF, 0x77, 0x61, 0x2A, 0x72, 0x02, 0xB7, 0x65, 0x83, 0x25, 0xC1, 0xAD,
0x08, 0x60, 0x81, 0x3F, 0x81, 0x45, 0x91, 0xFF, 0x88, 0x22, 0x22, 0x0E, 0x58, 0xB4, 0xE5, 0x2D, 0xB9, 0x9A, 0xCB, 0xE5, 0xC4, 0xB6, 0x99, 0x8B, 0x4C, 0xB1, 0x3B, 0x21, 0xC0, 0x02, 0x7B, 0x02,
0xF7, 0x9E, 0xE8, 0x40, 0xC1, 0x59, 0x00, 0x3A, 0xB0, 0x28, 0xC7, 0xD6, 0x74, 0x80, 0xD5, 0x16, 0x8B, 0x22, 0xFD, 0x11, 0x45, 0x44, 0x1C, 0xB0, 0x68, 0xCB, 0x57, 0x6E, 0x3D, 0xD1, 0x80, 0x82,
0x33, 0x5D, 0x07, 0xF9, 0xF9, 0x20, 0xE3, 0x3F, 0xC5, 0x6A, 0x69, 0x0A, 0x25, 0xCF, 0x0E, 0xEB, 0xB1, 0x00, 0x74, 0x60, 0x51, 0x8E, 0xAD, 0xE9, 0x00, 0xA9, 0x2D, 0x66, 0xBA, 0x0E, 0xD2, 0xF3,
0xD7, 0x78, 0xB8, 0x1E, 0x92, 0x32, 0x86, 0x93, 0xAD, 0x3E, 0xA5, 0xAC, 0xE3, 0xA9, 0x07, 0x41, 0x41, 0xCA, 0x7F, 0x82, 0xD9, 0xD2, 0x14, 0x52, 0x9E, 0x1D, 0xDA, 0xAF, 0x71, 0x77, 0x3D, 0x24,
0x97, 0x21, 0x7C, 0x44, 0x13, 0x72, 0x80, 0x69, 0x38, 0xDB, 0x65, 0xF4, 0x88, 0x4B, 0x08, 0x06, 0x85, 0x0F, 0x27, 0x5B, 0x7D, 0x4A, 0x5A, 0xC7, 0x43, 0x0F, 0x82, 0x26, 0x43, 0xD8, 0x88, 0x06,
0xF9, 0xF2, 0xC3, 0x3F, 0x5F, 0xBC, 0x3B, 0x3B, 0x7D, 0xF3, 0x07, 0xD9, 0x81, 0xDA, 0x16, 0x46, 0xC4, 0x00, 0xD3, 0x60, 0xB6, 0x4B, 0xE9, 0x11, 0x97, 0x00, 0x14, 0xF2, 0xE5, 0x87, 0x7F, 0xBE,
0x4D, 0x8C, 0xF2, 0x4D, 0x71, 0x2E, 0x77, 0xD2, 0x84, 0xCC, 0x60, 0x67, 0x7A, 0x20, 0xAA, 0xCB, 0x38, 0x3D, 0x3B, 0x79, 0xFB, 0x86, 0xEC, 0x40, 0x6D, 0x0B, 0xA3, 0x06, 0x7A, 0xF9, 0x86, 0x38,
0xD1, 0xC9, 0xDC, 0xE1, 0x4B, 0xBC, 0x3E, 0xFB, 0x0D, 0x41, 0xCD, 0x1D, 0xF8, 0xC9, 0xBB, 0x76, 0x97, 0x3B, 0x6A, 0x40, 0x64, 0xB0, 0x33, 0x3C, 0x10, 0xD9, 0xE5, 0xE8, 0x68, 0xEE, 0xF0, 0x25,
0xCF, 0xD5, 0x64, 0xA2, 0x44, 0x04, 0x6A, 0xA7, 0xAF, 0x5E, 0x9C, 0xFD, 0xF7, 0xD9, 0xF9, 0x8B, 0x5E, 0x9F, 0xFD, 0x86, 0xA0, 0xE6, 0x0E, 0x7C, 0x64, 0x5D, 0xBB, 0xE7, 0x6A, 0x32, 0x50, 0x22,
0xD7, 0x64, 0x7B, 0x68, 0x7E, 0x18, 0x04, 0xCE, 0x13, 0x5A, 0xE7, 0xDA, 0x4B, 0x28, 0x95, 0xB3, 0x02, 0xB5, 0x93, 0x57, 0x2F, 0xCE, 0xFE, 0x75, 0x76, 0xFE, 0xE2, 0x35, 0xD9, 0x1E, 0x9A, 0x1D,
0xEB, 0x8C, 0xD1, 0xC5, 0x1E, 0xD8, 0x3C, 0x99, 0x04, 0x40, 0xBC, 0xDA, 0xD6, 0x78, 0xB5, 0x4D, 0x06, 0x81, 0xF1, 0x84, 0xD6, 0xB9, 0xF6, 0x12, 0x52, 0xE5, 0xF4, 0x3A, 0x65, 0x74, 0xB1, 0x07,
0xB0, 0xBE, 0x16, 0x6B, 0xF1, 0x4A, 0x5B, 0x94, 0x7C, 0x44, 0x8B, 0xFD, 0x05, 0x74, 0x2E, 0xAE, 0x36, 0x0F, 0x26, 0x01, 0x10, 0xCF, 0xB6, 0x35, 0x9E, 0x6D, 0x13, 0xCC, 0xAF, 0xC5, 0x5A, 0x3C,
0xB1, 0x31, 0xFB, 0xF8, 0x99, 0x68, 0x8B, 0x55, 0xC4, 0xC2, 0x25, 0x32, 0x3B, 0xBF, 0x23, 0x20, 0xD3, 0x16, 0x29, 0x1F, 0xD1, 0x22, 0x6F, 0x01, 0x9D, 0x8B, 0x6B, 0x6C, 0x4C, 0x3F, 0x7E, 0x26,
0x4F, 0x01, 0xA9, 0x74, 0xCE, 0x9A, 0xB2, 0x97, 0x4B, 0xE4, 0x0A, 0xA2, 0x6A, 0x17, 0x6B, 0x54, 0xDA, 0x62, 0x15, 0xB2, 0x60, 0x89, 0xC4, 0xCE, 0xDE, 0x08, 0xF0, 0x53, 0x40, 0x2A, 0x8C, 0xB3,
0x0A, 0x79, 0xA2, 0x25, 0xF1, 0x24, 0x0A, 0x27, 0x5F, 0x87, 0xE4, 0x8C, 0xC6, 0x01, 0x2E, 0x55, 0xA6, 0xD4, 0x72, 0x89, 0x5C, 0x41, 0x64, 0xED, 0x62, 0x8D, 0x52, 0x22, 0x4F, 0xB4, 0x38, 0x9A,
0xD7, 0x07, 0xE0, 0x70, 0xFD, 0x68, 0x05, 0xF3, 0xDE, 0xF3, 0xB1, 0x64, 0x74, 0x14, 0x8F, 0xB3, 0x84, 0xC1, 0xE4, 0xCB, 0x90, 0x9C, 0xD1, 0xC8, 0xC7, 0xA5, 0xAA, 0xFA, 0x00, 0x0C, 0xAE, 0x17,
0xE5, 0x40, 0xFC, 0x9E, 0x2C, 0xD3, 0x64, 0x96, 0xD2, 0x2C, 0xCB, 0x25, 0x7F, 0x19, 0x66, 0xE1, 0xAE, 0x60, 0xDE, 0x7B, 0x3E, 0x96, 0x8C, 0x9E, 0x46, 0xE3, 0x74, 0x39, 0x10, 0x9F, 0x47, 0xCB,
0x38, 0x8C, 0x42, 0x76, 0xDD, 0x07, 0xC6, 0x05, 0x34, 0xCE, 0x51, 0x5F, 0xA6, 0x33, 0xB1, 0x24, 0x24, 0x9E, 0x25, 0x34, 0x4D, 0x33, 0xCE, 0x7F, 0x0D, 0xD2, 0x60, 0x1C, 0x84, 0x01, 0xBB, 0xEE,
0xBF, 0x81, 0x04, 0x91, 0x67, 0x69, 0x5C, 0x29, 0x25, 0x08, 0x48, 0xEE, 0x52, 0xF1, 0xDD, 0x21, 0x03, 0xE1, 0x7C, 0x1A, 0x65, 0xA8, 0x2F, 0x93, 0x99, 0x58, 0x92, 0xBF, 0x40, 0x80, 0xC8, 0xA3,
0xBF, 0x7D, 0xAC, 0x93, 0x72, 0x17, 0x99, 0x5E, 0x1E, 0x33, 0xB8, 0x4A, 0x3E, 0x84, 0x15, 0x15, 0x34, 0x2E, 0x94, 0x12, 0x04, 0x04, 0x77, 0x89, 0xF8, 0xDD, 0xC1, 0xBF, 0x7D, 0xA4, 0x93, 0x7C,
0xBA, 0x7F, 0x4D, 0x16, 0x0B, 0xC8, 0x62, 0xEB, 0xB5, 0x28, 0xCC, 0x58, 0xCD, 0xA8, 0xF9, 0x51, 0x17, 0x91, 0x5E, 0xE6, 0x33, 0xB8, 0x48, 0x3E, 0x84, 0x14, 0xA5, 0x7D, 0xFF, 0x1A, 0x2F, 0x16,
0x54, 0x53, 0xD8, 0xF0, 0x8E, 0x4E, 0x01, 0xDB, 0xB9, 0xA2, 0xF4, 0xEA, 0xAA, 0x88, 0x67, 0x01, 0x10, 0xC5, 0x56, 0x2B, 0x61, 0x90, 0xB2, 0x8A, 0x51, 0xF1, 0xC2, 0xB0, 0xA2, 0x90, 0xE1, 0x94,
0xED, 0xD7, 0x94, 0x42, 0x00, 0x0A, 0xC2, 0xB4, 0xAE, 0x93, 0x8D, 0x88, 0x59, 0x89, 0x71, 0x9E, 0x4E, 0x01, 0xDB, 0xB9, 0x22, 0xF4, 0xEA, 0xAA, 0x88, 0x67, 0x0E, 0xED, 0xD7, 0x84, 0x82, 0x03,
0x55, 0x86, 0x38, 0xBC, 0xAF, 0x44, 0x38, 0x0F, 0xFF, 0xC1, 0xF8, 0x14, 0xF4, 0x40, 0x83, 0xB6, 0xF2, 0x83, 0xA4, 0xAA, 0x93, 0x0D, 0x8F, 0x59, 0xF2, 0x71, 0x4D, 0xAB, 0x70, 0x71, 0xF8, 0x5E,
0x16, 0xD1, 0xAE, 0x91, 0x77, 0x24, 0x9F, 0xED, 0x2A, 0xB3, 0x1D, 0xB8, 0x4F, 0x61, 0x90, 0x03, 0xF2, 0x70, 0x4D, 0xFC, 0x07, 0xE3, 0x13, 0x90, 0x03, 0x0D, 0xDA, 0x5A, 0x44, 0xBB, 0x46, 0xDA,
0x97, 0x6B, 0x7E, 0x01, 0x29, 0x46, 0x43, 0x22, 0x77, 0x04, 0x48, 0xB3, 0x84, 0x83, 0x43, 0xAF, 0x91, 0x6C, 0xB6, 0xAB, 0xCC, 0x76, 0xE0, 0x3D, 0x81, 0x41, 0x0E, 0x3C, 0xAE, 0xF9, 0x03, 0xB8,
0x39, 0xB8, 0x3C, 0xD2, 0xB6, 0x94, 0x40, 0xDB, 0xBA, 0x13, 0x0E, 0xDA, 0x38, 0xC2, 0xB1, 0x05, 0x18, 0x0E, 0x89, 0xAC, 0x08, 0x90, 0x46, 0x01, 0x07, 0x87, 0x5E, 0x73, 0x70, 0x99, 0xA7, 0x6D,
0x42, 0x0E, 0x5C, 0x8A, 0x7D, 0x10, 0x68, 0xED, 0xCA, 0xC7, 0xB5, 0x84, 0xD8, 0x05, 0x61, 0x4B, 0x29, 0x8E, 0xB6, 0x75, 0x27, 0x1C, 0xD4, 0x71, 0x84, 0x63, 0x0B, 0x84, 0x1C, 0x78, 0xE4, 0x75,
0x20, 0x7C, 0x4B, 0x85, 0x8C, 0x8E, 0x81, 0x81, 0x00, 0x43, 0xFA, 0x22, 0x69, 0x22, 0x1B, 0x3C, 0x10, 0x68, 0xED, 0xCA, 0xAF, 0x6B, 0x09, 0xB1, 0x0B, 0xCC, 0x96, 0x40, 0x78, 0x49, 0x85, 0x8C,
0x95, 0xEE, 0x05, 0xB9, 0xCA, 0x75, 0x07, 0xFC, 0x57, 0xC1, 0xC9, 0x30, 0x9E, 0x26, 0xB9, 0x36, 0x6A, 0x40, 0x40, 0x80, 0x21, 0x6D, 0x91, 0x54, 0x91, 0x0D, 0x9A, 0x4A, 0xF3, 0x82, 0x54, 0xE5,
0xAA, 0xB3, 0x2B, 0x0E, 0x41, 0x94, 0x05, 0x72, 0x86, 0x78, 0xA8, 0x9C, 0xAF, 0x93, 0x5C, 0x71, 0xB2, 0x03, 0xF6, 0x2B, 0xA7, 0x64, 0x10, 0x4D, 0xE3, 0x4C, 0x1A, 0xD5, 0xD9, 0x25, 0x83, 0x20,
0xCB, 0x4D, 0x20, 0xD4, 0x2A, 0x51, 0x6C, 0x70, 0xAD, 0x9A, 0xAB, 0xF2, 0x3D, 0x07, 0xB5, 0x01, 0xD2, 0x02, 0x39, 0x43, 0x7C, 0x29, 0x9D, 0xAF, 0x93, 0x4C, 0x70, 0x8B, 0x22, 0x10, 0x4A, 0x95,
0xD8, 0x73, 0x6C, 0x1F, 0xFD, 0x01, 0x8A, 0x5D, 0x3C, 0x9C, 0x01, 0xD9, 0xF9, 0x83, 0x70, 0x15, 0x48, 0x36, 0xB8, 0x54, 0xCD, 0x55, 0xFE, 0x9E, 0x83, 0xD8, 0x00, 0xEC, 0x39, 0xB6, 0x8F, 0xDE,
0x67, 0x5F, 0x58, 0xB8, 0x00, 0x3A, 0xCF, 0xC3, 0x72, 0x58, 0x45, 0x57, 0x36, 0xDA, 0x0A, 0x57, 0x80, 0x60, 0xE7, 0x5F, 0xCE, 0x60, 0xDB, 0xD9, 0x17, 0x61, 0x2A, 0xCE, 0x2E, 0x58, 0xB0, 0x80,
0x3A, 0x2F, 0x68, 0x90, 0x68, 0xA0, 0xAE, 0x17, 0x2E, 0xE1, 0x0B, 0xAA, 0x25, 0x1F, 0x27, 0x6A, 0x7D, 0x9E, 0x07, 0xC5, 0xB0, 0x92, 0xAC, 0x6C, 0xB4, 0xE5, 0xA6, 0x74, 0x9E, 0xEF, 0x41, 0xA2,
0xA1, 0xC3, 0xAE, 0x4F, 0x56, 0xA4, 0xC2, 0xF4, 0x32, 0xE6, 0xB3, 0x55, 0x46, 0x0A, 0x5E, 0x6F, 0x81, 0xB2, 0x9E, 0x9B, 0x84, 0x0B, 0x14, 0x4B, 0x3E, 0x4E, 0xE4, 0x42, 0x87, 0x4D, 0x9F, 0xCC,
0xFD, 0xDE, 0xE1, 0xFC, 0x3E, 0xBC, 0x7F, 0xFB, 0xFC, 0xD9, 0xF9, 0x8B, 0xC3, 0xAE, 0x4F, 0xE6, 0x48, 0x85, 0xEA, 0xA5, 0xCC, 0x63, 0xAB, 0x94, 0xE4, 0xB4, 0xDE, 0xFA, 0xBC, 0xC3, 0xF8, 0x7D,
0x8D, 0xDA, 0xFB, 0x65, 0x00, 0xCA, 0x7F, 0x87, 0xE7, 0xAB, 0x98, 0xEF, 0x5E, 0x47, 0xB8, 0xDE, 0x78, 0xFF, 0xEE, 0xF9, 0xB3, 0xF3, 0x17, 0x87, 0x4D, 0x9F, 0x8C, 0x1B, 0xB5, 0xF7, 0x4B, 0x1F,
0xEB, 0x06, 0x95, 0x9C, 0xF4, 0xC1, 0xAE, 0x0F, 0x1E, 0x14, 0xCB, 0x17, 0xDE, 0x6D, 0xDB, 0xE7, 0x84, 0xFF, 0x0E, 0xCB, 0x57, 0x52, 0xDF, 0xBD, 0x86, 0x70, 0xBD, 0xD7, 0x0C, 0x2A, 0x31, 0xE9,
0x21, 0x11, 0xEA, 0x32, 0x0F, 0x71, 0x78, 0xD3, 0x75, 0xE1, 0xF2, 0xF0, 0x76, 0xB7, 0xD3, 0x2B, 0x83, 0x4D, 0x1F, 0x7C, 0x51, 0x34, 0x5F, 0x58, 0xB7, 0x6D, 0x9B, 0x87, 0x9B, 0x50, 0x97, 0x79,
0x20, 0x17, 0xF1, 0x6F, 0x91, 0xCD, 0xC8, 0x7E, 0xF0, 0xA3, 0x77, 0x14, 0xE4, 0x98, 0x32, 0xE0, 0x88, 0xC1, 0x9B, 0xAE, 0x73, 0x93, 0x87, 0xAF, 0xBB, 0x8D, 0x5E, 0x0E, 0x39, 0xF7, 0x7F, 0x8B,
0xB6, 0xA1, 0x81, 0xDB, 0xF7, 0x33, 0x28, 0x7B, 0xFD, 0x90, 0x35, 0xE0, 0xBF, 0x3C, 0x38, 0x16, 0x74, 0x46, 0xF6, 0x83, 0x1F, 0x9D, 0x52, 0xE0, 0x63, 0xC2, 0x80, 0xDA, 0x86, 0x06, 0x66, 0xDF,
0xA0, 0x26, 0xC9, 0x0A, 0x83, 0x9B, 0x12, 0x36, 0xF7, 0x84, 0xCC, 0x52, 0x4C, 0x38, 0x2D, 0x4A, 0x4B, 0x21, 0xED, 0xF5, 0x02, 0x56, 0x87, 0xFF, 0x32, 0xE7, 0x98, 0x83, 0x9A, 0xC4, 0x2B, 0x74,
0x66, 0xC0, 0x4E, 0x28, 0xBF, 0x0B, 0x63, 0xE3, 0xF5, 0x7B, 0x55, 0xF0, 0x95, 0x92, 0x7E, 0x57, 0x6E, 0x8A, 0xDB, 0xDC, 0xE3, 0x32, 0x0B, 0x36, 0xE1, 0xB4, 0x30, 0x9E, 0x01, 0x39, 0x21, 0xFD,
0x97, 0xD8, 0xC9, 0x81, 0x9E, 0xB9, 0x3B, 0x3A, 0x05, 0xD4, 0x59, 0x38, 0x0D, 0x27, 0x7C, 0x5F, 0xCE, 0x95, 0x8D, 0xE7, 0xEF, 0x65, 0xC6, 0x97, 0x52, 0xFA, 0x5D, 0x5D, 0xA2, 0x92, 0x03, 0x3D,
0x16, 0x22, 0xAF, 0xBB, 0x43, 0xE7, 0xCA, 0x1D, 0x16, 0x99, 0x0E, 0x8C, 0x2A, 0x09, 0x8A, 0xE8, 0x73, 0x77, 0x74, 0x02, 0xA8, 0xB3, 0x60, 0x1A, 0x4C, 0x78, 0x5D, 0x16, 0x3C, 0xAF, 0xBB, 0x43,
0x46, 0x9F, 0x41, 0xB4, 0x22, 0xBD, 0x1F, 0xBD, 0xCF, 0xC0, 0x6C, 0x25, 0x79, 0x1B, 0x01, 0x50, 0xE6, 0x8A, 0x0A, 0x8B, 0x0C, 0x07, 0x46, 0xA5, 0x00, 0x45, 0x74, 0xA3, 0xCD, 0x20, 0x5A, 0x1E,
0x3D, 0x86, 0xCF, 0x55, 0x40, 0x4C, 0xE7, 0x44, 0xA2, 0xFC, 0x2B, 0xC9, 0x0C, 0xEE, 0x54, 0x95, 0xDE, 0x8F, 0xDE, 0xA7, 0xA0, 0xB6, 0x72, 0x7B, 0x1B, 0x0E, 0x50, 0x3D, 0x86, 0xCF, 0x44, 0x40,
0xAC, 0x9A, 0xA7, 0xF7, 0x47, 0xE2, 0x2D, 0xF4, 0xAD, 0xC1, 0x83, 0x3C, 0x00, 0x91, 0xA5, 0x9C, 0x4C, 0xE7, 0x9B, 0x44, 0xFE, 0x97, 0x82, 0x19, 0xAC, 0x54, 0x15, 0xA4, 0x9A, 0x27, 0xF7, 0x47,
0x22, 0x91, 0x59, 0x1E, 0x46, 0x66, 0xBC, 0x2B, 0x41, 0x51, 0xF7, 0x9C, 0x36, 0xD2, 0x88, 0x5C, 0xE2, 0x1D, 0xF4, 0xAD, 0xC1, 0x82, 0x3C, 0x00, 0x91, 0xA5, 0x9C, 0x22, 0x91, 0x59, 0x1E, 0x46,
0xD3, 0xF7, 0xD9, 0x43, 0x19, 0xF1, 0x5E, 0xBD, 0xC3, 0xE8, 0x24, 0xF5, 0xFD, 0x6C, 0x35, 0x5E, 0x66, 0xBC, 0x2B, 0x40, 0x51, 0x6B, 0x4E, 0x1B, 0x61, 0x44, 0x26, 0xE9, 0xFB, 0xF4, 0xA1, 0xF0,
0x84, 0x6C, 0xA7, 0x87, 0xC8, 0x26, 0xE0, 0x30, 0xD9, 0xE8, 0xD2, 0x4F, 0xB5, 0x75, 0xF6, 0x25, 0x78, 0xAF, 0x4E, 0xD1, 0x3B, 0x49, 0x79, 0x3F, 0x5B, 0x8D, 0x17, 0x01, 0xDB, 0x69, 0x21, 0xD2,
0x4B, 0x56, 0xE9, 0x84, 0x1A, 0x93, 0x55, 0x8A, 0xBB, 0xE4, 0xE8, 0x97, 0x21, 0xB5, 0x23, 0x06, 0x09, 0x18, 0x4C, 0x36, 0xFA, 0xEA, 0x25, 0xDA, 0x3A, 0xBD, 0x48, 0xE3, 0x55, 0x32, 0xA1, 0xC6,
0x20, 0x3D, 0x47, 0x41, 0x0B, 0x31, 0x0F, 0x9F, 0xD8, 0xC6, 0x9A, 0x8E, 0x57, 0xDC, 0x88, 0xF0, 0xD5, 0x22, 0xC4, 0xA4, 0x4F, 0x84, 0x11, 0xC6, 0x64, 0x95, 0x60, 0xCD, 0x1C, 0xAD, 0x34, 0x04,
0x61, 0x5A, 0x64, 0x44, 0xB2, 0x2B, 0x4B, 0x26, 0x5F, 0x29, 0xFB, 0xB2, 0x4C, 0x52, 0x36, 0xB4, 0x7A, 0xC4, 0x80, 0x2D, 0xCC, 0x91, 0xED, 0x82, 0xE9, 0xC3, 0x27, 0xB6, 0xB1, 0xA6, 0xE3, 0x15,
0x0C, 0x3F, 0xBB, 0x8E, 0x27, 0x5F, 0xA0, 0x19, 0xAA, 0xC6, 0xC5, 0x2A, 0x56, 0xA0, 0xA0, 0x2E, 0x57, 0x29, 0xFC, 0x32, 0xCD, 0xE3, 0x23, 0xD9, 0x95, 0xC6, 0x93, 0x2F, 0x94, 0x5D, 0x2C, 0xE3,
0x7E, 0x41, 0x3E, 0x11, 0x03, 0x74, 0xF3, 0x4B, 0x32, 0x9D, 0x56, 0x01, 0x70, 0x8B, 0xA0, 0x01, 0x84, 0x0D, 0x2D, 0xA5, 0xE1, 0xE4, 0xDD, 0x90, 0x00, 0xB4, 0xF4, 0x3A, 0x9A, 0x5C, 0x40, 0x2B,
0x34, 0x0E, 0xA6, 0xAB, 0x98, 0x1F, 0x04, 0x80, 0x19, 0x5E, 0x8E, 0x7D, 0x08, 0xBD, 0x37, 0x88, 0xE4, 0x94, 0x8B, 0x55, 0xA4, 0x40, 0x45, 0x49, 0xBD, 0x40, 0x2A, 0x12, 0x03, 0x24, 0xF7, 0x22,
0x32, 0xD0, 0xA6, 0x38, 0x1B, 0x62, 0xB0, 0xA1, 0x82, 0x7A, 0x23, 0x5B, 0x82, 0x85, 0xD5, 0x81, 0x9E, 0x4E, 0xCB, 0x00, 0xB9, 0xBE, 0x50, 0x1F, 0x1B, 0x69, 0xBA, 0xBC, 0xA0, 0x49, 0x12, 0x27,
0x00, 0xDD, 0x88, 0x39, 0x1D, 0xE1, 0x10, 0x00, 0x25, 0x69, 0x9D, 0x1E, 0xE3, 0xBC, 0x40, 0xB2, 0x17, 0x0B, 0xD0, 0x3E, 0x98, 0x87, 0x93, 0x8A, 0xC6, 0x49, 0xEC, 0x53, 0x58, 0x1A, 0x69, 0x28,
0xB1, 0x26, 0x82, 0x77, 0x4D, 0x2B, 0xD8, 0xF7, 0x89, 0xA8, 0x1C, 0xA8, 0x35, 0x6B, 0x03, 0x6D, 0xF6, 0x34, 0xB4, 0x06, 0xD3, 0x55, 0xC4, 0x4F, 0x16, 0x40, 0xAF, 0xBF, 0x8E, 0x3D, 0xF0, 0xE5,
0x7F, 0x0A, 0xF1, 0x89, 0x8C, 0x9A, 0xDC, 0x00, 0xC9, 0x20, 0x3C, 0x61, 0x8D, 0x88, 0xC6, 0x33, 0x37, 0x48, 0x03, 0x98, 0xA8, 0x58, 0x2F, 0x62, 0xB0, 0xA1, 0xB2, 0xFB, 0x7A, 0xBA, 0x04, 0x95,
0x36, 0x37, 0xED, 0x81, 0xBE, 0x67, 0x95, 0x3D, 0x8B, 0x90, 0xE3, 0x7A, 0x7C, 0x3C, 0x64, 0x1F, 0xAD, 0x02, 0x0D, 0x74, 0x23, 0xE2, 0xA4, 0x08, 0x86, 0xF6, 0x00, 0xA4, 0xA0, 0x4A, 0x6B, 0x38,
0xC3, 0xCF, 0xC7, 0x88, 0xF1, 0x31, 0xB9, 0x6B, 0x51, 0x72, 0x2C, 0x06, 0x17, 0xAE, 0x46, 0x62, 0xCF, 0x97, 0x7C, 0xA9, 0x88, 0x68, 0xA0, 0xA2, 0xE5, 0xFC, 0xF8, 0x44, 0x54, 0x22, 0x56, 0x1A,
0x61, 0x84, 0xC7, 0xC7, 0x83, 0x94, 0xB2, 0x55, 0x1A, 0x6B, 0x1C, 0x05, 0xD5, 0x2F, 0x90, 0xDB, 0x95, 0x81, 0xB6, 0x3F, 0x26, 0xF9, 0x44, 0x46, 0x0D, 0xAE, 0xD1, 0x64, 0x10, 0x1C, 0xB1, 0x7A,
0x82, 0x91, 0xA0, 0xE6, 0xD9, 0xFC, 0x4B, 0x08, 0xFA, 0x0B, 0xCC, 0x14, 0xE3, 0x49, 0x9E, 0x46, 0x48, 0xA3, 0x19, 0x9B, 0x9B, 0xF6, 0x40, 0xDF, 0xB3, 0xCA, 0x9E, 0x45, 0x48, 0xAD, 0x1A, 0xD5,
0xD4, 0x5A, 0x4E, 0x0D, 0xC2, 0x7F, 0xCD, 0x86, 0x0B, 0x24, 0x0C, 0xB5, 0x76, 0x0D, 0x13, 0x06, 0x86, 0xEC, 0x63, 0xF0, 0xB9, 0x86, 0x18, 0xD7, 0xC8, 0x5D, 0x8B, 0x92, 0x9A, 0x18, 0x9C, 0xDB,
0xBC, 0x88, 0xA8, 0x56, 0x73, 0x5A, 0xB5, 0x3C, 0xAB, 0xA8, 0x75, 0x6A, 0x52, 0xC5, 0x6B, 0x98, 0x2E, 0x89, 0x85, 0x11, 0xD4, 0x6A, 0x83, 0x84, 0xB2, 0x55, 0x12, 0x69, 0x1C, 0x05, 0xD5, 0xD0,
0x08, 0xF4, 0x53, 0x1A, 0x0C, 0x6A, 0x5A, 0x13, 0x10, 0xD9, 0x06, 0xB7, 0x1B, 0x80, 0x53, 0x05, 0x90, 0xDB, 0x9C, 0x90, 0xA0, 0x37, 0xE9, 0xFC, 0x22, 0x00, 0x85, 0x00, 0x62, 0x8A, 0xF1, 0x24,
0xC0, 0x13, 0x89, 0x2D, 0x10, 0xAE, 0x25, 0x40, 0x74, 0xF7, 0x60, 0xD4, 0xEE, 0x94, 0x00, 0xC1, 0x8B, 0x4B, 0x2A, 0x2D, 0xA7, 0x02, 0xF1, 0x44, 0xC5, 0x86, 0x07, 0x44, 0x20, 0x95, 0x76, 0x05,
0x1B, 0xDF, 0x8D, 0x93, 0x53, 0x05, 0x68, 0x5B, 0x02, 0x22, 0x5E, 0x25, 0xC8, 0xAE, 0x0A, 0xD2, 0x23, 0x10, 0x7C, 0x08, 0x37, 0x59, 0x71, 0x5A, 0x95, 0x2C, 0x4C, 0xA9, 0x74, 0x2A, 0x52, 0x67,
0xBB, 0x37, 0x44, 0xA7, 0xB7, 0x13, 0x82, 0x7B, 0x1F, 0x2A, 0x3D, 0x01, 0xC2, 0x73, 0x05, 0x52, 0x2A, 0x18, 0x59, 0xF4, 0x13, 0xEA, 0x0F, 0x2A, 0x5A, 0x03, 0x10, 0xD9, 0x06, 0xB7, 0x1B, 0x80,
0x1D, 0x81, 0x53, 0xA7, 0x00, 0xA8, 0xC0, 0x6B, 0xDF, 0x0B, 0x60, 0xFB, 0x47, 0x03, 0xEC, 0xFE, 0x53, 0x06, 0xC0, 0x23, 0x93, 0x2D, 0x10, 0xAE, 0x25, 0x40, 0x74, 0xF7, 0x60, 0xD4, 0xEE, 0x14,
0x08, 0x80, 0x22, 0x39, 0x44, 0xB0, 0x65, 0xBE, 0x5C, 0x73, 0x3C, 0x45, 0x25, 0xE0, 0x3E, 0xCF, 0x00, 0xC1, 0xBC, 0xDF, 0x8D, 0x93, 0x53, 0x06, 0x68, 0x5B, 0x02, 0x22, 0x3E, 0x25, 0xC8, 0xAE,
0x97, 0x6B, 0x7C, 0x47, 0xC8, 0xC1, 0xED, 0x89, 0x6E, 0x6D, 0xF4, 0x23, 0x55, 0xF4, 0xCF, 0xEA, 0x0A, 0xB2, 0x79, 0x6F, 0x88, 0x4E, 0x6F, 0x27, 0x04, 0xF7, 0x3E, 0xBB, 0x6C, 0x0A, 0x10, 0x4D,
0xE7, 0x8F, 0x55, 0xCE, 0x1F, 0xAC, 0x99, 0x7F, 0x56, 0x2D, 0x7F, 0xAC, 0x4E, 0xFE, 0x58, 0x85, 0x57, 0x20, 0xD5, 0x11, 0x38, 0x75, 0x72, 0x80, 0x0A, 0xBC, 0xF6, 0xBD, 0x00, 0xB6, 0x7F, 0x34,
0xFC, 0x97, 0x68, 0x63, 0xE9, 0x1A, 0xF1, 0xEC, 0x66, 0xD3, 0x33, 0xDE, 0x57, 0x51, 0x1D, 0x0F, 0xC0, 0xEE, 0x8F, 0x00, 0x28, 0xA2, 0x4D, 0x04, 0x5B, 0x04, 0xE0, 0x15, 0xA7, 0xA9, 0x88, 0x04,
0xFE, 0xD5, 0x8A, 0x7D, 0xC8, 0xDA, 0xEB, 0x8E, 0xE1, 0x6A, 0xAF, 0x1C, 0xA3, 0xAB, 0xBD, 0xEA, 0xBC, 0x67, 0x01, 0x78, 0x85, 0x97, 0x98, 0x1C, 0xAC, 0x77, 0x74, 0x2B, 0xA3, 0x1F, 0x29, 0xA2,
0x18, 0xB6, 0xCB, 0x7F, 0x2D, 0xED, 0x95, 0x2D, 0x2F, 0x5D, 0xC3, 0xB6, 0xC5, 0xA5, 0x25, 0x1A, 0x7F, 0x54, 0x3E, 0x7F, 0xAC, 0x70, 0xFE, 0x60, 0xC9, 0xFC, 0xA3, 0x62, 0xF9, 0x63, 0x65, 0xF2,
0xDB, 0x70, 0xB1, 0xF8, 0xA5, 0x67, 0xD8, 0x1D, 0xFE, 0xDB, 0xE3, 0x4D, 0x0E, 0x0C, 0x77, 0xE4, 0xC7, 0x0A, 0xE4, 0xBF, 0x45, 0x1A, 0x0B, 0xD3, 0x88, 0x87, 0x41, 0x9B, 0x96, 0xF1, 0xBE, 0x82,
0xC5, 0x31, 0xEC, 0x2E, 0xBF, 0x74, 0x79, 0x5B, 0x1B, 0xA1, 0xB6, 0xB5, 0x6F, 0x48, 0x60, 0x9A, 0xEA, 0x34, 0xE1, 0x5F, 0x25, 0x2F, 0x6C, 0x56, 0x5E, 0x77, 0x0C, 0x57, 0x7B, 0xE5, 0x18, 0x5D,
0x7C, 0x05, 0x0A, 0xF9, 0xD6, 0x4A, 0x4D, 0x54, 0x66, 0x35, 0x4E, 0xE9, 0x4E, 0x42, 0x45, 0x02, 0xED, 0x55, 0xC7, 0xB0, 0x5D, 0xFE, 0x69, 0x69, 0xAF, 0x6C, 0xF9, 0xE8, 0x1A, 0xB6, 0x2D, 0x1E,
0xFE, 0x05, 0x6B, 0x59, 0xAA, 0xDF, 0x28, 0xF1, 0xE8, 0x78, 0x48, 0x31, 0x0C, 0x19, 0x6A, 0x04, 0x2D, 0xD1, 0xD8, 0x86, 0x87, 0xC5, 0x1F, 0x3D, 0xC3, 0xEE, 0xF0, 0xCF, 0x1E, 0x6F, 0x72, 0x60,
0x22, 0xBC, 0x44, 0x31, 0x08, 0x44, 0x20, 0xA2, 0x97, 0x30, 0x20, 0xAA, 0xE3, 0xA1, 0xFA, 0x19, 0xB8, 0x23, 0x1F, 0x8E, 0x61, 0x77, 0xF9, 0xA3, 0xCB, 0xDB, 0xDA, 0x08, 0xB5, 0xAD, 0x7D, 0xC3,
0x54, 0x5E, 0xF1, 0x2C, 0xAB, 0x53, 0x83, 0xE5, 0x4C, 0xAB, 0xD3, 0x21, 0x6D, 0xB0, 0xE4, 0x55, 0x0D, 0x26, 0xF1, 0x17, 0xD8, 0x21, 0xAF, 0xD5, 0x54, 0x44, 0xAA, 0x57, 0xE1, 0x3B, 0xDD, 0xB9,
0xB2, 0xA6, 0xE9, 0xAF, 0x90, 0xD0, 0xD6, 0x75, 0xFD, 0xA4, 0xCE, 0x86, 0x6C, 0xA3, 0xED, 0xA9, 0x51, 0x11, 0xD1, 0x5F, 0x60, 0x72, 0x4C, 0xF5, 0x1B, 0xC5, 0x1F, 0xD5, 0x86, 0x14, 0xDD, 0x90,
0x69, 0xF7, 0xD9, 0x09, 0x7D, 0x6A, 0xF7, 0xAD, 0x12, 0x2A, 0x1E, 0x60, 0xF9, 0x6C, 0x32, 0xE7, 0xA1, 0x7A, 0x20, 0xC2, 0x73, 0x1E, 0x83, 0x80, 0x07, 0x22, 0x7A, 0x01, 0x03, 0x02, 0x01, 0x3C,
0xB9, 0x05, 0x2F, 0x70, 0x10, 0x43, 0x8C, 0xF9, 0x0C, 0xD3, 0x05, 0x4C, 0x1F, 0x06, 0xE1, 0x14, 0xA5, 0x3F, 0x83, 0x54, 0x2E, 0x9A, 0xA5, 0x55, 0x6A, 0xB0, 0x8C, 0x68, 0x55, 0x3A, 0xA4, 0x75,
0xA0, 0x11, 0x75, 0xE3, 0xE2, 0x8C, 0x8F, 0xEC, 0x6B, 0xE4, 0x98, 0x36, 0xC4, 0x2C, 0x83, 0x1D, 0x16, 0xBF, 0x8A, 0xD7, 0x34, 0xF9, 0x15, 0x22, 0xE4, 0xAA, 0xAE, 0x1F, 0x55, 0xD9, 0x90, 0x6D,
0x57, 0x87, 0x7C, 0x57, 0x1F, 0xCE, 0x13, 0xE6, 0x47, 0x9A, 0x78, 0x0D, 0x80, 0x4F, 0x62, 0xD8, 0xB4, 0x1D, 0x9B, 0x76, 0x9F, 0x1D, 0xD1, 0x63, 0xBB, 0x6F, 0x15, 0x50, 0xF1, 0x44, 0xCC, 0x63,
0x70, 0x78, 0x0E, 0x64, 0xA6, 0x81, 0x3A, 0x65, 0x05, 0xCF, 0x87, 0x67, 0xBC, 0x99, 0x4C, 0x56, 0x93, 0x39, 0x0F, 0x4F, 0x78, 0xC6, 0x84, 0x18, 0xA2, 0xCF, 0x67, 0x18, 0x2C, 0x60, 0xC4, 0x31,
0x4B, 0xF1, 0x02, 0xB6, 0x46, 0xF8, 0xD0, 0x93, 0x05, 0x85, 0xE4, 0x4E, 0x5B, 0x84, 0x31, 0x28, 0x08, 0xA6, 0x00, 0x8D, 0xA8, 0x95, 0x90, 0x33, 0x3E, 0xB2, 0xAF, 0x91, 0x1A, 0xAD, 0x8B, 0x59,
0x4D, 0x8D, 0x97, 0x10, 0xC2, 0x2F, 0xCC, 0x41, 0xAB, 0x86, 0xB5, 0x1E, 0xDC, 0x89, 0xD4, 0xAD, 0x06, 0xAB, 0x95, 0x87, 0x7C, 0x57, 0xBF, 0x9C, 0xC7, 0xCC, 0x0B, 0x35, 0x71, 0xAF, 0x80, 0x4F,
0x86, 0x2B, 0x24, 0xC5, 0x7C, 0xC8, 0x0A, 0x40, 0x88, 0x7C, 0xB2, 0x2C, 0x91, 0x37, 0xFB, 0x7F, 0x62, 0xD8, 0x70, 0x78, 0x0E, 0x84, 0xBA, 0xBE, 0x3A, 0x65, 0x05, 0xDF, 0x0F, 0xCF, 0x78, 0x3B,
0x26, 0x46, 0x90, 0x4C, 0x56, 0x0B, 0x90, 0x63, 0x63, 0x46, 0xD9, 0x8B, 0x88, 0xE2, 0xED, 0x2F, 0x99, 0xAC, 0x96, 0xE2, 0x46, 0xB7, 0x46, 0xF8, 0xD0, 0xA3, 0x05, 0x85, 0x68, 0x51, 0x5B, 0x04,
0xD7, 0xA7, 0x20, 0x3F, 0x59, 0x28, 0xEA, 0x8D, 0x30, 0x8E, 0x69, 0xFA, 0xFB, 0xF9, 0xEB, 0x57, 0x11, 0x08, 0x4D, 0x85, 0xE7, 0x24, 0xC2, 0x2E, 0xCC, 0x41, 0xAA, 0x86, 0x95, 0x1E, 0xBC, 0x89,
0x43, 0x66, 0x70, 0x76, 0x82, 0xA8, 0x9F, 0xA8, 0xA9, 0x93, 0xE0, 0x74, 0x58, 0xC9, 0xA6, 0x20, 0x58, 0xB0, 0x82, 0x2B, 0xC4, 0xF9, 0x7C, 0x88, 0x0A, 0x80, 0x89, 0x7C, 0xB2, 0xCC, 0xB9, 0x37,
0x8B, 0x61, 0xA7, 0x78, 0xB4, 0xFE, 0x66, 0x8A, 0x39, 0x95, 0x51, 0xE9, 0x13, 0x49, 0x8F, 0xA3, 0xFB, 0x7F, 0x26, 0x86, 0x1F, 0x4F, 0x56, 0x0B, 0xE0, 0x63, 0x7D, 0x46, 0xD9, 0x8B, 0x90, 0xE2,
0x0F, 0x38, 0x75, 0x2C, 0xCD, 0x2D, 0x4D, 0x7D, 0x55, 0xEE, 0x40, 0xEA, 0x53, 0xC9, 0xDA, 0x60, 0xEB, 0x2F, 0xD7, 0x27, 0xC0, 0x3F, 0x99, 0x79, 0xEA, 0xF5, 0x20, 0x8A, 0x68, 0xF2, 0xFB, 0xF9,
0x08, 0xAD, 0x5B, 0x90, 0xC6, 0xD8, 0xF7, 0xC8, 0x82, 0x30, 0xC1, 0x82, 0x54, 0x48, 0xB1, 0xD8, 0xEB, 0x57, 0x43, 0x66, 0x70, 0x72, 0x02, 0xAB, 0x9F, 0xA8, 0xA1, 0x93, 0xA0, 0x74, 0x50, 0x8A,
0x32, 0x23, 0x02, 0xD5, 0x8C, 0x30, 0xCF, 0x06, 0xFF, 0x50, 0x1B, 0x41, 0xE5, 0x8A, 0x95, 0x54, 0xA6, 0x20, 0x8A, 0x61, 0x27, 0x78, 0x56, 0xFF, 0x76, 0x8A, 0x31, 0x95, 0x51, 0xEA, 0x13, 0x41,
0x5E, 0x28, 0x91, 0x5B, 0xDA, 0xE0, 0xBA, 0xD5, 0x00, 0xFC, 0x58, 0x3D, 0xD7, 0x3B, 0x55, 0x7D, 0x8F, 0xA3, 0x0F, 0xF8, 0xEE, 0x58, 0x92, 0x69, 0x9A, 0x7A, 0xF7, 0xEE, 0x40, 0xE8, 0x53, 0x8A,
0xB7, 0x34, 0xBB, 0x81, 0x25, 0xA0, 0xC1, 0xF8, 0x45, 0xBF, 0xD5, 0x91, 0x6B, 0x43, 0x95, 0x45, 0xDA, 0x60, 0x08, 0xAD, 0x5A, 0x10, 0xC6, 0xD8, 0xF7, 0x88, 0x82, 0x30, 0xC0, 0x82, 0x50, 0x48,
0x47, 0x47, 0x75, 0xD0, 0x4B, 0x4B, 0xE7, 0x39, 0x26, 0x32, 0x30, 0xC1, 0x74, 0x36, 0x1A, 0x5A, 0xD1, 0xD8, 0x22, 0x22, 0x02, 0xD1, 0x0C, 0x31, 0x70, 0x07, 0xFB, 0x50, 0x19, 0x41, 0x2A, 0x8C,
0x83, 0xE8, 0x24, 0x5F, 0x4D, 0x70, 0x6A, 0x10, 0x1D, 0x1F, 0xEB, 0xC4, 0xB4, 0x81, 0xEB, 0x02, 0xA9, 0x59, 0x96, 0x79, 0x91, 0x5B, 0x5A, 0xE7, 0xB2, 0x55, 0x07, 0xFC, 0x58, 0x35, 0x93, 0x3B,
0x7A, 0x5D, 0xF6, 0x7F, 0x8C, 0x3E, 0x37, 0x70, 0xAB, 0x45, 0x07, 0x58, 0x9C, 0x95, 0xE7, 0xEF, 0x55, 0x7C, 0xB7, 0x24, 0xBB, 0x8E, 0x39, 0xA5, 0xC1, 0xF8, 0x43, 0xBF, 0xD5, 0x91, 0x6A, 0x43,
0x46, 0x52, 0x65, 0x78, 0x31, 0x09, 0x4E, 0x48, 0xF5, 0x3C, 0x8A, 0x43, 0xDA, 0xE1, 0x84, 0xB4, 0x95, 0x44, 0x4F, 0x9F, 0x56, 0x41, 0x2E, 0x2D, 0x9D, 0xC7, 0x98, 0x48, 0xC0, 0x10, 0x83, 0xDD,
0xD1, 0x27, 0x56, 0xFA, 0x21, 0xDB, 0x70, 0xC0, 0x8F, 0x18, 0x8E, 0x8D, 0xDE, 0xC8, 0xC1, 0xFB, 0x18, 0xA2, 0xD7, 0xF8, 0x28, 0x5B, 0x4D, 0x50, 0x6A, 0x10, 0xD7, 0x6A, 0x3A, 0x31, 0x6D, 0xA0,
0xB6, 0xB8, 0x74, 0x78, 0x9B, 0x8D, 0x1E, 0xE4, 0x95, 0xED, 0xC8, 0x5F, 0x5B, 0xC3, 0x61, 0xF6, 0xBA, 0x80, 0x5E, 0x95, 0xFD, 0x1F, 0xE3, 0xCF, 0x75, 0xAC, 0xDD, 0xE8, 0x00, 0x8B, 0x93, 0xF2,
0x3D, 0x7C, 0x0A, 0xBE, 0x17, 0xA3, 0x5D, 0xD9, 0x22, 0x12, 0x5F, 0xE3, 0xB5, 0xA6, 0x5D, 0x39, 0xFC, 0x74, 0x24, 0x45, 0x86, 0x67, 0xA7, 0x60, 0x84, 0x54, 0xCB, 0xA3, 0x18, 0xA4, 0x1D, 0x46,
0x70, 0x01, 0xDF, 0x7B, 0xED, 0xF0, 0x28, 0xB8, 0x01, 0x41, 0x3C, 0x9A, 0x12, 0x79, 0xBB, 0xD6, 0x48, 0x1B, 0x69, 0xF0, 0x5F, 0x61, 0x89, 0x6C, 0xC3, 0x01, 0x4B, 0x62, 0x38, 0x36, 0xDA, 0x23,
0xCC, 0x49, 0x94, 0x5B, 0x46, 0x3C, 0x8B, 0x85, 0x86, 0xDA, 0xC9, 0xF9, 0x73, 0x99, 0x3D, 0x7F, 0x07, 0xDF, 0xDB, 0xE2, 0xD1, 0xE1, 0x6D, 0x36, 0xDA, 0x90, 0x57, 0xB6, 0x23, 0x3F, 0x6D, 0x0D,
0x92, 0xE9, 0xF3, 0xA7, 0xDC, 0x87, 0x93, 0xE2, 0xD5, 0x83, 0xE5, 0xD5, 0x40, 0xD9, 0x88, 0xAE, 0x87, 0xD9, 0xF7, 0xB0, 0x2A, 0x78, 0xD5, 0x46, 0xBB, 0xB2, 0x85, 0x2F, 0xBE, 0xC6, 0x67, 0x45,
0x81, 0x3D, 0x70, 0x07, 0xA6, 0x30, 0x14, 0xE5, 0x75, 0x5C, 0x2B, 0xF6, 0xA6, 0xC5, 0xD6, 0x74, 0xBB, 0x72, 0xE0, 0x01, 0xD6, 0xF7, 0xDA, 0xE1, 0x7E, 0x70, 0x03, 0x82, 0xF8, 0x6A, 0x4A, 0xF4,
0xA5, 0xE4, 0x52, 0x76, 0xA2, 0x6B, 0xB8, 0xF2, 0xC6, 0x64, 0x83, 0xF0, 0x77, 0x4A, 0x1A, 0xF8, 0xED, 0x4A, 0x23, 0xDB, 0xA4, 0xAC, 0x42, 0xF1, 0x38, 0x16, 0x1A, 0x2A, 0x47, 0xE7, 0xCF, 0x65,
0xB7, 0x3A, 0x8D, 0xD9, 0x37, 0x90, 0xDA, 0xC6, 0x80, 0xA3, 0x23, 0x65, 0xC4, 0x76, 0xF7, 0xF7, 0xFC, 0xFC, 0x49, 0x06, 0xD0, 0x9F, 0x32, 0x2B, 0x4E, 0xF2, 0xDB, 0x0C, 0xCB, 0xAB, 0x81, 0x52,
0xEF, 0xA8, 0x18, 0xB6, 0x2E, 0xA9, 0x14, 0xE5, 0x17, 0xEE, 0x74, 0x9F, 0x3F, 0x1F, 0x01, 0x8D, 0xDB, 0xAE, 0x80, 0x46, 0x70, 0x13, 0xA6, 0x90, 0x14, 0x39, 0x56, 0xAB, 0xE4, 0xE5, 0x6E, 0x51,
0x82, 0xDA, 0x0D, 0x0D, 0x90, 0x63, 0x79, 0xAF, 0xD2, 0x35, 0xF7, 0xB3, 0x37, 0xEB, 0xF8, 0x6D, 0xED, 0x2E, 0x65, 0x71, 0x4A, 0x71, 0xBB, 0x82, 0x2B, 0x6F, 0x4C, 0x36, 0x08, 0xBF, 0xA6, 0x52,
0x9A, 0x2C, 0x69, 0xCA, 0xAE, 0xEB, 0x84, 0x6F, 0x46, 0xE9, 0x4F, 0xEB, 0xA0, 0x6A, 0x96, 0x98, 0xC7, 0x3F, 0xFF, 0xA9, 0xCF, 0xBE, 0x01, 0xDF, 0x36, 0x06, 0x3C, 0x7D, 0xAA, 0x8C, 0xD8, 0xEE,
0xB2, 0x03, 0x1E, 0x0E, 0x52, 0xE0, 0xE9, 0xFD, 0x7C, 0xA0, 0x84, 0x2F, 0x1F, 0x73, 0x75, 0xB2, 0xFE, 0xFE, 0x1D, 0x45, 0xC3, 0xD6, 0xE5, 0x2E, 0x45, 0x46, 0x87, 0xC5, 0xF3, 0xF3, 0xE7, 0x23,
0x7E, 0xAE, 0xA9, 0xDC, 0xF9, 0x24, 0x77, 0x37, 0x3F, 0x11, 0xC5, 0x80, 0x9F, 0x43, 0xE4, 0x60, 0xD8, 0xA3, 0xD8, 0xED, 0x86, 0x0C, 0xC8, 0xB1, 0xBC, 0x57, 0xE9, 0x9A, 0x7B, 0xE9, 0xDB, 0x75,
0xB4, 0xCE, 0xFD, 0x53, 0x95, 0xD1, 0xA4, 0xA6, 0x63, 0x75, 0x82, 0x40, 0xD5, 0x12, 0xA3, 0x42, 0xF4, 0x2E, 0x89, 0x97, 0x34, 0x61, 0xD7, 0x55, 0xC2, 0xEB, 0x5B, 0xFA, 0x71, 0x15, 0x84, 0xCD,
0x3B, 0x2E, 0x2D, 0x2C, 0x11, 0x7F, 0x50, 0xC7, 0x4B, 0xA3, 0xC9, 0xC0, 0x5E, 0xB2, 0x4D, 0x7B, 0x12, 0x53, 0x76, 0xC0, 0xC3, 0x41, 0x0A, 0x3C, 0xBD, 0x9F, 0x0D, 0x94, 0xF0, 0xE5, 0xD7, 0x4C,
0xC9, 0xA4, 0xBD, 0x0C, 0x37, 0xED, 0x25, 0xDB, 0xB6, 0x97, 0x47, 0x59, 0x8A, 0x62, 0x27, 0x3D, 0xA0, 0xAC, 0x9F, 0x2B, 0x2A, 0x75, 0x3E, 0xC9, 0x82, 0xE9, 0x27, 0xA2, 0xA8, 0xF0, 0x73, 0xF0,
0x11, 0x92, 0x7B, 0x18, 0x5C, 0x21, 0x30, 0x43, 0x0C, 0x96, 0x3F, 0x2D, 0x0C, 0xB3, 0x1E, 0xDA, 0x1D, 0x8C, 0x56, 0xB9, 0x85, 0x2A, 0x13, 0x9A, 0x54, 0x74, 0xCC, 0x4F, 0x10, 0xA8, 0x9A, 0x64,
0x85, 0x87, 0x96, 0xD4, 0xE2, 0xE6, 0xE4, 0xF0, 0xA1, 0x78, 0xC1, 0xE0, 0x8C, 0xC6, 0xE5, 0xF2, 0x94, 0xF6, 0x8E, 0x4B, 0x0B, 0x5D, 0xC4, 0x0F, 0x94, 0xF2, 0x42, 0x6D, 0x52, 0xD0, 0x98, 0x74,
0xF9, 0x2D, 0xFE, 0xEB, 0x08, 0xDB, 0x82, 0xFE, 0xFB, 0xC5, 0xE6, 0x52, 0xF9, 0xB9, 0x40, 0xAA, 0x53, 0x63, 0x52, 0xA9, 0x31, 0xC3, 0x4D, 0x8D, 0x49, 0xB7, 0x35, 0xE6, 0x51, 0xBA, 0xA2, 0xE8,
0xB5, 0xA3, 0x56, 0xA8, 0x69, 0x91, 0xC9, 0x6C, 0xBF, 0x75, 0xA5, 0x7A, 0x59, 0x25, 0xBC, 0x2B, 0x49, 0x4F, 0x38, 0xE5, 0x1E, 0xBA, 0x57, 0x70, 0xCD, 0xE0, 0x85, 0xE5, 0x47, 0x0B, 0x1D, 0x6D,
0x82, 0xCA, 0x4A, 0x41, 0x0D, 0x72, 0x49, 0x6D, 0xF4, 0x95, 0xCA, 0x52, 0x68, 0x89, 0xA2, 0x2E, 0x13, 0xF5, 0xA2, 0x89, 0x9A, 0xD4, 0xE2, 0xEA, 0xE4, 0xF0, 0xA1, 0xF8, 0x40, 0xF7, 0x8C, 0xCA,
0xCA, 0xE0, 0xDD, 0xEA, 0x68, 0xA8, 0xDA, 0xF8, 0x70, 0xAD, 0xDA, 0x8F, 0xEF, 0xA3, 0x14, 0x6B, 0xE5, 0xF2, 0xF9, 0x2D, 0xFE, 0xE9, 0x08, 0xDD, 0x82, 0xFE, 0xFB, 0x79, 0xE7, 0x42, 0xF8, 0x39,
0x6F, 0x3C, 0xCC, 0xF7, 0x72, 0xD5, 0x80, 0x98, 0x3C, 0x25, 0xA4, 0x4F, 0x70, 0x73, 0xF7, 0x40, 0x43, 0xCA, 0xD9, 0xA3, 0x96, 0x8B, 0x69, 0x1E, 0xCB, 0x6C, 0x5F, 0xE4, 0x52, 0xED, 0xAC, 0xE2,
0x20, 0xC5, 0x73, 0x26, 0x75, 0x52, 0xFC, 0x94, 0xE0, 0xA9, 0x90, 0x56, 0xF1, 0x12, 0x5A, 0x98, 0xE0, 0x15, 0x46, 0xA5, 0x05, 0xA3, 0x06, 0x19, 0xA7, 0x36, 0xFA, 0x0A, 0x61, 0xC9, 0xA5, 0x44,
0x41, 0x80, 0xCF, 0x32, 0x75, 0x47, 0x4F, 0x1C, 0xCC, 0x68, 0x21, 0x83, 0x35, 0x72, 0x97, 0x55, 0x11, 0x17, 0x65, 0xF0, 0x6E, 0x71, 0x34, 0x54, 0x69, 0x7C, 0xB8, 0x54, 0xED, 0xC7, 0xF7, 0x51,
0x6B, 0xD6, 0x24, 0x4B, 0xB4, 0xDA, 0xC6, 0x86, 0x4E, 0x6D, 0xF4, 0x5B, 0xA2, 0xB1, 0x44, 0x13, 0x82, 0xB5, 0xD7, 0x23, 0x66, 0xE5, 0x61, 0xD5, 0x25, 0x86, 0xC7, 0x84, 0xF4, 0x09, 0xD6, 0x8B,
0x6F, 0xCF, 0x84, 0xE5, 0xF1, 0x9D, 0x3F, 0x3A, 0x80, 0x5D, 0xB9, 0x9D, 0x5C, 0x8D, 0xF4, 0x7B, 0x0F, 0xB8, 0x52, 0x3C, 0xBA, 0x52, 0x27, 0x45, 0xC7, 0x04, 0x0F, 0x9A, 0xB4, 0x92, 0x95, 0xD0,
0x27, 0xF0, 0xFD, 0xF7, 0x0A, 0x3D, 0x72, 0x8F, 0xA5, 0x4C, 0xC7, 0xA4, 0xB9, 0x63, 0x92, 0x88, 0x82, 0x14, 0x5C, 0x7C, 0x9A, 0xAA, 0x45, 0x42, 0x51, 0xD0, 0xD0, 0x02, 0x06, 0x6B, 0x64, 0x26,
0x07, 0x7D, 0xE9, 0xA2, 0x4E, 0x7E, 0x15, 0x37, 0x5A, 0x80, 0x5D, 0x38, 0x26, 0x99, 0xA2, 0x4E, 0xAB, 0xD2, 0xA8, 0x48, 0x92, 0x68, 0x95, 0x8D, 0x1A, 0x51, 0x65, 0xF4, 0x5B, 0xAC, 0xB1, 0x58,
0x8B, 0xAC, 0x08, 0xEC, 0xB1, 0x92, 0x3A, 0xF2, 0x41, 0xC0, 0x52, 0xBA, 0x05, 0x33, 0xCF, 0x3D, 0x13, 0x17, 0x72, 0x82, 0xE2, 0x44, 0xD0, 0x1B, 0x1D, 0xC0, 0xAE, 0xA8, 0x50, 0x97, 0x7D, 0xFD,
0x0F, 0x81, 0x85, 0x31, 0xA0, 0xC7, 0x49, 0x7A, 0x7D, 0x00, 0x36, 0x8C, 0xA9, 0x82, 0x57, 0x8E, 0xDE, 0x09, 0xBC, 0xA4, 0x5F, 0xDA, 0x8F, 0xAC, 0xB2, 0x14, 0x01, 0x99, 0x54, 0x77, 0x0C, 0x13,
0x69, 0xE4, 0x5E, 0xD1, 0x32, 0x85, 0x80, 0xCE, 0xEA, 0xE4, 0x79, 0x0E, 0x8E, 0xEF, 0xE9, 0x42, 0xF1, 0xEC, 0x30, 0x59, 0x54, 0xC9, 0xAF, 0xE2, 0x45, 0xF3, 0xB1, 0x0B, 0xC7, 0xC4, 0x53, 0x94,
0xF6, 0x03, 0x4A, 0x12, 0xAF, 0xA2, 0x08, 0xFC, 0xF6, 0x06, 0xE8, 0x49, 0x0E, 0x03, 0x95, 0x1E, 0x69, 0x11, 0x17, 0x81, 0x3E, 0x96, 0x82, 0x47, 0x3E, 0x08, 0x48, 0x4A, 0xB7, 0x60, 0x66, 0xD1,
0x1C, 0xCF, 0x02, 0xD2, 0xD5, 0x72, 0x05, 0x75, 0x28, 0xCF, 0x1B, 0x70, 0x99, 0x78, 0x18, 0xD3, 0xE7, 0x21, 0xB0, 0x30, 0x06, 0xE4, 0x38, 0x4E, 0xAE, 0x0F, 0xC0, 0x86, 0x31, 0x65, 0xF0, 0xCA,
0xB5, 0xF6, 0x5F, 0xAF, 0x5F, 0xFD, 0xCE, 0xD8, 0xF2, 0x1D, 0xBD, 0x58, 0x41, 0xFA, 0x6A, 0x84, 0xC9, 0x8F, 0xAC, 0x16, 0x2D, 0x13, 0x70, 0xE9, 0xAC, 0x4A, 0x9E, 0x67, 0xE0, 0x78, 0x99, 0x18,
0x43, 0xD2, 0xE4, 0xCA, 0xFC, 0x54, 0xBC, 0xCE, 0x3A, 0x04, 0x32, 0xF6, 0xEB, 0xE5, 0xA6, 0x7A, 0xE2, 0x1F, 0x10, 0x92, 0x68, 0x15, 0x86, 0x60, 0xB7, 0x37, 0x40, 0x4F, 0x32, 0x18, 0x28, 0xF4,
0x21, 0x4F, 0x62, 0xC0, 0x18, 0x34, 0xA9, 0xD1, 0x68, 0xE0, 0x06, 0x0F, 0x24, 0x9B, 0x08, 0x4E, 0x60, 0x78, 0x16, 0x10, 0xB0, 0x16, 0x2B, 0xA8, 0x43, 0x79, 0xE4, 0x80, 0xCB, 0x44, 0xC3, 0x88,
0x6C, 0x49, 0x1F, 0xD3, 0x78, 0x92, 0x04, 0xF4, 0xFD, 0xBB, 0xD3, 0x3A, 0xD3, 0x45, 0xA7, 0xD8, 0xAE, 0xB5, 0xFF, 0x7A, 0xFD, 0xEA, 0x77, 0xC6, 0x96, 0xA7, 0xF4, 0x72, 0x05, 0x01, 0xAC, 0x11,
0xB9, 0x53, 0x3A, 0xD4, 0xDC, 0xCE, 0x88, 0x1B, 0x49, 0x0C, 0x84, 0x05, 0xD7, 0x98, 0x10, 0xD2, 0x0C, 0x49, 0x83, 0x0B, 0xF3, 0xB1, 0xB8, 0x21, 0x3B, 0x84, 0x6D, 0xEC, 0x97, 0xCB, 0x4D, 0xF1,
0x09, 0x24, 0x67, 0x33, 0x3A, 0x2C, 0x32, 0x20, 0xFD, 0xC6, 0x1B, 0x0E, 0xE3, 0x06, 0x1F, 0x80, 0x42, 0x9A, 0x44, 0x80, 0x31, 0x48, 0x52, 0xBD, 0x5E, 0xC7, 0x12, 0x0F, 0x84, 0x9B, 0x08, 0x4E,
0xF9, 0x34, 0xF0, 0xA4, 0xEE, 0x58, 0x16, 0xB6, 0x89, 0x04, 0xF2, 0xE9, 0x8E, 0xDC, 0xFC, 0x3F, 0x54, 0xB9, 0x6B, 0x34, 0xC2, 0x9A, 0xD9, 0xFB, 0xD3, 0x93, 0x2A, 0xD3, 0x45, 0xA7, 0x28, 0xFF,
0xCF, 0xDE, 0xFC, 0x01, 0x71, 0x37, 0x85, 0x84, 0x1E, 0xA7, 0x66, 0xCB, 0x24, 0xCE, 0xE8, 0x39, 0x29, 0x1D, 0x6A, 0x74, 0x67, 0x44, 0xF5, 0x38, 0x82, 0x8D, 0xF9, 0xD7, 0x18, 0x12, 0xD2, 0x09,
0xBD, 0x62, 0xBA, 0xDE, 0xF7, 0x2C, 0x5B, 0x99, 0xFC, 0xEE, 0x55, 0x5D, 0xEF, 0xD7, 0x41, 0xDC, 0x84, 0x67, 0x33, 0x3A, 0xCC, 0x63, 0x20, 0xFD, 0xA6, 0x39, 0x1C, 0x46, 0x75, 0x3E, 0x00, 0x23,
0x59, 0x12, 0xD1, 0x46, 0x94, 0xCC, 0xEA, 0x79, 0x97, 0x6E, 0xBC, 0xFC, 0xF0, 0x22, 0x4D, 0x21, 0x6A, 0xA0, 0x49, 0xD5, 0xB1, 0x2C, 0x6C, 0x13, 0x21, 0xE4, 0xF1, 0x8E, 0xE8, 0xFC, 0x3F, 0xCF,
0x0C, 0xE8, 0xC0, 0x65, 0xC4, 0x72, 0x49, 0xE3, 0x3A, 0xF9, 0xED, 0xC5, 0x39, 0x90, 0x6C, 0x40, 0xDE, 0xBE, 0x01, 0xBF, 0x9B, 0x40, 0x48, 0x8F, 0x53, 0xD3, 0x65, 0x1C, 0xA5, 0xF4, 0x9C, 0x5E,
0x5E, 0x05, 0x4D, 0x19, 0xB0, 0xBC, 0xBE, 0x21, 0x02, 0xB1, 0xBB, 0x2F, 0x65, 0x7C, 0xD0, 0x2A, 0x31, 0x5D, 0xEF, 0x37, 0x2D, 0x5B, 0x99, 0x7C, 0xFA, 0xAA, 0xAA, 0xF7, 0xAB, 0xC0, 0xEE, 0x34,
0xF2, 0x03, 0x07, 0x5D, 0x78, 0x16, 0x2C, 0x20, 0x2C, 0x0C, 0xD6, 0x22, 0xC8, 0xE8, 0x37, 0x7B, 0x0E, 0x69, 0x3D, 0x8C, 0x67, 0xD5, 0xAC, 0x4B, 0x37, 0x5E, 0x7E, 0x78, 0x81, 0x25, 0x40, 0x20,
0x27, 0x57, 0x0F, 0x54, 0xF5, 0x46, 0xE5, 0xEC, 0x34, 0x17, 0xCB, 0x7E, 0xFB, 0x4A, 0x67, 0x30, 0xB2, 0x7E, 0x8B, 0x58, 0x2E, 0x69, 0x54, 0x25, 0xBF, 0xBD, 0x38, 0x87, 0x2D, 0x1B, 0x10, 0x59,
0x87, 0x7B, 0xEC, 0x46, 0xB9, 0xF3, 0x2F, 0x4F, 0x01, 0x22, 0x4A, 0x06, 0xA2, 0xAC, 0x41, 0xBD, 0x41, 0x53, 0x0A, 0x24, 0xAF, 0x6E, 0xB0, 0x40, 0x1C, 0x18, 0x48, 0x1E, 0x1F, 0xD4, 0x8A, 0xEC,
0x79, 0x99, 0xA4, 0x8B, 0xE7, 0x3E, 0xF3, 0x07, 0xAC, 0xE1, 0x2F, 0x97, 0x48, 0xAC, 0xB0, 0x4E, 0x0C, 0x43, 0x17, 0x96, 0x05, 0x53, 0x08, 0x0B, 0x9D, 0xB5, 0x70, 0x32, 0xFA, 0xCD, 0xDE, 0xC9,
0x35, 0xDB, 0x2E, 0x43, 0x65, 0x0C, 0xA1, 0x32, 0x3E, 0xC9, 0xF1, 0x1F, 0xC4, 0x10, 0x24, 0x65, 0xE5, 0x33, 0x5A, 0xBD, 0x5E, 0x3A, 0x8E, 0xCD, 0xD8, 0xB2, 0x5F, 0xBF, 0x92, 0x19, 0xCC, 0xE1,
0xE2, 0x4E, 0x3F, 0xC6, 0x9F, 0xC1, 0x0B, 0xAB, 0x15, 0x5D, 0x28, 0xBD, 0xE8, 0x19, 0x29, 0x81, 0x16, 0xBB, 0x5E, 0x1C, 0x26, 0xC8, 0x83, 0x85, 0x90, 0x92, 0x81, 0x48, 0x6C, 0x50, 0x6E, 0x5E,
0x27, 0x46, 0x28, 0xC2, 0xA7, 0x51, 0xAE, 0x57, 0x1E, 0xC3, 0x00, 0xD7, 0xB7, 0x01, 0xE8, 0xB7, 0xC6, 0xC9, 0xE2, 0xB9, 0xC7, 0xBC, 0x01, 0xAB, 0x7B, 0xCB, 0x25, 0x6E, 0x56, 0x68, 0xA7, 0x1A,
0xB8, 0x42, 0xB4, 0x43, 0xCB, 0x07, 0x91, 0x94, 0xD8, 0xDB, 0x37, 0x67, 0xE7, 0x58, 0x53, 0x70, 0x6F, 0x17, 0xAE, 0x32, 0x02, 0x57, 0x19, 0x1D, 0x65, 0xF8, 0x0F, 0x22, 0x70, 0x92, 0x32, 0x74,
0x38, 0x84, 0x4B, 0x2E, 0x6A, 0x08, 0x16, 0x36, 0x20, 0x5E, 0xBD, 0xB8, 0x04, 0x88, 0xAF, 0xC0, 0xA7, 0x1F, 0xA3, 0xCF, 0x60, 0x85, 0xD5, 0x9C, 0x2E, 0x90, 0x56, 0xF4, 0x8C, 0x14, 0xC0, 0x43,
0x3F, 0x51, 0x50, 0x70, 0xE4, 0x8E, 0x38, 0x33, 0x21, 0x46, 0x99, 0x84, 0xEB, 0x37, 0x20, 0x9A, 0x23, 0x10, 0xEE, 0xD3, 0x28, 0xD6, 0x2B, 0x4E, 0x76, 0x80, 0xEA, 0xDB, 0x00, 0xF4, 0xDB, 0x6A,
0x9C, 0x2E, 0x30, 0xB1, 0xE5, 0x8A, 0x6F, 0x5F, 0xE6, 0x05, 0x20, 0xEA, 0x8D, 0x1F, 0xD0, 0xA0, 0xA9, 0xE2, 0xBC, 0x43, 0xDC, 0x75, 0xC9, 0xB9, 0x77, 0x6F, 0xCF, 0xCE, 0x31, 0xBB, 0xE0, 0xF0,
0x29, 0x0B, 0xB6, 0xFF, 0x80, 0xDA, 0x69, 0xBF, 0x39, 0x09, 0xF6, 0x0B, 0x91, 0x1D, 0xF0, 0x82, 0x08, 0xE7, 0x60, 0x69, 0x6A, 0x5D, 0x3E, 0xC0, 0x87, 0xBD, 0xF8, 0x0A, 0xAB, 0xBC, 0x02, 0x9B,
0x77, 0xC9, 0x58, 0x43, 0x21, 0x1F, 0x63, 0xF1, 0xFA, 0x12, 0x5F, 0x34, 0xAE, 0x5B, 0x3A, 0x56, 0x45, 0x41, 0xE8, 0x91, 0x62, 0xE2, 0x68, 0x86, 0x18, 0x45, 0x68, 0xAE, 0xDF, 0x00, 0xBB, 0xB2,
0x5B, 0xB7, 0xB7, 0x06, 0x26, 0x76, 0x40, 0x7A, 0x8C, 0xE3, 0x54, 0x33, 0xE2, 0x46, 0x33, 0x8C, 0xBD, 0x82, 0xDA, 0x2D, 0x57, 0xBC, 0xA8, 0x99, 0xA5, 0x85, 0x28, 0x4B, 0x9E, 0x4F, 0xFD, 0x86,
0x72, 0xC5, 0xAF, 0x3F, 0x6E, 0xE5, 0x47, 0xE8, 0x95, 0x3C, 0x52, 0x3A, 0x1C, 0x21, 0x4A, 0x5B, 0x4C, 0xE3, 0xFE, 0x03, 0x32, 0xAA, 0xFD, 0x2A, 0x26, 0x58, 0x22, 0xD8, 0x78, 0xC0, 0x32, 0xDE,
0x90, 0xCB, 0xC1, 0xF8, 0x83, 0x76, 0x1D, 0x6D, 0xD8, 0xB5, 0xDE, 0xF7, 0x23, 0x08, 0xFA, 0x75, 0xC5, 0x77, 0x0D, 0x19, 0x5F, 0xC3, 0x94, 0xF6, 0x25, 0xDE, 0x67, 0xAE, 0x5A, 0x3A, 0xE6, 0x60,
0xF2, 0x2C, 0xD6, 0x28, 0x9A, 0xAD, 0x86, 0x75, 0x28, 0xA8, 0x4B, 0xF0, 0x84, 0x80, 0xF9, 0x46, 0xB7, 0xB7, 0x06, 0x0F, 0xF6, 0x8A, 0x0A, 0xB6, 0xBD, 0xB1, 0xF1, 0x38, 0xE2, 0xCD, 0x8A, 0xCE,
0xC2, 0x56, 0x99, 0x7E, 0x5B, 0x5A, 0xEB, 0xEF, 0x61, 0x40, 0x9F, 0x45, 0x11, 0xCA, 0xB7, 0xD8, 0x71, 0x0D, 0x1B, 0x96, 0x47, 0x49, 0x8D, 0xA9, 0x3E, 0x0E, 0xBD, 0x47, 0x08, 0xA4, 0x3C, 0xDE,
0xEF, 0xB7, 0xB6, 0xF7, 0xFB, 0x8F, 0x8E, 0x8A, 0xA3, 0x88, 0xC6, 0x24, 0x4A, 0x70, 0x93, 0xA0, 0x3A, 0xEC, 0x5A, 0x0A, 0x25, 0x92, 0xCB, 0xC1, 0xF8, 0x83, 0x06, 0xA1, 0xBC, 0xA9, 0xB2, 0x71,
0xA4, 0x85, 0xBF, 0x38, 0x3A, 0xAC, 0x3E, 0x1E, 0x93, 0x3A, 0xE0, 0x3E, 0x11, 0x5E, 0x92, 0x06, 0xD0, 0xFB, 0xA2, 0x59, 0xEA, 0xFD, 0xED, 0x06, 0x9D, 0xB8, 0xBA, 0x33, 0xFD, 0xB6, 0x50, 0x78,
0xFA, 0x03, 0x42, 0x37, 0xDD, 0x3F, 0x54, 0x79, 0x2B, 0x24, 0xE7, 0xB2, 0x7C, 0xAD, 0x76, 0x48, 0x08, 0x78, 0xDE, 0xAC, 0x16, 0x63, 0x10, 0x12, 0x6E, 0x71, 0x0B, 0x4D, 0x40, 0xB6, 0xCB, 0xD8,
0xF0, 0xBD, 0xDA, 0x03, 0xAB, 0x14, 0x67, 0xAA, 0xBB, 0x27, 0x96, 0x1C, 0x29, 0x3C, 0xDE, 0x4D, 0x10, 0xAC, 0xB9, 0x14, 0x93, 0x23, 0x36, 0xD0, 0xC1, 0xD8, 0x5A, 0xA4, 0x16, 0x65, 0x45, 0xF1,
0xCE, 0x1B, 0xF2, 0xD2, 0x07, 0xF6, 0x07, 0x18, 0xF6, 0xCB, 0xF3, 0x12, 0x7C, 0x05, 0x16, 0xD2, 0xA8, 0x80, 0x05, 0xBB, 0x7B, 0xF7, 0x2B, 0xBA, 0xFA, 0xDC, 0x7A, 0xA0, 0x2C, 0x83, 0xFA, 0xD1,
0xD3, 0x97, 0x1F, 0x9E, 0xA8, 0x3B, 0x2F, 0x2F, 0x3F, 0xBC, 0xF9, 0x5A, 0x3F, 0xE0, 0xB5, 0xF6, 0xBC, 0x82, 0x8E, 0x14, 0x78, 0x09, 0xAE, 0xE1, 0x5F, 0x14, 0xFD, 0x61, 0x8D, 0x98, 0xA4, 0xA6,
0xC5, 0x11, 0x0A, 0x4A, 0x55, 0x9E, 0xD9, 0x80, 0x7B, 0x7F, 0x14, 0x0B, 0xF8, 0x9F, 0x82, 0x40, 0x60, 0x80, 0xBD, 0xAF, 0xE3, 0x88, 0xCD, 0xA1, 0x0B, 0x62, 0xBC, 0x9D, 0xFD, 0x08, 0x0E, 0x82,
0xAE, 0x57, 0x1C, 0x05, 0x1D, 0x04, 0xB4, 0x97, 0x21, 0x12, 0x4C, 0x49, 0xD5, 0x69, 0x1C, 0xB2, 0x94, 0xDD, 0x9D, 0xBF, 0xC7, 0x90, 0x21, 0xEF, 0xED, 0x7D, 0x1D, 0x44, 0x2B, 0x46, 0xF7, 0xF7,
0xF7, 0xA7, 0xF5, 0x03, 0xD1, 0x94, 0xF2, 0xF7, 0x8D, 0x78, 0xDC, 0x7D, 0x3A, 0x59, 0x04, 0x95, 0x9F, 0x51, 0x30, 0xA3, 0xBE, 0xE8, 0x2F, 0x76, 0xF5, 0x7B, 0xE0, 0xD3, 0x67, 0x61, 0x88, 0x0A,
0x40, 0x47, 0x3E, 0x42, 0xB2, 0xD4, 0xB5, 0xAC, 0xCF, 0x10, 0xD3, 0xF7, 0x1C, 0x3C, 0x6D, 0x9F, 0x93, 0x9F, 0xC4, 0x58, 0xDB, 0x27, 0x31, 0x4F, 0x9F, 0xE6, 0x47, 0x48, 0xF5, 0x49, 0x18, 0x63,
0x66, 0xDD, 0x15, 0x10, 0xC1, 0x19, 0x6D, 0xC4, 0xC4, 0x3C, 0xDC, 0x88, 0x5D, 0xA8, 0x4A, 0x78, 0x2D, 0xA6, 0xE0, 0x3B, 0xBF, 0xF0, 0x3B, 0x2C, 0x7F, 0xAD, 0x91, 0x2A, 0xF0, 0x79, 0x22, 0x5C,
0xCC, 0x9D, 0xD4, 0xFE, 0x90, 0x38, 0xB8, 0x4C, 0xC2, 0x40, 0x43, 0xE7, 0xC0, 0x1A, 0x2F, 0x3F, 0x11, 0xF5, 0xF5, 0x07, 0xC4, 0x47, 0x74, 0xFF, 0x50, 0xE5, 0x36, 0x4F, 0x26, 0x91, 0xF2, 0x3A,
0xFC, 0x93, 0xA6, 0x19, 0x2C, 0xF3, 0xFD, 0xBB, 0xD2, 0xFA, 0x7B, 0x92, 0x31, 0x51, 0x38, 0x2A, 0xF4, 0x90, 0xE0, 0x7D, 0xE8, 0x03, 0xAB, 0xE4, 0x67, 0xE1, 0xBB, 0x27, 0x16, 0x14, 0xC9, 0xDD,
0x8D, 0x1F, 0xE8, 0x58, 0x1C, 0x5C, 0x6F, 0xB6, 0x9E, 0x71, 0xEB, 0xC1, 0xD3, 0xB6, 0xCD, 0x9E, 0xCA, 0x4D, 0x46, 0x1B, 0xF2, 0xD2, 0x03, 0x51, 0xF5, 0x31, 0xB6, 0x2A, 0x4E, 0xB2, 0xF0, 0xEA,
0x5F, 0x55, 0xC2, 0x2B, 0x9D, 0xE5, 0x5B, 0x4C, 0x95, 0xE6, 0x67, 0x15, 0xDE, 0x3C, 0x05, 0x02, 0x32, 0xE4, 0x00, 0x2F, 0x3F, 0x3C, 0x51, 0x0B, 0x5C, 0x2F, 0x3F, 0xBC, 0xFD, 0x52, 0x3D, 0xE0,
0xAD, 0xFE, 0x21, 0xA9, 0xE6, 0xAF, 0x74, 0x55, 0xD4, 0xEC, 0x12, 0xDD, 0x64, 0x41, 0x98, 0x41, 0x1A, 0xF6, 0x39, 0x6B, 0x0A, 0x0A, 0x58, 0x9C, 0xAE, 0x81, 0x0F, 0x7D, 0x14, 0x09, 0xF8, 0x9F,
0xFE, 0x40, 0x9D, 0x7F, 0x52, 0x59, 0x14, 0x74, 0x45, 0x3D, 0x35, 0xB4, 0x0C, 0x35, 0x21, 0x50, 0xF0, 0x40, 0x40, 0x9D, 0x1F, 0xDA, 0x1D, 0x04, 0xB4, 0x97, 0x20, 0x12, 0x4C, 0xB1, 0xAB, 0x93,
0x07, 0xEA, 0xBA, 0x01, 0xF9, 0x5A, 0x86, 0xDE, 0x3F, 0xE0, 0x30, 0x0A, 0x2E, 0x00, 0x08, 0xE5, 0x28, 0x60, 0xEF, 0x4F, 0xAA, 0x07, 0x42, 0x16, 0xCA, 0xEF, 0x89, 0xF1, 0xE0, 0xE6, 0x78, 0xB2,
0x14, 0x72, 0x13, 0x42, 0x31, 0x4C, 0xD7, 0x37, 0x4F, 0x24, 0x37, 0x78, 0x56, 0x99, 0x58, 0x1D, 0xF0, 0x4B, 0xD1, 0x04, 0xF9, 0x08, 0x11, 0x69, 0xD7, 0xB2, 0x3E, 0x63, 0xF8, 0x0C, 0x3D, 0x8A,
0x0A, 0x6B, 0x9F, 0x81, 0x0A, 0xCD, 0xD3, 0x24, 0x4E, 0x56, 0x59, 0xBE, 0x7C, 0x85, 0xA9, 0x80, 0x22, 0xE9, 0x83, 0x3D, 0x67, 0x84, 0xDB, 0x07, 0x91, 0x77, 0x85, 0x21, 0x60, 0xEE, 0x37, 0x22,
0xC5, 0xBE, 0xF3, 0xCD, 0x1D, 0x28, 0x55, 0xA6, 0xEA, 0x98, 0xF0, 0xA0, 0x05, 0x1B, 0xDC, 0xEF, 0x91, 0x4C, 0x4D, 0x45, 0xF5, 0xAF, 0x14, 0x94, 0x64, 0x6E, 0x60, 0x7F, 0x20, 0x32, 0xF8, 0x1A,
0x09, 0x8C, 0xB6, 0x5D, 0x5D, 0xA9, 0x0D, 0x15, 0xA3, 0xDD, 0xBB, 0x33, 0xBB, 0xC1, 0xAF, 0xAA, 0x07, 0xBE, 0x86, 0x56, 0x96, 0xD5, 0x5F, 0x7E, 0xF8, 0x27, 0x4D, 0x52, 0x58, 0xE6, 0xFB, 0x77,
0x44, 0x11, 0xDD, 0x0D, 0xF5, 0xDF, 0x44, 0xB3, 0x3A, 0x01, 0x53, 0x31, 0x1A, 0x41, 0xE9, 0xB2, 0xA5, 0xF5, 0xF7, 0x38, 0x65, 0x22, 0x5D, 0x57, 0x1A, 0x3F, 0xD0, 0xB1, 0xB8, 0x81, 0xB0, 0xD9,
0x2B, 0x8B, 0xDB, 0xE2, 0x7B, 0x61, 0x03, 0xFA, 0x00, 0xE4, 0x53, 0x38, 0xB7, 0xDB, 0x8D, 0x6C, 0x7A, 0xC6, 0xD5, 0x09, 0x0F, 0x4A, 0x77, 0xF7, 0x9C, 0xBC, 0xDB, 0x6C, 0xFF, 0x55, 0x25, 0x48,
0x8E, 0xEE, 0xC9, 0xE6, 0x2A, 0x7C, 0xB8, 0xB9, 0x57, 0x5C, 0xA8, 0x17, 0x4D, 0xC3, 0xDD, 0x72, 0xA9, 0xB3, 0xB8, 0xA6, 0x56, 0x6A, 0x7E, 0x56, 0xA2, 0xD9, 0x31, 0x6C, 0xDC, 0xEA, 0x1F, 0x62,
0x78, 0x8A, 0x0E, 0xA4, 0x10, 0x78, 0x9D, 0xAC, 0xF1, 0x55, 0x66, 0x72, 0x5C, 0x30, 0x19, 0xDC, 0x7F, 0x76, 0x67, 0xAF, 0x24, 0x8F, 0x5F, 0xD1, 0x41, 0xE5, 0x1B, 0x36, 0xC8, 0x1B, 0x54, 0x8E,
0x0F, 0x1F, 0xD7, 0x98, 0x03, 0x97, 0x8F, 0x49, 0x73, 0x0D, 0x89, 0xC8, 0x47, 0xE2, 0xA7, 0xC1, 0x27, 0xA5, 0x45, 0x41, 0xA8, 0xD4, 0x83, 0x60, 0xF0, 0xD3, 0x10, 0x23, 0xA7, 0xE8, 0x5D, 0x7D,
0x2A, 0x8C, 0x13, 0xF2, 0x59, 0xEF, 0x3F, 0x64, 0xBE, 0xC8, 0xB0, 0xFA, 0xE4, 0xB8, 0xAA, 0x47, 0x3E, 0x32, 0xA7, 0x01, 0x0C, 0x54, 0x8E, 0x8F, 0x2D, 0x7D, 0xF3, 0xC4, 0x78, 0x83, 0x30, 0xE5,
0x15, 0x80, 0x7A, 0x63, 0x1C, 0xC6, 0x50, 0xDC, 0x9D, 0xF3, 0x13, 0x7D, 0x3F, 0x4D, 0xFD, 0xEB, 0xF3, 0xE3, 0x12, 0x6D, 0x0C, 0x72, 0x06, 0x62, 0x32, 0x4F, 0xE2, 0x28, 0x5E, 0xA5, 0xD9, 0x22,
0xF1, 0x6A, 0x3A, 0xA5, 0x50, 0x63, 0x94, 0xE4, 0x81, 0xC2, 0x01, 0xBB, 0x86, 0x6A, 0x46, 0xA4, 0x25, 0x02, 0xC1, 0x5A, 0xFB, 0x8E, 0x9B, 0x2D, 0x0C, 0x15, 0x51, 0x2D, 0x0D, 0x6E, 0xCC, 0x04,
0xF2, 0x99, 0x7C, 0x38, 0x23, 0xFA, 0xAE, 0x83, 0x72, 0xEB, 0xB6, 0x02, 0x84, 0x73, 0xA9, 0x02, 0xCC, 0x6D, 0xFB, 0x55, 0x70, 0xB4, 0xA4, 0x89, 0x7B, 0xAB, 0xDA, 0x1B, 0xBB, 0x2E, 0x53, 0x1F,
0x65, 0xD7, 0xE1, 0x7A, 0x45, 0x84, 0xE4, 0x7F, 0x39, 0x6C, 0x19, 0x9F, 0xBF, 0x7F, 0xCF, 0x28, 0xD1, 0xD9, 0x10, 0x61, 0x0B, 0xC2, 0x54, 0x1A, 0x42, 0x5A, 0xB7, 0x2B, 0xC2, 0x45, 0xFA, 0x18,
0xC3, 0x6A, 0x38, 0x59, 0xB1, 0xBA, 0x22, 0x1E, 0xC3, 0xA5, 0xAE, 0x5E, 0x5D, 0x8B, 0xE7, 0x00, 0x3B, 0xC3, 0x5C, 0x7D, 0x00, 0x74, 0xCC, 0x6D, 0xD2, 0xED, 0x46, 0xA4, 0x4B, 0xF7, 0x44, 0xBA,
0x07, 0x31, 0xC6, 0xF2, 0xAC, 0x32, 0x65, 0x01, 0x69, 0x9F, 0x3F, 0xAB, 0x22, 0x08, 0xEE, 0xF4, 0xA5, 0x9D, 0xDE, 0xDC, 0xCB, 0x9C, 0x57, 0xF3, 0xA6, 0xE1, 0x6E, 0x4A, 0x1E, 0xA3, 0xDE, 0xE7,
0x09, 0xA4, 0x7E, 0x60, 0xBA, 0x3E, 0x54, 0xBC, 0xB0, 0x64, 0x3C, 0xA1, 0x50, 0x02, 0x3E, 0x43, 0x4C, 0xA9, 0x92, 0x35, 0xDE, 0x1C, 0x27, 0x35, 0x95, 0x6B, 0x35, 0xC8, 0x54, 0x6B, 0x65, 0x2E,
0x3E, 0xFD, 0xC2, 0xF9, 0xA4, 0x97, 0x69, 0x20, 0x8E, 0xCA, 0x8F, 0xF9, 0xFB, 0xE0, 0xF1, 0x1D, 0xD7, 0x48, 0x63, 0x0D, 0x91, 0xD9, 0x47, 0xE2, 0x25, 0xFE, 0x2A, 0x88, 0x62, 0xF2, 0x59, 0xEF,
0xF4, 0x61, 0x22, 0x6B, 0x04, 0x4D, 0xCF, 0x77, 0x99, 0x4F, 0x9F, 0x13, 0x68, 0xFF, 0x68, 0x7D, 0x3F, 0x0A, 0x50, 0x09, 0x84, 0x5E, 0x1F, 0x07, 0x11, 0xE4, 0xBC, 0xE7, 0xFC, 0xEE, 0x84, 0x97,
0x86, 0xB6, 0xFC, 0x95, 0x03, 0xF6, 0xD1, 0xFE, 0x5C, 0xA5, 0xFB, 0xF4, 0x39, 0x14, 0x97, 0xB2, 0x24, 0xDE, 0xF5, 0x78, 0x35, 0x9D, 0x52, 0x48, 0xBD, 0x8A, 0x9D, 0x81, 0xB4, 0x00, 0xA5, 0x86,
0x1B, 0xBD, 0x8E, 0xF8, 0x53, 0x68, 0x65, 0xAE, 0xEC, 0x7B, 0xC2, 0xE7, 0x1E, 0x1D, 0x15, 0x01, 0x6A, 0x50, 0xA8, 0x92, 0x98, 0x7C, 0x38, 0x23, 0xFA, 0xAE, 0x4B, 0x07, 0xD6, 0x6D, 0x09, 0x08,
0xFB, 0x94, 0x69, 0x19, 0xA5, 0x8B, 0x4C, 0xBB, 0x4E, 0x56, 0x1A, 0xBE, 0x23, 0x25, 0x13, 0x11, 0x27, 0x50, 0x09, 0xCA, 0xCE, 0x8B, 0x0A, 0x25, 0xD0, 0xFF, 0xC3, 0x61, 0x4B, 0x8F, 0xFA, 0xFD,
0x6D, 0x0A, 0xF5, 0xA6, 0xE6, 0xC7, 0x09, 0xD8, 0x13, 0x64, 0xCC, 0x52, 0x4F, 0x0C, 0x1C, 0x96, 0x7B, 0x4A, 0x19, 0x1A, 0xBC, 0x78, 0xC5, 0xAA, 0x0A, 0x67, 0x0C, 0x97, 0xBA, 0x7A, 0x79, 0x2D,
0xF2, 0x71, 0x71, 0xB2, 0xD6, 0xD4, 0xBC, 0x85, 0x80, 0xAD, 0x29, 0xD9, 0x92, 0xFA, 0xEE, 0x12, 0x7E, 0xA9, 0xE1, 0x20, 0xC6, 0x98, 0xB5, 0x96, 0xA6, 0x64, 0xD7, 0x22, 0x36, 0x62, 0xDF, 0x27,
0xB2, 0x65, 0xAB, 0x44, 0xDE, 0x78, 0x29, 0x4B, 0x7B, 0x4A, 0xF4, 0xBB, 0xCB, 0xA0, 0xF5, 0xE3, 0xE0, 0xF5, 0x41, 0xF1, 0x3C, 0x2D, 0x88, 0x60, 0xC9, 0x68, 0x42, 0x21, 0x33, 0x7E, 0x86, 0x74,
0x8B, 0x20, 0x7C, 0xB5, 0xEA, 0x71, 0xF9, 0xA6, 0xB2, 0xE8, 0x23, 0xA6, 0xE3, 0x9B, 0x53, 0x87, 0xFA, 0x85, 0xD3, 0x49, 0x2F, 0x22, 0x61, 0x1C, 0x95, 0xDD, 0x7F, 0xE8, 0x43, 0x72, 0xEB, 0x1C,
0xEA, 0xA7, 0xBB, 0x66, 0x2A, 0xA1, 0xE9, 0x50, 0xCE, 0xF6, 0xF8, 0x74, 0x4F, 0xBC, 0x09, 0x76, 0x0D, 0xB3, 0xAB, 0x09, 0x20, 0xC6, 0x59, 0xF9, 0xFD, 0xE4, 0x39, 0x01, 0x23, 0xF3, 0xD1, 0xFA,
0xB0, 0xC4, 0xCB, 0x4B, 0xB6, 0x6A, 0x99, 0x67, 0xDC, 0x59, 0xC1, 0x11, 0xF0, 0x35, 0x0F, 0xAB, 0x0C, 0x6D, 0xD9, 0xF5, 0x0D, 0xF6, 0xD1, 0xFE, 0x5C, 0xDE, 0xF7, 0xC9, 0x73, 0x0D, 0x03, 0x0F,
0xDC, 0x44, 0xE1, 0x56, 0xCE, 0x7B, 0x40, 0xC1, 0x26, 0x82, 0x29, 0x90, 0xF2, 0x57, 0xA8, 0xD9, 0xDE, 0xAD, 0x83, 0x8A, 0x88, 0x3F, 0x3A, 0x57, 0xE6, 0xCA, 0xBE, 0x27, 0x7C, 0xEE, 0xD3, 0xA7,
0x38, 0x47, 0xEF, 0xAC, 0xDA, 0xB6, 0x24, 0xFC, 0xF8, 0x7A, 0x2D, 0x4F, 0xE4, 0x8A, 0x92, 0xED, 0xB9, 0x8B, 0x3D, 0x61, 0x5A, 0x4A, 0xE9, 0x22, 0xD5, 0xAE, 0xE3, 0x95, 0x86, 0xB7, 0xD1, 0x64,
0x6E, 0x5B, 0xB8, 0x6F, 0xA5, 0xB6, 0x85, 0xE5, 0x81, 0xB7, 0xFD, 0x0E, 0x80, 0xC9, 0xDF, 0xFB, 0xE8, 0xA0, 0x4D, 0x21, 0x0D, 0xD7, 0xBC, 0x28, 0x06, 0x65, 0x4A, 0x34, 0x70, 0x4C, 0x5C, 0x14,
0x7B, 0x9C, 0x31, 0x3C, 0xDE, 0x7E, 0x2B, 0x33, 0xF3, 0x77, 0x5D, 0x97, 0x57, 0xF7, 0xB4, 0xF8, 0x0D, 0x1C, 0x96, 0xF0, 0x71, 0x51, 0xBC, 0xD6, 0xD4, 0x48, 0x03, 0x15, 0xF3, 0xC5, 0xE9, 0xE9,
0xB2, 0xBE, 0xFC, 0x17, 0xF9, 0x87, 0xED, 0xE9, 0x0A, 0x8E, 0x03, 0xE1, 0x10, 0xF7, 0x17, 0xB2, 0xDB, 0xD3, 0x02, 0xDD, 0xED, 0x2B, 0x24, 0xEC, 0xA3, 0xF3, 0x79, 0xF3, 0x12, 0xC9, 0xD6, 0x66,
0xE8, 0x00, 0x89, 0xCD, 0x0F, 0x6D, 0x84, 0xD8, 0x8F, 0x8E, 0x88, 0x57, 0x7D, 0x54, 0x7B, 0xBF, 0x70, 0x50, 0x8D, 0x68, 0xD8, 0xD9, 0xC7, 0x0B, 0x14, 0xF6, 0x67, 0xDD, 0x28, 0xC5, 0x9F, 0x1B,
0x7F, 0x97, 0x65, 0xAF, 0x74, 0xBA, 0x53, 0x5E, 0xAE, 0x61, 0xDA, 0xE5, 0x40, 0xA4, 0xC8, 0x47, 0xE1, 0xA7, 0x37, 0xC6, 0xD3, 0x01, 0xCC, 0x46, 0x95, 0x08, 0xB4, 0x34, 0xE1, 0x06, 0xF3, 0xC7,
0xE9, 0xD5, 0x41, 0x13, 0x8C, 0x62, 0x11, 0xAF, 0x8C, 0x07, 0x3C, 0x9B, 0xC2, 0x35, 0x5D, 0x75, 0xD2, 0xAA, 0xC7, 0x55, 0x2F, 0xA4, 0x30, 0x4B, 0xDE, 0x5B, 0xD3, 0xA6, 0x3C, 0xD2, 0xA8, 0x82,
0xBC, 0xB0, 0x12, 0xEE, 0x0F, 0xEE, 0x34, 0x0A, 0x3C, 0x2E, 0xF6, 0x2C, 0x83, 0x0D, 0x21, 0x36, 0xFB, 0x2C, 0x0D, 0xAB, 0x11, 0x9D, 0x17, 0x33, 0x36, 0x37, 0xA2, 0x6F, 0xDD, 0x84, 0xD1, 0xFB,
0xF3, 0xBF, 0xE9, 0x00, 0x0E, 0xD7, 0x15, 0x45, 0x8E, 0x8F, 0x87, 0xF6, 0xDD, 0xCE, 0x4A, 0x88, 0xBB, 0x00, 0x42, 0x8C, 0x62, 0x80, 0xD1, 0x29, 0x72, 0x8C, 0xFF, 0x07, 0x69, 0xC2, 0x5E, 0xC3,
0x25, 0xBE, 0x8F, 0xB6, 0x95, 0x8A, 0xEB, 0xD9, 0x66, 0x6C, 0x78, 0xD6, 0x09, 0x26, 0x92, 0x13, 0xAB, 0xF7, 0x33, 0x31, 0x00, 0x97, 0x8D, 0x48, 0xA9, 0x86, 0x4F, 0xBD, 0x15, 0x88, 0x6A, 0xB0,
0xD0, 0xDB, 0xB4, 0x58, 0x9F, 0x61, 0xCE, 0x20, 0x53, 0xA1, 0x94, 0xA2, 0x3D, 0xE0, 0x5E, 0xA9, 0x55, 0x29, 0xDA, 0xB8, 0xEE, 0xA8, 0x1D, 0x13, 0xFD, 0xEE, 0x6A, 0xC0, 0xFA, 0xF1, 0xB5, 0x00,
0x61, 0x63, 0x9E, 0xC0, 0x49, 0xDE, 0xC5, 0x36, 0x2C, 0x67, 0xD5, 0xCE, 0x3B, 0xB7, 0x12, 0xCA, 0xBC, 0xB4, 0xF8, 0x38, 0xB2, 0x28, 0x8B, 0x3E, 0x62, 0x3A, 0xDE, 0x49, 0x3C, 0x54, 0x46, 0xB8,
0xE8, 0x88, 0x19, 0xE8, 0x7E, 0xFB, 0x2C, 0x5F, 0x75, 0xDD, 0x53, 0x70, 0x2A, 0x5B, 0x88, 0xF8, 0x6B, 0xA6, 0x12, 0x13, 0x1C, 0x8A, 0xAA, 0x1F, 0x1F, 0x90, 0x8B, 0x3B, 0x96, 0x07, 0x2B, 0x1D,
0xAA, 0xE4, 0xA3, 0x20, 0xF1, 0xA8, 0x30, 0xB8, 0x23, 0xE0, 0x46, 0xA5, 0xA3, 0x90, 0x3B, 0xC8, 0x59, 0xBE, 0x56, 0xAE, 0x76, 0x18, 0x77, 0x16, 0x32, 0x08, 0x78, 0x93, 0x87, 0x15, 0x30, 0x44,
0x20, 0xB8, 0xFD, 0xA3, 0x97, 0x5B, 0xA3, 0xF1, 0xD5, 0x45, 0x8E, 0xC4, 0xD3, 0xF7, 0x67, 0x2F, 0xFD, 0xA2, 0x98, 0xA7, 0xDF, 0xAA, 0x37, 0xCA, 0x8C, 0x07, 0x17, 0x31, 0x44, 0xD0, 0x03, 0xFB,
0xDE, 0xA9, 0xC5, 0x2E, 0x3A, 0x59, 0x40, 0x21, 0x66, 0xE0, 0x7C, 0x8F, 0xC9, 0xD1, 0xDB, 0x67, 0xDB, 0x51, 0xC7, 0xF8, 0x73, 0x0A, 0x18, 0x9C, 0xD6, 0x77, 0x96, 0x30, 0xB6, 0x78, 0x7F, 0xBF,
0x67, 0x67, 0x1F, 0xDE, 0xBC, 0x7B, 0xBE, 0x7B, 0x08, 0xC3, 0x21, 0x67, 0xEF, 0x7F, 0x79, 0x7D, 0xE2, 0xC5, 0x5D, 0xF5, 0x8A, 0x2C, 0xFE, 0xDE, 0x59, 0xB2, 0xB8, 0x5B, 0x7B, 0xEE, 0x6B, 0x82,
0x7A, 0x3E, 0xBC, 0xC6, 0x6D, 0xB9, 0x70, 0x57, 0x44, 0x08, 0xEF, 0xDE, 0x1A, 0x0E, 0xB7, 0xB6, 0xB6, 0xB0, 0x3F, 0x70, 0xF3, 0xF6, 0x00, 0x98, 0xEC, 0x0E, 0xEE, 0xE3, 0xD4, 0xE7, 0xF1, 0x1A,
0x86, 0x9F, 0x40, 0x9B, 0xAC, 0x0B, 0x78, 0x95, 0x10, 0x56, 0xAB, 0x84, 0xA2, 0x0C, 0xA8, 0xE4, 0x5F, 0x9A, 0x99, 0xDD, 0x3B, 0x5F, 0x5E, 0xDD, 0xD3, 0x46, 0x14, 0xF5, 0x95, 0x7F, 0x93, 0x45,
0x5B, 0x61, 0x51, 0x2A, 0xF4, 0xF3, 0x8A, 0x1F, 0x44, 0x1D, 0xAA, 0x65, 0x42, 0xCC, 0xC3, 0x50, 0xD9, 0x9E, 0xAE, 0xE0, 0x38, 0x10, 0x26, 0xF4, 0x7E, 0x85, 0x1C, 0x34, 0x9F, 0xC4, 0xE6, 0x27,
0x98, 0x97, 0x09, 0xEB, 0x30, 0x0E, 0x92, 0xF5, 0x0E, 0xC7, 0x9D, 0xCF, 0xBF, 0x1D, 0x9C, 0x34, 0x9F, 0x42, 0x04, 0x9E, 0x3E, 0x25, 0xCD, 0xF2, 0x57, 0xB5, 0xF7, 0xFB, 0xF7, 0xB2, 0xDB, 0x25,
0xE5, 0xFB, 0xAC, 0x27, 0x4D, 0xF9, 0x1A, 0x3D, 0xFF, 0x1F, 0x2E, 0xFE, 0x1F, 0xE4, 0x44, 0x87, 0x0E, 0xF8, 0xF6, 0xAC, 0x53, 0x2F, 0xFB, 0xBB, 0x09, 0x86, 0x3A, 0xC2, 0xE3, 0x0D, 0x78, 0xB4,
0x45, 0x77, 0x51, 0x00, 0x00 0x8D, 0x4B, 0xB9, 0xEA, 0x78, 0xA1, 0x40, 0xDC, 0x88, 0xDC, 0xA9, 0x2F, 0x78, 0xD9, 0xA2, 0x69,
0x19, 0x6C, 0x08, 0x01, 0x1C, 0xFF, 0x13, 0x2B, 0x20, 0x72, 0x55, 0x91, 0xEB, 0xA8, 0x36, 0xB4,
0xEF, 0xB6, 0x70, 0x82, 0x33, 0xD1, 0x7D, 0x04, 0xAE, 0x90, 0xDD, 0xA6, 0x6D, 0x46, 0x46, 0xD3,
0x3A, 0xC2, 0x54, 0x62, 0x02, 0xA2, 0x9B, 0xE4, 0xEB, 0x33, 0x0C, 0x2C, 0x37, 0x1C, 0x20, 0xC4,
0x84, 0x36, 0x06, 0x93, 0x7C, 0xCB, 0xE5, 0x22, 0xD9, 0x8E, 0xA6, 0x7D, 0x75, 0xB3, 0xC2, 0x8D,
0x62, 0x56, 0xB2, 0x5F, 0x2D, 0x8B, 0xDB, 0xE6, 0x7B, 0x6A, 0x07, 0x4A, 0xC9, 0x1D, 0x6F, 0x2B,
0x3F, 0x0A, 0x12, 0x77, 0x1F, 0x83, 0x3B, 0x3C, 0x73, 0x58, 0xD8, 0x07, 0x79, 0xE2, 0x02, 0xCC,
0xDA, 0x3F, 0x7A, 0xB9, 0x35, 0x1A, 0x2F, 0xFB, 0x72, 0x24, 0x8E, 0xDF, 0x9F, 0xBD, 0x38, 0x55,
0xEB, 0x16, 0x68, 0x73, 0x01, 0x85, 0x88, 0x81, 0x2D, 0xAE, 0x91, 0xA7, 0xEF, 0x9E, 0x9D, 0x9D,
0x7D, 0x78, 0x7B, 0xFA, 0x7C, 0xF7, 0x10, 0x86, 0x43, 0xCE, 0xDE, 0xFF, 0xF2, 0xFA, 0xE4, 0x7C,
0x78, 0x8D, 0xE5, 0xEB, 0x60, 0x87, 0x93, 0x18, 0x04, 0x77, 0x1F, 0xA5, 0x04, 0x5B, 0x47, 0x29,
0x4F, 0xA0, 0x4D, 0xE6, 0x8A, 0x3C, 0x73, 0x0C, 0xCA, 0x99, 0x63, 0x9E, 0x1A, 0x96, 0x62, 0xD7,
0x20, 0x4F, 0x1F, 0xFB, 0x59, 0xF1, 0x06, 0xD8, 0x1E, 0xA8, 0xA9, 0x63, 0xC4, 0x5D, 0x53, 0x90,
0xA5, 0x8E, 0xEB, 0x20, 0xF2, 0xE3, 0xF5, 0x0E, 0xDB, 0x9D, 0xCD, 0xBF, 0x1D, 0x1C, 0x35, 0xE4,
0x95, 0xF2, 0xA3, 0x86, 0xFC, 0x4B, 0x16, 0xFE, 0xFF, 0x3C, 0xFD, 0x5F, 0xA2, 0x56, 0x64, 0x29,
0xFA, 0x54, 0x00, 0x00
}; };
#endif //__embedded_h #endif //__embedded_h

View File

@ -5,7 +5,7 @@
"del": "latest", "del": "latest",
"deprecated": "latest", "deprecated": "latest",
"fs": "latest", "fs": "latest",
"gulp": "^4.0.0", "gulp": "^4.0.2",
"gulp-bytediff": "latest", "gulp-bytediff": "latest",
"gulp-cdnizer": "latest", "gulp-cdnizer": "latest",
"gulp-clean-css": "latest", "gulp-clean-css": "latest",

Binary file not shown.

View File

@ -3,11 +3,16 @@ var authentication = false;
var webupdate = false; var webupdate = false;
var filesystem = false; var filesystem = false;
var websocket_port = 0; var websocket_port = 0;
var websocket_IP = "";
var async_webcommunication = false; var async_webcommunication = false;
var page_id = ""; var page_id = "";
var ws_source; var ws_source;
var log_off =false; var log_off =false;
var websocket_started =false; var websocket_started =false;
var esp_error_message ="";
var esp_error_code = 0;
var xmlhttpupload;
var typeupload = 0;
function navbar(){ function navbar(){
var content="<table><tr>"; var content="<table><tr>";
var tlist = currentpath.split("/"); var tlist = currentpath.split("/");
@ -83,7 +88,7 @@ for (var i1=0;i1 <jsonresponse.files.length;i1++){
if (String(jsonresponse.files[i1].size) != "-1") if (String(jsonresponse.files[i1].size) != "-1")
{ {
content +="<TR>"; content +="<TR>";
content +="<td><svg height='24' width='24' viewBox='0 0 24 24' > <path d='M1,2 L1,21 L2,22 L16,22 L17,21 L17,6 L12,6 L12,1 L2,1 z' stroke='black' fill='white' /><line x1='12' y1='1' x2='17' y2='6' stroke='black' stroke-width='1'/>"; content +="<td><svg height='24' width='24' viewBox='0 0 24 24' > <path d='M1,2 L1,21 L2,22 L16,22 L17,21 L17,6 L12,6 L12,1 L2,1 z' stroke='black' fill='white' /><line x1='12' y1='1' x2='17' y2='6' stroke='black' stroke-width='1'/>";
content +="</svg></td>"; content +="</svg></td>";
content +="<TD class='btnimg' style=\"padding:0px;\"><a href=\""+jsonresponse.path+jsonresponse.files[i1].name+"\" target=_blank><div class=\"blacklink\">"; content +="<TD class='btnimg' style=\"padding:0px;\"><a href=\""+jsonresponse.path+jsonresponse.files[i1].name+"\" target=_blank><div class=\"blacklink\">";
content +=jsonresponse.files[i1].name; content +=jsonresponse.files[i1].name;
@ -94,13 +99,13 @@ if (String(jsonresponse.files[i1].size) != "-1")
content +=jsonresponse.files[i1].size; content +=jsonresponse.files[i1].size;
content +="</TD>"; content +="</TD>";
if (jsonresponse.files[i1].hasOwnProperty('time')){ if (jsonresponse.files[i1].hasOwnProperty('time')){
display_time = true; display_time = true;
content +="<TD>"; content +="<TD>";
content += jsonresponse.files[i1].time; content += jsonresponse.files[i1].time;
content +="</TD>"; content +="</TD>";
} else { } else {
content +="<TD></TD>"; content +="<TD></TD>";
} }
content +="<TD width='0%'><div class=\"btnimg\" onclick=\"Delete('"+jsonresponse.files[i1].name+"')\">"; content +="<TD width='0%'><div class=\"btnimg\" onclick=\"Delete('"+jsonresponse.files[i1].name+"')\">";
content +=trash_icon(); content +=trash_icon();
content +="</div></TD><td></td></TR>"; content +="</div></TD><td></td></TR>";
@ -115,17 +120,17 @@ if (String(jsonresponse.files[i2].size) == "-1")
content +=jsonresponse.files[i2].name; content +=jsonresponse.files[i2].name;
content +="</TD><TD></TD><TD></TD>"; content +="</TD><TD></TD><TD></TD>";
if (typeof jsonresponse.files[i2].hasOwnProperty('time')){ if (typeof jsonresponse.files[i2].hasOwnProperty('time')){
display_time = true; display_time = true;
} }
content +="<TD width='0%'><div class=\"btnimg\" onclick=\"Deletedir('"+jsonresponse.files[i2].name+"')\">"; content +="<TD width='0%'><div class=\"btnimg\" onclick=\"Deletedir('"+jsonresponse.files[i2].name+"')\">";
content +=trash_icon(); content +=trash_icon();
content +="</div></TD><td></td></TR>"; content +="</div></TD><td></td></TR>";
} }
} }
if(display_time){ if(display_time){
document.getElementById('FS_time').innerHTML = ""; document.getElementById('FS_time').innerHTML = "";
} else { } else {
document.getElementById('FS_time').innerHTML = "Time"; document.getElementById('FS_time').innerHTML = "Time";
} }
if (display_message) { if (display_message) {
@ -150,6 +155,7 @@ if (filename != null) {
SendCommand("createdir",filename.trim()); SendCommand("createdir",filename.trim());
} }
} }
function SendCommand(action,filename){ function SendCommand(action,filename){
var xmlhttp = new XMLHttpRequest(); var xmlhttp = new XMLHttpRequest();
var url = "/files?action="+action; var url = "/files?action="+action;
@ -188,10 +194,10 @@ var arg = currentpath + file.name + "S";
//append file size first to check updload is complete //append file size first to check updload is complete
formData.append(arg, file.size); formData.append(arg, file.size);
formData.append('myfiles[]', file, currentpath+file.name);} formData.append('myfiles[]', file, currentpath+file.name);}
var xmlhttp = new XMLHttpRequest(); xmlhttpupload = new XMLHttpRequest();
xmlhttp.open('POST', '/files', true); xmlhttpupload.open('POST', '/files', true);
//progress upload event //progress upload event
xmlhttp.upload.addEventListener("progress", updateProgress, false); xmlhttpupload.upload.addEventListener("progress", updateProgress, false);
//progress function //progress function
function updateProgress (oEvent) { function updateProgress (oEvent) {
if (oEvent.lengthComputable) { if (oEvent.lengthComputable) {
@ -202,17 +208,28 @@ function updateProgress (oEvent) {
// Impossible because size is unknown // Impossible because size is unknown
} }
} }
typeupload = 1;
xmlhttp.onload = function () { xmlhttpupload.onload = function () {
if (xmlhttp.status === 200) { if (xmlhttpupload.status === 200) {
document.getElementById('upload-button').value = 'Upload'; document.getElementById('upload-button').value = 'Upload';
document.getElementById('prg').style.visibility = "hidden"; document.getElementById('prg').style.visibility = "hidden";
document.getElementById('file-select').value=""; document.getElementById('file-select').value="";
var jsonresponse = JSON.parse(xmlhttp.responseText); var jsonresponse = JSON.parse(xmlhttpupload.responseText);
dispatchfilestatus(jsonresponse); dispatchfilestatus(jsonresponse);
} else alert('An error occurred!'); } else uploadError();
}; };
xmlhttp.send(formData);
xmlhttpupload.send(formData);
}
function padNumber(num, size) {
var s = num.toString();
while (s.length < size) s = "0" + s;
return s;
}
function getPCTime(){
var d = new Date();
return d.getFullYear() + "-" + padNumber(d.getMonth() + 1 ,2) + "-" + padNumber(d.getDate(),2) + "-" + padNumber(d.getHours(),2) + "-" + padNumber(d.getMinutes(),2) + "-" + padNumber(d.getSeconds(),2);
} }
function HideAll(msg){ function HideAll(msg){
@ -230,6 +247,7 @@ function HideAll(msg){
function FWError(){ function FWError(){
HideAll("Failed to communicate with FW!"); HideAll("Failed to communicate with FW!");
} }
function FWOk(){ function FWOk(){
document.getElementById('MSG').innerHTML = "Connected"; document.getElementById('MSG').innerHTML = "Connected";
if (filesystem){ if (filesystem){
@ -242,7 +260,7 @@ function FWOk(){
function InitUI(){ function InitUI(){
var xmlhttp = new XMLHttpRequest(); var xmlhttp = new XMLHttpRequest();
var url = "/command?cmd="+encodeURI("[ESP800]"); var url = "/command?cmd="+encodeURI("[ESP800]"+"time=" + getPCTime());
authentication = false; authentication = false;
async_webcommunication = false; async_webcommunication = false;
xmlhttp.onreadystatechange = function() { xmlhttp.onreadystatechange = function() {
@ -250,26 +268,28 @@ xmlhttp.onreadystatechange = function() {
var error = false; var error = false;
if(xmlhttp.status == 200) { if(xmlhttp.status == 200) {
var jsonresponse = JSON.parse(xmlhttp.responseText); var jsonresponse = JSON.parse(xmlhttp.responseText);
if ((typeof jsonresponse.FWVersion === "undefined")|| (typeof jsonresponse.Hostname === "undefined") || (typeof jsonresponse.WebUpdate === "undefined") || (typeof jsonresponse.WebSocketport === "undefined") || (typeof jsonresponse.WebCommunication === "undefined") || (typeof jsonresponse.Filesystem === "undefined") || (typeof jsonresponse.Authentication === "undefined")) { if ((typeof jsonresponse.FWVersion === "undefined")|| (typeof jsonresponse.Hostname === "undefined") || (typeof jsonresponse.WebUpdate === "undefined") || (typeof jsonresponse.WebSocketport === "undefined") || (typeof jsonresponse.WebSocketIP === "undefined") || (typeof jsonresponse.WebCommunication === "undefined") || (typeof jsonresponse.Filesystem === "undefined") || (typeof jsonresponse.Authentication === "undefined")) {
error = true; error = true;
} else { } else {
document.getElementById('FWVERSION').innerHTML = "v"+jsonresponse.FWVersion; document.getElementById('FWVERSION').innerHTML = "v"+jsonresponse.FWVersion;
if (jsonresponse.Filesystem != "None"){ if (jsonresponse.Filesystem != "None"){
filesystem = true; filesystem = true;
console.log(jsonresponse.Filesystem); //console.log(jsonresponse.Filesystem);
} }
if (jsonresponse.WebUpdate != "Disabled"){ if (jsonresponse.WebUpdate != "Disabled"){
webupdate = true; webupdate = true;
console.log(jsonresponse.WebUpdate); //console.log(jsonresponse.WebUpdate);
} }
//websocket port //websocket port
websocket_port = jsonresponse.WebSocketport; websocket_port = jsonresponse.WebSocketport;
console.log(websocket_port); //websocket IP
websocket_IP = jsonresponse.WebSocketIP;
//console.log(websocket_port);
//async communications //async communications
if (jsonresponse.WebCommunication != "Synchronous") { if (jsonresponse.WebCommunication != "Synchronous") {
async_webcommunication = true; async_webcommunication = true;
console.log(jsonresponse.WebCommunication); //console.log(jsonresponse.WebCommunication);
} }
FWOk(); FWOk();
startSocket(); startSocket();
@ -277,7 +297,7 @@ xmlhttp.onreadystatechange = function() {
if (filesystem)SendCommand('list','all'); if (filesystem)SendCommand('list','all');
if (jsonresponse.Authentication != "Disabled"){ if (jsonresponse.Authentication != "Disabled"){
authentication = true; authentication = true;
console.log(jsonresponse.Authentication); //console.log(jsonresponse.Authentication);
} }
} }
} else if (xmlhttp.status == 401){ } else if (xmlhttp.status == 401){
@ -295,18 +315,17 @@ xmlhttp.open("GET", url, true);
xmlhttp.send(); xmlhttp.send();
} }
function startSocket(){ function startSocket(){
if (websocket_started){ if (websocket_started){
ws_source.close(); ws_source.close();
} }
if(async_webcommunication){ if(async_webcommunication){
ws_source = new WebSocket('ws://'+document.location.host+'/ws',['arduino']); ws_source = new WebSocket('ws://'+websocket_IP + ':' + websocket_port +'/ws',['arduino']);
} }
else { else {
//console.log("Socket port is :" + websocket_port); //console.log("Socket port is :" + websocket_port);
ws_source = new WebSocket('ws://'+document.location.hostname+':' + websocket_port,['arduino']); ws_source = new WebSocket('ws://'+websocket_IP + ':' + websocket_port,['arduino']);
} }
ws_source.binaryType = "arraybuffer"; ws_source.binaryType = "arraybuffer";
ws_source.onopen = function(e){ ws_source.onopen = function(e){
console.log("WS"); console.log("WS");
@ -328,17 +347,24 @@ function startSocket(){
if(!(e.data instanceof ArrayBuffer)){ if(!(e.data instanceof ArrayBuffer)){
msg = e.data; msg = e.data;
var tval = msg.split(":"); var tval = msg.split(":");
if (tval.length == 2) { if (tval.length >= 2) {
if (tval[0] == 'currentID') { if (tval[0] == 'currentID') {
page_id = tval[1]; page_id = tval[1];
console.log("ID " + page_id); console.log("ID " + page_id);
} }
if (tval[0] == 'activeID') { if (tval[0] == 'activeID') {
if(page_id != tval[1]) { if(page_id != tval[1]) {
HideAll("It seems you are connect from another location, your are now disconnected"); HideAll("It seems you are connect from another location, your are now disconnected");
} }
} }
} if (tval[0] == 'ERROR') {
esp_error_message = tval[2];
esp_error_code = tval[1];
console.log(tval[2] + " code:" + tval[1]);
uploadError();
xmlhttpupload.abort();
}
}
} }
//console.log(msg); //console.log(msg);
@ -350,6 +376,26 @@ window.onload = function() {
InitUI(); InitUI();
}; };
function uploadError()
{
if (esp_error_code != 0) {
alert('Update failed(' + esp_error_code + '): ' + esp_error_message);
esp_error_code = 0;
} else {
alert('Update failed!');
}
if (typeupload == 1) {
//location.reload();
document.getElementById('upload-button').value = 'Upload';
document.getElementById('prg').style.visibility = "hidden";
document.getElementById('file-select').value="";
SendCommand('list', 'all');
} else {
location.reload();
}
}
function Uploadfile(){ function Uploadfile(){
if (!confirm("Confirm Firmware Update ?"))return; if (!confirm("Confirm Firmware Update ?"))return;
var files = document.getElementById('fw-select').files; var files = document.getElementById('fw-select').files;
@ -367,10 +413,11 @@ var arg = "/" + file.name + "S";
//append file size first to check updload is complete //append file size first to check updload is complete
formData.append(arg, file.size); formData.append(arg, file.size);
formData.append('myfile[]', file, "/"+file.name);} formData.append('myfile[]', file, "/"+file.name);}
var xmlhttp = new XMLHttpRequest(); typeupload = 0;
xmlhttp.open('POST', '/updatefw', true); xmlhttpupload = new XMLHttpRequest();
xmlhttpupload.open('POST', '/updatefw', true);
//progress upload event //progress upload event
xmlhttp.upload.addEventListener("progress", updateProgress, false); xmlhttpupload.addEventListener("progress", updateProgress, false);
//progress function //progress function
function updateProgress (oEvent) { function updateProgress (oEvent) {
if (oEvent.lengthComputable) { if (oEvent.lengthComputable) {
@ -381,8 +428,8 @@ function updateProgress (oEvent) {
// Impossible because size is unknown // Impossible because size is unknown
} }
} }
xmlhttp.onload = function () { xmlhttpupload.onload = function () {
if (xmlhttp.status === 200) { if (xmlhttpupload.status === 200) {
document.getElementById('ubut').value = 'Upload'; document.getElementById('ubut').value = 'Upload';
document.getElementById('msg').innerHTML="Restarting, please wait...."; document.getElementById('msg').innerHTML="Restarting, please wait....";
document.getElementById('counter').style.visibility = "visible"; document.getElementById('counter').style.visibility = "visible";
@ -392,33 +439,34 @@ document.getElementById('fw-select').value="";
document.getElementById('fw-select').style.visibility = 'hidden'; document.getElementById('fw-select').style.visibility = 'hidden';
document.getElementById('fw-select').style.width = '0px'; document.getElementById('fw-select').style.width = '0px';
var jsonresponse = JSON.parse(xmlhttp.responseText); var jsonresponse = JSON.parse(xmlhttpupload.responseText);
if (jsonresponse.status=='1' || jsonresponse.status=='4' || jsonresponse.status=='1')alert("Update failed"); if (jsonresponse.status=='1' || jsonresponse.status=='4' || jsonresponse.status=='1')uploadError();
if (jsonresponse.status=='2')alert('Update canceled!'); if (jsonresponse.status=='2')alert('Update canceled!');
else if (jsonresponse.status=='3') else if (jsonresponse.status=='3')
{ {
var i5 = 0; var i5 = 0;
var interval; var interval;
var x = document.getElementById("prgfw"); var x = document.getElementById("prgfw");
x.max=40; x.max=40;
interval = setInterval(function(){ interval = setInterval(function(){
i5=i5+1; i5=i5+1;
var x = document.getElementById("prgfw"); var x = document.getElementById("prgfw");
x.value=i5; x.value=i5;
document.getElementById('counter').innerHTML=41-i5; document.getElementById('counter').innerHTML=41-i5;
if (i5>40) if (i5>40)
{ {
clearInterval(interval); clearInterval(interval);
location.reload(); location.reload();
} }
},1000); },1000);
} }
else alert('Update failed!'); else uploadError()
} else alert('An error occurred!'); } else uploadError()
}; };
xmlhttp.send(formData); xmlhttpupload.send(formData);
} }
function RL(){ function RL(){
document.getElementById('loginpage').style.display='block'; document.getElementById('loginpage').style.display='block';
} }

View File

@ -31,7 +31,7 @@
#define WIFI_FEATURE #define WIFI_FEATURE
//ETH_FEATURE : enable Ethernet function //ETH_FEATURE : enable Ethernet function
#define ETH_FEATURE //#define ETH_FEATURE
//BLUETOOTH_FEATURE : enable BT Serial function //BLUETOOTH_FEATURE : enable BT Serial function
//#define BLUETOOTH_FEATURE //#define BLUETOOTH_FEATURE
@ -50,7 +50,7 @@
//OLED_I2C_SSDSH1106 2 //OLED_I2C_SSDSH1106 2
//TFT_SPI_ILI9341_320X240 3 //TFT_SPI_ILI9341_320X240 3
//TFT_SPI_ILI9488_480X320 4 //TFT_SPI_ILI9488_480X320 4
#define DISPLAY_DEVICE TFT_SPI_ILI9488_480X320 //#define DISPLAY_DEVICE TFT_SPI_ILI9488_480X320
//UI_TYPE_BASIC 1 //UI_TYPE_BASIC 1
//UI_TYPE_ADVANCED 2 //UI_TYPE_ADVANCED 2
@ -109,13 +109,13 @@
//ESP_SPIFFS_FILESYSTEM 0 //ESP_SPIFFS_FILESYSTEM 0
//ESP_FAT_FILESYSTEM 1 //ESP_FAT_FILESYSTEM 1
//ESP_LITTLEFS_FILESYSTEM 2 //Not Yet implemented //ESP_LITTLEFS_FILESYSTEM 2 //Not Yet implemented
#define FILESYSTEM_FEATURE ESP_FAT_FILESYSTEM #define FILESYSTEM_FEATURE ESP_SPIFFS_FILESYSTEM
//DIRECT_PIN_FEATURE: allow to access pin using ESP201 command //DIRECT_PIN_FEATURE: allow to access pin using ESP201 command
#define DIRECT_PIN_FEATURE #define DIRECT_PIN_FEATURE
//TIMESTAMP_FEATURE: set time system //TIMESTAMP_FEATURE: set time system
//#define TIMESTAMP_FEATURE #define TIMESTAMP_FEATURE
//FILESYSTEM_TIMESTAMP_FEATURE: allow to get last write time from FILESYSTEM files //FILESYSTEM_TIMESTAMP_FEATURE: allow to get last write time from FILESYSTEM files
//#define FILESYSTEM_TIMESTAMP_FEATURE //#define FILESYSTEM_TIMESTAMP_FEATURE

View File

@ -316,8 +316,8 @@ bool Commands::execute_internal_command (int cmd, const char* cmd_params, level_
break; break;
#endif //TELNET_FEATURE #endif //TELNET_FEATURE
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
//Init / Get current time //Sync / Set / Get current time
//[ESP140]<INIT> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password> //[ESP140]<SYNC> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password>
case 140: case 140:
response = ESP140(cmd_params, auth_type, output); response = ESP140(cmd_params, auth_type, output);
break; break;
@ -381,6 +381,11 @@ bool Commands::execute_internal_command (int cmd, const char* cmd_params, level_
break; break;
#endif //BUZZER_DEVICE #endif //BUZZER_DEVICE
#endif //DISPLAY_DEVICE #endif //DISPLAY_DEVICE
//Delay command
//[ESP290]<delay in ms>[pwd=<user password>]
case 290:
response = ESP290(cmd_params, auth_type, output);
break;
//Get full ESP3D settings //Get full ESP3D settings
//[ESP400]<pwd=admin> //[ESP400]<pwd=admin>
case 400: case 400:
@ -451,8 +456,9 @@ bool Commands::execute_internal_command (int cmd, const char* cmd_params, level_
#endif //FILESYSTEM_FEATURE #endif //FILESYSTEM_FEATURE
//Get fw version firmare target and fw version //Get fw version firmare target and fw version
//eventually set time with pc time
//output is JSON or plain text according parameter //output is JSON or plain text according parameter
//[ESP800]<plain> //[ESP800]<plain><time=YYYY-MM-DD-HH-MM-SS>
case 800: case 800:
response = ESP800(cmd_params, auth_type, output); response = ESP800(cmd_params, auth_type, output);
break; break;

View File

@ -90,6 +90,7 @@ public:
#ifdef DHT_DEVICE #ifdef DHT_DEVICE
bool ESP210(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output); bool ESP210(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output);
#endif //DHT_DEVICE #endif //DHT_DEVICE
bool ESP290(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output);
bool ESP400(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output); bool ESP400(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output);
bool ESP401(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output); bool ESP401(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output);
#if defined (WIFI_FEATURE) #if defined (WIFI_FEATURE)

View File

@ -98,7 +98,7 @@ private:
static uint8_t _outputflags; static uint8_t _outputflags;
}; };
class ESP3DGlobalOutput class ESP3DGlobalOutput
{ {
public: public:
static void SetStatus(const char * status); static void SetStatus(const char * status);

View File

@ -22,12 +22,7 @@
#include "../commands.h" #include "../commands.h"
#include "../esp3doutput.h" #include "../esp3doutput.h"
#include "../settings_esp3d.h" #include "../settings_esp3d.h"
#if defined (WIFI_FEATURE) #include "../../modules/network/netconfig.h"
#include "../../modules/wifi/wificonfig.h"
#endif //WIFI_FEATURE
#if defined (ETH_FEATURE)
#include "../../modules/ethernet/ethconfig.h"
#endif //ETH_FEATURE
#include "../../modules/authentication/authentication_service.h" #include "../../modules/authentication/authentication_service.h"
//Get current IP //Get current IP
//[ESP111] //[ESP111]
@ -36,24 +31,8 @@ bool Commands::ESP111(const char* cmd_params, level_authenticate_type auth_type,
bool response = true; bool response = true;
String parameter; String parameter;
String res = get_param (cmd_params, ""); String res = get_param (cmd_params, "");
String currentIP="";
(void)auth_type; (void)auth_type;
#if defined( WIFI_FEATURE) res += NetConfig::localIP();
if (WiFi.getMode() == WIFI_STA) {
currentIP = WiFi.localIP().toString();
} else if (WiFi.getMode() == WIFI_AP) {
currentIP = WiFi.softAPIP().toString();
}
#endif //WIFI_FEATURE
#if defined (ETH_FEATURE)
if (EthConfig::started()) {
currentIP = ETH.localIP().toString();
}
#endif //ETH_FEATURE
if (currentIP.length() == 0) {
currentIP = "0.0.0.0";
}
res += currentIP;
//log_esp3d("Client %d", output->client()); //log_esp3d("Client %d", output->client());
output->printMSG (res.c_str()); output->printMSG (res.c_str());
return response; return response;

View File

@ -24,8 +24,8 @@
#include "../settings_esp3d.h" #include "../settings_esp3d.h"
#include "../../modules/authentication/authentication_service.h" #include "../../modules/authentication/authentication_service.h"
#include "../../modules/time/time_server.h" #include "../../modules/time/time_server.h"
//Init / Get current time //Sync / Set / Get current time
//[ESP140]<INIT> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password> //[ESP140]<SYNC> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password>
bool Commands::ESP140(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output) bool Commands::ESP140(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output)
{ {
bool response = true; bool response = true;
@ -84,13 +84,20 @@ bool Commands::ESP140(const char* cmd_params, level_authenticate_type auth_type,
output->printMSG("Setting time"); output->printMSG("Setting time");
if(!timeserver.setTime(s.c_str())) { if(!timeserver.setTime(s.c_str())) {
output->printERROR("Set time failed!"); output->printERROR("Set time failed!");
response = false;
} }
} }
if (hastag(parameter.c_str(), "INIT")) { if (hastag(parameter.c_str(), "SYNC")) {
output->printMSG("Contacting time servers"); if (timeserver.is_internet_time()) {
if(!timeserver.begin()) { output->printMSG("Contacting time servers");
output->printERROR("Init time failed!"); if(!timeserver.begin()) {
output->printERROR("Init time failed!");
response = false;
}
} else {
output->printERROR("Time is manual!");
response = false;
} }
} }
} }

View File

@ -46,8 +46,8 @@ bool Commands::ESP216(const char* cmd_params, level_authenticate_type auth_type,
} else { //set } else { //set
parameter.toUpperCase(); parameter.toUpperCase();
if (parameter == "SNAP") { if (parameter == "SNAP") {
output->printMSG("Creating snapshot"); output->printMSG("Creating snapshot");
if(esp3d_display.snapshot()){ if(esp3d_display.snapshot()) {
output->printMSG("Snapshot saved"); output->printMSG("Snapshot saved");
} else { } else {
output->printERROR("Error!"); output->printERROR("Error!");

View File

@ -0,0 +1,46 @@
/*
ESP290.cpp - ESP3D command class
Copyright (c) 2014 Luc Lebosse. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "../../include/esp3d_config.h"
#include "../commands.h"
#include "../../modules/authentication/authentication_service.h"
#include "../esp3doutput.h"
//Delay command
//[ESP290]<delay in ms>[pwd=<user password>]
bool Commands::ESP290(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output)
{
bool response = true;
String parameter;
#ifdef AUTHENTICATION_FEATURE
if (auth_type == LEVEL_GUEST) {
output->printERROR("Wrong authentication!", 401);
return false;
}
#else
(void)auth_type;
#endif //AUTHENTICATION_FEATURE
parameter = get_param (cmd_params, "");
//get time
if (parameter.length() != 0) {
output->printMSG ("Pause");
Hal::wait(parameter.toInt());
}
output->printMSG ("ok");
return response;
}

View File

@ -191,38 +191,7 @@ bool Commands::ESP400(const char* cmd_params, level_authenticate_type auth_type,
} }
output->printLN ("]}"); output->printLN ("]}");
#endif //WIFI_FEATURE #endif //WIFI_FEATURE
//15 - AP Network Mode (PHY)
//output->print (",{\"F\":\"network\",\"P\":\"");
//output->print (ESP_AP_PHY_MODE);
//output->print ("\",\"T\":\"B\",\"V\":\"");
//output->print (Settings_ESP3D::read_byte(ESP_AP_PHY_MODE));
//output->print ("\",\"H\":\"AP Network Mode\",\"O\":[{\"11b\":\"");
//output->print (WIFI_PHY_MODE_11B);
//output->print ("\"},{\"11g\":\"");
//output->print (WIFI_PHY_MODE_11G);
//output->printLN ("\"}]}");
//16-AP Authentication
//output->print (",{\"F\":\"network\",\"P\":\"");
//output->print (ESP_AP_AUTH_TYPE);
//output->print ("\",\"T\":\"B\",\"V\":\"");
//output->print (Settings_ESP3D::read_byte(ESP_AP_AUTH_TYPE));
//output->print ("\",\"H\":\"Authentication\",\"O\":[{\"Open\":\"");
//output->print (AUTH_OPEN);
//output->print ("\"},{\"WPA\":\"");
//output->print (AUTH_WPA_PSK);
//output->print ("\"},{\"WPA2\":\"");
//output->print (AUTH_WPA2_PSK);
//output->print ("\"},{\"WPA/WPA2\":\"");
//output->print (AUTH_WPA_WPA2_PSK);
//output->printLN ("\"}]}");
//17-AP SSID visibility
//output->print (",{\"F\":\"network\",\"P\":\"");
//output->print (ESP_SSID_VISIBLE);
//output->print ("\",\"T\":\"B\",\"V\":\"");
//output->print (Settings_ESP3D::read_byte(ESP_SSID_VISIBLE));
//output->printLN ("\",\"H\":\"SSID Visible\",\"O\":[{\"No\":\"0\"},{\"Yes\":\"1\"}]}");
#ifdef HTTP_FEATURE #ifdef HTTP_FEATURE
//18-HTTP On //18-HTTP On
output->print (",{\"F\":\"network\",\"P\":\""); output->print (",{\"F\":\"network\",\"P\":\"");
@ -288,7 +257,15 @@ bool Commands::ESP400(const char* cmd_params, level_authenticate_type auth_type,
#endif //AUTHENTICATION_FEATURE #endif //AUTHENTICATION_FEATURE
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
//24-Time zone
//24a-Time zone
output->print (",{\"F\":\"network\",\"P\":\"");
output->print (ESP_INTERNET_TIME);
output->print("\",\"T\":\"B\",\"V\":\"");
output->print ((int8_t)Settings_ESP3D::read_byte(ESP_INTERNET_TIME));
output->printLN("\",\"H\":\"Internet Time\",\"O\":[{\"No\":\"0\"},{\"Yes\":\"1\"}]}");
//24b-Time zone
output->print (",{\"F\":\"network\",\"P\":\""); output->print (",{\"F\":\"network\",\"P\":\"");
output->print (ESP_TIMEZONE); output->print (ESP_TIMEZONE);
output->print("\",\"T\":\"B\",\"V\":\""); output->print("\",\"T\":\"B\",\"V\":\"");
@ -301,6 +278,7 @@ bool Commands::ESP400(const char* cmd_params, level_authenticate_type auth_type,
output->printf("{\"%d\":\"%d\"}", i, i); output->printf("{\"%d\":\"%d\"}", i, i);
} }
output->printLN("]}"); output->printLN("]}");
//25- DST //25- DST
output->print (",{\"F\":\"network\",\"P\":\""); output->print (",{\"F\":\"network\",\"P\":\"");
output->print (ESP_TIME_IS_DST); output->print (ESP_TIME_IS_DST);

View File

@ -28,6 +28,9 @@
#ifdef BUZZER_DEVICE #ifdef BUZZER_DEVICE
#include "../../modules/buzzer/buzzer.h" #include "../../modules/buzzer/buzzer.h"
#endif //BUZZER_DEVICE #endif //BUZZER_DEVICE
#ifdef TIMESTAMP_FEATURE
#include "../../modules/time/time_server.h"
#endif //TIMESTAMP_FEATURE
//Set EEPROM setting //Set EEPROM setting
//[ESP401]P=<position> T=<type> V=<value> pwd=<user/admin password> //[ESP401]P=<position> T=<type> V=<value> pwd=<user/admin password>
bool Commands::ESP401(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output) bool Commands::ESP401(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output)
@ -64,6 +67,11 @@ bool Commands::ESP401(const char* cmd_params, level_authenticate_type auth_type,
case ESP_TARGET_FW: case ESP_TARGET_FW:
Settings_ESP3D::GetFirmwareTarget(true); Settings_ESP3D::GetFirmwareTarget(true);
break; break;
#ifdef TIMESTAMP_FEATURE
case ESP_INTERNET_TIME:
timeserver.begin();
break;
#endif //TIMESTAMP_FEATURE
#ifdef DHT_DEVICE #ifdef DHT_DEVICE
case ESP_DHT_TYPE: case ESP_DHT_TYPE:
esp3d_DHT.begin(); esp3d_DHT.begin();

View File

@ -35,9 +35,13 @@
#ifdef HTTP_FEATURE #ifdef HTTP_FEATURE
#include "../../modules/http/http_server.h" #include "../../modules/http/http_server.h"
#endif //HTTP_FEATURE #endif //HTTP_FEATURE
#ifdef TIMESTAMP_FEATURE
#include "../../modules/time/time_server.h"
#endif //TIMESTAMP_FEATURE
//get fw version firmare target and fw version //get fw version firmare target and fw version
//eventually set time with pc time
//output is JSON or plain text according parameter //output is JSON or plain text according parameter
//[ESP800]<plain> //[ESP800]<plain><time=YYYY-MM-DD-HH-MM-SS>
bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output) bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output)
{ {
bool response = true; bool response = true;
@ -51,6 +55,19 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
(void)auth_type; (void)auth_type;
#endif //AUTHENTICATION_FEATURE #endif //AUTHENTICATION_FEATURE
bool plain = hastag(cmd_params,"plain"); bool plain = hastag(cmd_params,"plain");
#ifdef TIMESTAMP_FEATURE
String newtime = get_param (cmd_params, "time=");
String tparm = (timeserver.is_internet_time())?"Auto":"Manual";
if (!timeserver.is_internet_time() && (newtime.length() > 0)) {
if (!timeserver.setTime(newtime.c_str())) {
tparm="Failed to set";
}
} else {
if (!timeserver.is_internet_time() && (newtime.length() == 0)) {
tparm="Not set";
}
}
#endif //TIMESTAMP_FEATURE
//FW version //FW version
if (plain) { if (plain) {
output->print("FW version:"); output->print("FW version:");
@ -123,6 +140,18 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
#else #else
output->print("Synchronous"); output->print("Synchronous");
#endif //ASYNCWEBSERVER_FEATURE #endif //ASYNCWEBSERVER_FEATURE
if(plain) {
output->printLN("");
} else {
output->print("\"");
}
//WebSocket IP
if (plain) {
output->print("Web Socket IP:");
} else {
output->print(",\"WebSocketIP\":\"");
}
output->print(NetConfig::localIP().c_str());
if(plain) { if(plain) {
output->printLN(""); output->printLN("");
} else { } else {
@ -134,12 +163,17 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
} else { } else {
output->print(",\"WebSocketport\":\""); output->print(",\"WebSocketport\":\"");
} }
#if defined (ASYNCWEBSERVER_FEATURE)
output->print(HTTP_Server::port());
#else
output->print(HTTP_Server::port() +1); output->print(HTTP_Server::port() +1);
#endif
if(plain) { if(plain) {
output->printLN(""); output->printLN("");
} else { } else {
output->print("\""); output->print("\"");
} }
#endif // (WIFI_FEATURE) || ETH_FEATURE) && HTTP_FEATURE) #endif // (WIFI_FEATURE) || ETH_FEATURE) && HTTP_FEATURE)
#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) || defined(BT_FEATURE) #if defined(WIFI_FEATURE) || defined(ETH_FEATURE) || defined(BT_FEATURE)
//Hostname //Hostname
@ -206,6 +240,22 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
} else { } else {
output->print("\""); output->print("\"");
} }
//time server
if (plain) {
output->print("Time:");
} else {
output->print(",\"Time\":\"");
}
#ifdef TIMESTAMP_FEATURE
output->print(tparm.c_str());
#else
output->print("None");
#endif //TIMESTAMP_FEATURE
if(plain) {
output->printLN("");
} else {
output->print("\"");
}
//final //final
if(!plain) { if(!plain) {

View File

@ -84,16 +84,16 @@ void Hal::toneESP(uint8_t pin, unsigned int frequency, unsigned int duration, bo
tone(pin, frequency, duration); tone(pin, frequency, duration);
#endif //ARDUINO_ARCH_ESP8266 #endif //ARDUINO_ARCH_ESP8266
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
int channel = getAnalogWriteChannel(pin); int channel = getAnalogWriteChannel(pin);
if (channel != -1){ if (channel != -1) {
ledcAttachPin(pin, channel); ledcAttachPin(pin, channel);
ledcWriteTone(channel,frequency); ledcWriteTone(channel,frequency);
if (sync) { if (sync) {
wait(duration); wait(duration);
ledcWriteTone(pin,0); ledcWriteTone(pin,0);
}
} }
}
#endif //ARDUINO_ARCH_ESP32 #endif //ARDUINO_ARCH_ESP32
} }
void Hal::no_tone(uint8_t pin) void Hal::no_tone(uint8_t pin)
@ -103,7 +103,7 @@ void Hal::no_tone(uint8_t pin)
#endif //ARDUINO_ARCH_ESP8266 #endif //ARDUINO_ARCH_ESP8266
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
int channel = getAnalogWriteChannel(pin); int channel = getAnalogWriteChannel(pin);
if (channel != -1){ if (channel != -1) {
ledcWrite(channel, 0); ledcWrite(channel, 0);
} }
#endif //ARDUINO_ARCH_ESP32 #endif //ARDUINO_ARCH_ESP32
@ -130,10 +130,10 @@ int Hal::getAnalogWriteChannel(uint8_t pin)
for (uint8_t p = 0; p < 16; p++) { for (uint8_t p = 0; p < 16; p++) {
if(ChannelAttached2Pin[p] == -1) { if(ChannelAttached2Pin[p] == -1) {
ChannelAttached2Pin[p] = pin; ChannelAttached2Pin[p] = pin;
return p; return p;
} }
} }
return -1; return -1;
} }
#endif //ARDUINO_ARCH_ESP32 #endif //ARDUINO_ARCH_ESP32

View File

@ -78,6 +78,9 @@
#ifdef BUZZER_DEVICE #ifdef BUZZER_DEVICE
#define DEFAULT_BUZZER_STATE 1 #define DEFAULT_BUZZER_STATE 1
#endif //BUZZER_DEVICE #endif //BUZZER_DEVICE
#ifdef TIMESTAMP_FEATURE
#define DEFAULT_INTERNET_TIME 0
#endif //TIMESTAMP_FEATURE
#define DEFAULT_ESP_BYTE 0 #define DEFAULT_ESP_BYTE 0
#define DEFAULT_ESP_STRING_SIZE 0 #define DEFAULT_ESP_STRING_SIZE 0
@ -221,6 +224,11 @@ uint8_t Settings_ESP3D::get_default_byte_value(int pos)
case ESP_RADIO_MODE: case ESP_RADIO_MODE:
res = DEFAULT_ESP_RADIO_MODE; res = DEFAULT_ESP_RADIO_MODE;
break; break;
#ifdef TIMESTAMP_FEATURE
case ESP_INTERNET_TIME:
res = DEFAULT_INTERNET_TIME;
break;
#endif //TIMESTAMP_FEATURE
#ifdef BUZZER_DEVICE #ifdef BUZZER_DEVICE
case ESP_BUZZER: case ESP_BUZZER:
res = DEFAULT_BUZZER_STATE; res = DEFAULT_BUZZER_STATE;
@ -1071,6 +1079,8 @@ bool Settings_ESP3D::reset()
#endif //SDCARD_FEATURE #endif //SDCARD_FEATURE
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
//Internet time
Settings_ESP3D::write_byte(ESP_INTERNET_TIME,Settings_ESP3D::get_default_byte_value(ESP_INTERNET_TIME));
//Time Zone //Time Zone
Settings_ESP3D::write_byte(ESP_TIMEZONE,Settings_ESP3D::get_default_byte_value(ESP_TIMEZONE)); Settings_ESP3D::write_byte(ESP_TIMEZONE,Settings_ESP3D::get_default_byte_value(ESP_TIMEZONE));
//Is DST Time Zone //Is DST Time Zone

View File

@ -48,7 +48,7 @@
#define ESP_CALIBRATION 117 //1 byte = flag #define ESP_CALIBRATION 117 //1 byte = flag
#define ESP_AP_CHANNEL 118 //1 byte = flag #define ESP_AP_CHANNEL 118 //1 byte = flag
#define ESP_BUZZER 119 //1 byte = flag #define ESP_BUZZER 119 //1 byte = flag
//#define ESP_SSID_VISIBLE 120 //1 byte = flag #define ESP_INTERNET_TIME 120 //1 byte = flag
#define ESP_HTTP_PORT 121 //4 bytes = int #define ESP_HTTP_PORT 121 //4 bytes = int
#define ESP_TELNET_PORT 125 //4 bytes = int #define ESP_TELNET_PORT 125 //4 bytes = int
#define ESP_OUTPUT_FLAG 129 //1 bytes = flag #define ESP_OUTPUT_FLAG 129 //1 bytes = flag

View File

@ -73,4 +73,19 @@
#define USE_CELSIUS 1 #define USE_CELSIUS 1
#define USE_FAHRENHEIT 2 #define USE_FAHRENHEIT 2
//Errors code
#define ESP_ERROR_AUTHENTICATION 1
#define ESP_ERROR_FILE_CREATION 2
#define ESP_ERROR_FILE_WRITE 3
#define ESP_ERROR_UPLOAD 4
#define ESP_ERROR_NOT_ENOUGH_SPACE 5
#define ESP_ERROR_UPLOAD_CANCELLED 6
#define ESP_ERROR_FILE_CLOSE 7
#define ESP_ERROR_NO_SD 8
#define ESP_ERROR_MOUNT_SD 9
#define ESP_ERROR_RESET_NUMBERING 10
#define ESP_ERROR_BUFFER_OVERFLOW 11
#define ESP_ERROR_START_UPLOAD 12
#define ESP_ERROR_SIZE 13
#endif //_DEFINES_ESP3D_H #endif //_DEFINES_ESP3D_H

View File

@ -22,7 +22,7 @@
#define _VERSION_ESP3D_H #define _VERSION_ESP3D_H
//version and sources location //version and sources location
#define FW_VERSION "3.0.0.a13" #define FW_VERSION "3.0.0.a14"
#define REPOSITORY "https://github.com/luc-github/ESP3D" #define REPOSITORY "https://github.com/luc-github/ESP3D"
#endif //_VERSION_ESP3D_H #endif //_VERSION_ESP3D_H

View File

@ -58,8 +58,8 @@ bool BuzzerDevice::begin()
} }
if (Settings_ESP3D::read_byte(ESP_BUZZER) == 1) { if (Settings_ESP3D::read_byte(ESP_BUZZER) == 1) {
_started = true; _started = true;
playsound(5000, 240); playsound(5000, 240);
playsound(3000, 120); playsound(3000, 120);
} }
return _started; return _started;
} }

View File

@ -94,37 +94,37 @@ Ticker esp_lv_tick; /* timer for interrupt handler */
#define ESP_FLASH_LETTER_DRIVE 'F' #define ESP_FLASH_LETTER_DRIVE 'F'
//#define ESP_SD_LETTER_DRIVE 'S' //#define ESP_SD_LETTER_DRIVE 'S'
//Logo //Logo
LV_IMG_DECLARE(esplogo) LV_IMG_DECLARE(esplogo)
/* Display flushing */ /* Display flushing */
void esp_lv_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) void esp_lv_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{ {
//TODO: need to write version for oled with big resolution //TODO: need to write version for oled with big resolution
uint16_t c; uint16_t c;
esp3d_screen.startWrite(); /* Start new TFT transaction */ esp3d_screen.startWrite(); /* Start new TFT transaction */
esp3d_screen.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1), (area->y2 - area->y1 + 1)); /* set the working window */ esp3d_screen.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1), (area->y2 - area->y1 + 1)); /* set the working window */
for (int y = area->y1; y <= area->y2; y++) { for (int y = area->y1; y <= area->y2; y++) {
for (int x = area->x1; x <= area->x2; x++) { for (int x = area->x1; x <= area->x2; x++) {
c = color_p->full; c = color_p->full;
esp3d_screen.writeColor(c, 1); esp3d_screen.writeColor(c, 1);
#if defined(DISPLAY_SNAPSHOT_FEATURE) #if defined(DISPLAY_SNAPSHOT_FEATURE)
if(bSnapshot) { if(bSnapshot) {
uint32_t data = lv_color_to32(*color_p); uint32_t data = lv_color_to32(*color_p);
fsSnapFile.write((const uint8_t *)(&data), sizeof(uint32_t)); fsSnapFile.write((const uint8_t *)(&data), sizeof(uint32_t));
} }
#endif //DISPLAY_SNAPSHOT_FEATURE #endif //DISPLAY_SNAPSHOT_FEATURE
color_p++; color_p++;
}
} }
} esp3d_screen.endWrite(); /* terminate TFT transaction */
esp3d_screen.endWrite(); /* terminate TFT transaction */ lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
} }
/* Interrupt driven periodic handler */ /* Interrupt driven periodic handler */
static void esp_lv_tick_handler(void) static void esp_lv_tick_handler(void)
{ {
lv_tick_inc(LVGL_TICK_PERIOD); lv_tick_inc(LVGL_TICK_PERIOD);
} }
#if USE_LV_LOG != 0 #if USE_LV_LOG != 0
@ -132,8 +132,8 @@ static void esp_lv_tick_handler(void)
void esp_lv_print(lv_log_level_t level, const char * file, uint32_t line, const char * dsc) void esp_lv_print(lv_log_level_t level, const char * file, uint32_t line, const char * dsc)
{ {
Serial.printf("%s@%d->%s\r\n", file, line, dsc); Serial.printf("%s@%d->%s\r\n", file, line, dsc);
delay(100); delay(100);
} }
#endif #endif
@ -141,21 +141,21 @@ void esp_lv_print(lv_log_level_t level, const char * file, uint32_t line, const
bool esp_lv_touch_read(lv_indev_drv_t * indev, lv_indev_data_t * data) bool esp_lv_touch_read(lv_indev_drv_t * indev, lv_indev_data_t * data)
{ {
// Use TFT_eSPI for touch events // Use TFT_eSPI for touch events
uint8_t bPressed = 0; uint8_t bPressed = 0;
uint16_t nX=0; uint16_t nX=0;
uint16_t nY=0; uint16_t nY=0;
static lv_coord_t last_x = 0; static lv_coord_t last_x = 0;
static lv_coord_t last_y = 0; static lv_coord_t last_y = 0;
if (esp3d_screen.getTouch(&nX,&nY) > 0) { if (esp3d_screen.getTouch(&nX,&nY) > 0) {
last_x = nX; last_x = nX;
last_y = nY; last_y = nY;
data->state = LV_INDEV_STATE_PR; data->state = LV_INDEV_STATE_PR;
} else { } else {
data->state = LV_INDEV_STATE_REL; data->state = LV_INDEV_STATE_REL;
} }
data->point.x = last_x; data->point.x = last_x;
data->point.y = last_y; data->point.y = last_y;
return false; return false;
} }
#endif //DISPLAY_TOUCH_DRIVER #endif //DISPLAY_TOUCH_DRIVER
@ -193,7 +193,9 @@ bool Display::startCalibration()
bool Display::display_network_status(bool force) bool Display::display_network_status(bool force)
{ {
if (esp_lv_network_label == nullptr)return false; if (esp_lv_network_label == nullptr) {
return false;
}
static int sig = -1; static int sig = -1;
bool refresh_signal = false; bool refresh_signal = false;
bool refresh_label = false; bool refresh_label = false;
@ -233,7 +235,7 @@ bool Display::display_network_status(bool force)
} }
if ( force || refresh_signal || refresh_label) { if ( force || refresh_signal || refresh_label) {
String s ; String s ;
if (sig == -1){ if (sig == -1) {
s = LV_SYMBOL_CLOSE; s = LV_SYMBOL_CLOSE;
} else { } else {
s = LV_SYMBOL_WIFI; s = LV_SYMBOL_WIFI;
@ -297,60 +299,60 @@ bool Display::display_network_status(bool force)
bool Display::display_IP(bool force) bool Display::display_IP(bool force)
{ {
if (esp_lv_IP_label != nullptr) { if (esp_lv_IP_label != nullptr) {
bool refresh_label = force; bool refresh_label = force;
static String label; static String label;
#if defined (WIFI_FEATURE) || defined (ETH_FEATURE) || defined (BLUETOOTH_FEATURE) #if defined (WIFI_FEATURE) || defined (ETH_FEATURE) || defined (BLUETOOTH_FEATURE)
if (NetConfig::started()) { if (NetConfig::started()) {
String s; String s;
switch(NetConfig::getMode()) { switch(NetConfig::getMode()) {
#if defined (WIFI_FEATURE) #if defined (WIFI_FEATURE)
case ESP_WIFI_STA: case ESP_WIFI_STA:
s = WiFi.localIP().toString(); s = WiFi.localIP().toString();
break; break;
case ESP_WIFI_AP: case ESP_WIFI_AP:
s = WiFi.softAPIP().toString(); s = WiFi.softAPIP().toString();
break; break;
#endif //WIFI_FEATURE #endif //WIFI_FEATURE
#if defined (ETH_FEATURE) #if defined (ETH_FEATURE)
case ESP_ETH_STA: case ESP_ETH_STA:
s = ETH.localIP().toString(); s = ETH.localIP().toString();
break; break;
#endif //ETH_FEATURE #endif //ETH_FEATURE
#if defined (BLUETOOTH_FEATURE) #if defined (BLUETOOTH_FEATURE)
case ESP_BT: case ESP_BT:
s = bt_service.isConnected()?"Connected":""; s = bt_service.isConnected()?"Connected":"";
break; break;
#endif //BLUETOOTH_FEATURE #endif //BLUETOOTH_FEATURE
default: default:
s=""; s="";
break; break;
} }
if (s!= label) { if (s!= label) {
label = s; label = s;
refresh_label = true; refresh_label = true;
} }
if (refresh_label) { if (refresh_label) {
if (label.length()>0) { if (label.length()>0) {
lv_label_set_text(esp_lv_IP_label, label.c_str()); lv_label_set_text(esp_lv_IP_label, label.c_str());
}
}
} else {
if (label != "") {
lv_label_set_text(esp_lv_IP_label, "");
} }
} }
} else {
if (label != "") {
lv_label_set_text(esp_lv_IP_label, "");
}
}
#endif //WIFI_FEATURE || ETH_FEATURE || BLUETOOTH_FEATURE #endif //WIFI_FEATURE || ETH_FEATURE || BLUETOOTH_FEATURE
return refresh_label; return refresh_label;
} }
return false; return false;
} }
void Display::show_screenID(uint8_t screenID) void Display::show_screenID(uint8_t screenID)
{ {
if (_screenID != screenID){ if (_screenID != screenID) {
#if defined(AUTO_SNAPSHOT_FEATURE) #if defined(AUTO_SNAPSHOT_FEATURE)
if (_screenID != -1){ if (_screenID != -1) {
String s = "/snap" + String(_screenID); String s = "/snap" + String(_screenID);
s+=".bin"; s+=".bin";
snapshot((char *)s.c_str()); snapshot((char *)s.c_str());
@ -359,74 +361,71 @@ void Display::show_screenID(uint8_t screenID)
_screenID = screenID; _screenID = screenID;
clear_screen(); clear_screen();
switch (screenID) { switch (screenID) {
case SPLASH_SCREEN: case SPLASH_SCREEN: {
{ lv_obj_t * img_splash = lv_img_create(esp_lv_screen, NULL);
lv_obj_t * img_splash = lv_img_create(esp_lv_screen, NULL); lv_img_set_src(img_splash, &esplogo);
lv_img_set_src(img_splash, &esplogo); lv_obj_align(img_splash, NULL, LV_ALIGN_CENTER, 0, -20);
lv_obj_align(img_splash, NULL, LV_ALIGN_CENTER, 0, -20); esp_lv_bar_progression = lv_bar_create(esp_lv_screen, NULL);
esp_lv_bar_progression = lv_bar_create(esp_lv_screen, NULL); lv_obj_set_size(esp_lv_bar_progression, 200, 30);
lv_obj_set_size(esp_lv_bar_progression, 200, 30); lv_obj_align(esp_lv_bar_progression, NULL, LV_ALIGN_CENTER, 0, 80);
lv_obj_align(esp_lv_bar_progression, NULL, LV_ALIGN_CENTER, 0, 80); lv_bar_set_range(esp_lv_bar_progression, 0, 90);
lv_bar_set_range(esp_lv_bar_progression, 0, 90); lv_obj_t * labelsplash = lv_label_create(esp_lv_screen, NULL);
lv_obj_t * labelsplash = lv_label_create(esp_lv_screen, NULL); lv_label_set_text(labelsplash, "Please wait...");
lv_label_set_text(labelsplash, "Please wait..."); lv_obj_align(labelsplash, NULL, LV_ALIGN_CENTER, 0, 120);
lv_obj_align(labelsplash, NULL, LV_ALIGN_CENTER, 0, 120); }
} break;
break; case MAIN_SCREEN: {
case MAIN_SCREEN: lv_obj_t * esp_lv_top_container;
{ lv_obj_t * esp_lv_main_container;
lv_obj_t * esp_lv_top_container; lv_obj_t * esp_lv_bottom_container;
lv_obj_t * esp_lv_main_container; //top
lv_obj_t * esp_lv_bottom_container; esp_lv_top_container = lv_obj_create(esp_lv_screen, NULL);
//top lv_obj_set_pos(esp_lv_top_container, 0,-10);
esp_lv_top_container = lv_obj_create(esp_lv_screen, NULL); lv_obj_set_size(esp_lv_top_container, SCREEN_WIDTH, 40);
lv_obj_set_pos(esp_lv_top_container, 0,-10); lv_obj_set_style(esp_lv_top_container, &lv_style_pretty_color);
lv_obj_set_size(esp_lv_top_container, SCREEN_WIDTH, 40);
lv_obj_set_style(esp_lv_top_container, &lv_style_pretty_color); esp_lv_IP_label = lv_label_create(esp_lv_top_container, NULL);
lv_label_set_text(esp_lv_IP_label, "0.0.0.0");
esp_lv_IP_label = lv_label_create(esp_lv_top_container, NULL); lv_obj_align(esp_lv_IP_label, NULL, LV_ALIGN_IN_LEFT_MID, 10,+5);
lv_label_set_text(esp_lv_IP_label, "0.0.0.0"); display_IP(true);
lv_obj_align(esp_lv_IP_label, NULL, LV_ALIGN_IN_LEFT_MID, 10,+5);
display_IP(true); esp_lv_network_label = lv_label_create(esp_lv_top_container, NULL);
lv_label_set_text(esp_lv_network_label, LV_SYMBOL_CLOSE);
esp_lv_network_label = lv_label_create(esp_lv_top_container, NULL); lv_coord_t w = lv_obj_get_width(esp_lv_network_label);
lv_label_set_text(esp_lv_network_label, LV_SYMBOL_CLOSE); lv_obj_set_pos(esp_lv_network_label, SCREEN_WIDTH-w-5,+15);
lv_coord_t w = lv_obj_get_width(esp_lv_network_label); display_network_status(true);
lv_obj_set_pos(esp_lv_network_label, SCREEN_WIDTH-w-5,+15);
display_network_status(true); //main window
esp_lv_main_container = lv_obj_create(esp_lv_screen, NULL);
//main window lv_obj_set_pos(esp_lv_main_container, 0,30);
esp_lv_main_container = lv_obj_create(esp_lv_screen, NULL); lv_obj_set_size(esp_lv_main_container, SCREEN_WIDTH, SCREEN_HEIGHT - (2*30));
lv_obj_set_pos(esp_lv_main_container, 0,30); lv_obj_set_style(esp_lv_main_container, &lv_style_scr);
lv_obj_set_size(esp_lv_main_container, SCREEN_WIDTH, SCREEN_HEIGHT - (2*30));
lv_obj_set_style(esp_lv_main_container, &lv_style_scr); //bottom
esp_lv_bottom_container = lv_obj_create(esp_lv_screen, NULL);
//bottom lv_obj_set_pos(esp_lv_bottom_container, 0,SCREEN_HEIGHT-30);
esp_lv_bottom_container = lv_obj_create(esp_lv_screen, NULL); lv_obj_set_size(esp_lv_bottom_container, SCREEN_WIDTH, 40);
lv_obj_set_pos(esp_lv_bottom_container, 0,SCREEN_HEIGHT-30); lv_obj_set_style(esp_lv_bottom_container, &lv_style_pretty_color);
lv_obj_set_size(esp_lv_bottom_container, SCREEN_WIDTH, 40);
lv_obj_set_style(esp_lv_bottom_container, &lv_style_pretty_color); //status label
esp_lv_status_label = lv_label_create(esp_lv_bottom_container, NULL);
//status label lv_label_set_text(esp_lv_status_label, _status.c_str());
esp_lv_status_label = lv_label_create(esp_lv_bottom_container, NULL); lv_obj_align(esp_lv_status_label, NULL, LV_ALIGN_IN_LEFT_MID, 10,-5);
lv_label_set_text(esp_lv_status_label, _status.c_str());
lv_obj_align(esp_lv_status_label, NULL, LV_ALIGN_IN_LEFT_MID, 10,-5); }
break;
} case CALIBRATION_SCREEN: {
break; lv_obj_t * labeltouch = lv_label_create(esp_lv_screen, NULL);
case CALIBRATION_SCREEN: lv_label_set_text(labeltouch, "Touch corners when requested.");
{ lv_obj_align(labeltouch, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_t * labeltouch = lv_label_create(esp_lv_screen, NULL); }
lv_label_set_text(labeltouch, "Touch corners when requested."); break;
lv_obj_align(labeltouch, NULL, LV_ALIGN_CENTER, 0, 0); default:
} break;
break;
default:
break;
} }
} else { } else {
} }
update_screen(true); update_screen(true);
} }
@ -496,7 +495,7 @@ bool Display::begin()
esp_lv_disp_drv.flush_cb = esp_lv_disp_flush; esp_lv_disp_drv.flush_cb = esp_lv_disp_flush;
esp_lv_disp_drv.buffer = &esp_lv_disp_buf; esp_lv_disp_drv.buffer = &esp_lv_disp_buf;
lv_disp_drv_register(&esp_lv_disp_drv); lv_disp_drv_register(&esp_lv_disp_drv);
//Register Flash driver for images //Register Flash driver for images
lv_fs_drv_t esp_lv_flash_drv; /*A driver descriptor*/ lv_fs_drv_t esp_lv_flash_drv; /*A driver descriptor*/
memset(&esp_lv_flash_drv, 0, sizeof(lv_fs_drv_t)); /*Initialization*/ memset(&esp_lv_flash_drv, 0, sizeof(lv_fs_drv_t)); /*Initialization*/
@ -508,9 +507,9 @@ bool Display::begin()
esp_lv_flash_drv.seek_cb = esp_flash_seek; esp_lv_flash_drv.seek_cb = esp_flash_seek;
esp_lv_flash_drv.tell_cb = esp_flash_tell; esp_lv_flash_drv.tell_cb = esp_flash_tell;
lv_fs_drv_register(&esp_lv_flash_drv); lv_fs_drv_register(&esp_lv_flash_drv);
//TODO: Register SD card driver for images //TODO: Register SD card driver for images
#if defined(DISPLAY_LED_PIN) && (DISPLAY_LED_PIN != -1) #if defined(DISPLAY_LED_PIN) && (DISPLAY_LED_PIN != -1)
pinMode(DISPLAY_LED_PIN, OUTPUT); // sets the digital pin as output pinMode(DISPLAY_LED_PIN, OUTPUT); // sets the digital pin as output
digitalWrite(DISPLAY_LED_PIN, HIGH); //switch on the led digitalWrite(DISPLAY_LED_PIN, HIGH); //switch on the led
@ -524,7 +523,7 @@ bool Display::begin()
} }
esp3d_screen.setTouch(calibrationData); esp3d_screen.setTouch(calibrationData);
} }
/*Register the touch pad*/ /*Register the touch pad*/
lv_indev_drv_t esp_lv_indev_drv; lv_indev_drv_t esp_lv_indev_drv;
lv_indev_drv_init(&esp_lv_indev_drv); lv_indev_drv_init(&esp_lv_indev_drv);
@ -538,7 +537,7 @@ bool Display::begin()
lv_theme_set_current(th); lv_theme_set_current(th);
#endif //DISPLAY_UI_COLOR == UI_MONOCHROME #endif //DISPLAY_UI_COLOR == UI_MONOCHROME
/*Initialize the graphics library's tick*/ /*Initialize the graphics library's tick*/
esp_lv_tick.attach_ms(LVGL_TICK_PERIOD, esp_lv_tick_handler); esp_lv_tick.attach_ms(LVGL_TICK_PERIOD, esp_lv_tick_handler);
show_screenID(SPLASH_SCREEN); show_screenID(SPLASH_SCREEN);
res = true; res = true;
@ -569,13 +568,13 @@ void Display::SetStatus(const char * status)
if (esp_lv_status_label != nullptr) { if (esp_lv_status_label != nullptr) {
lv_label_set_text(esp_lv_status_label, status); lv_label_set_text(esp_lv_status_label, status);
update_screen(); update_screen();
} }
} }
void Display::clear_screen(bool force) void Display::clear_screen(bool force)
{ {
//clear all objects on screen //clear all objects on screen
if(esp_lv_screen != nullptr){ if(esp_lv_screen != nullptr) {
lv_obj_del(esp_lv_screen); lv_obj_del(esp_lv_screen);
} }
//reset global object //reset global object
@ -583,7 +582,7 @@ void Display::clear_screen(bool force)
esp_lv_bar_progression = nullptr; esp_lv_bar_progression = nullptr;
esp_lv_IP_label = nullptr; esp_lv_IP_label = nullptr;
esp_lv_network_label = nullptr; esp_lv_network_label = nullptr;
//create enpty screen //create enpty screen
esp_lv_screen = lv_obj_create(lv_scr_act(), NULL); esp_lv_screen = lv_obj_create(lv_scr_act(), NULL);
lv_obj_set_pos(esp_lv_screen, 0,0); lv_obj_set_pos(esp_lv_screen, 0,0);
@ -606,7 +605,7 @@ void Display::update_screen(bool force)
lv_task_handler(); lv_task_handler();
if(force) { if(force) {
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 #if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
esp3d_screen.display(); esp3d_screen.display();
#endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 #endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
delay(100); delay(100);
lv_task_handler(); lv_task_handler();
@ -635,25 +634,25 @@ void Display::progress(uint8_t v)
bool Display::snapshot(char * filename) bool Display::snapshot(char * filename)
{ {
bool res = false; bool res = false;
#if defined(DISPLAY_SNAPSHOT_FEATURE) #if defined(DISPLAY_SNAPSHOT_FEATURE)
if(filename) { if(filename) {
fsSnapFile = ESP_FileSystem::open(filename, ESP_FILE_WRITE); fsSnapFile = ESP_FileSystem::open(filename, ESP_FILE_WRITE);
}else { } else {
fsSnapFile = ESP_FileSystem::open(SNAPFILENAME, ESP_FILE_WRITE); fsSnapFile = ESP_FileSystem::open(SNAPFILENAME, ESP_FILE_WRITE);
} }
if (!fsSnapFile) { if (!fsSnapFile) {
return false; return false;
} }
bSnapshot = true; bSnapshot = true;
lv_obj_invalidate(lv_scr_act()); lv_obj_invalidate(lv_scr_act());
lv_refr_now(lv_disp_get_default()); /* Will call our disp_drv.disp_flush function */ lv_refr_now(lv_disp_get_default()); /* Will call our disp_drv.disp_flush function */
bSnapshot = false; bSnapshot = false;
fsSnapFile.close(); fsSnapFile.close();
return true; return true;
#endif //DISPLAY_SNAPSHOT_FEATURE #endif //DISPLAY_SNAPSHOT_FEATURE
return res; return res;
} }
#endif //DISPLAY_DEVICE #endif //DISPLAY_DEVICE

View File

@ -44,7 +44,7 @@
#define FONTCALIBRATION 2 #define FONTCALIBRATION 2
//Positions //Positions
#define SIGNAL_X SCREEN_WIDTH-34 #define SIGNAL_X SCREEN_WIDTH-34
#define SIGNAL_Y 0 #define SIGNAL_Y 0
#define SIGNAL_W 34 #define SIGNAL_W 34
#define SIGNAL_H 16 #define SIGNAL_H 16

View File

@ -1,5 +1,5 @@
/* /*
lv_flash_drv.cpp - ESP3D flash (spiffs/Fat/etc) driver for lvgl lv_flash_drv.cpp - ESP3D flash (spiffs/Fat/etc) driver for lvgl
Copyright (c) 2014 Luc Lebosse. All rights reserved. Copyright (c) 2014 Luc Lebosse. All rights reserved.
@ -25,13 +25,13 @@
#endif #endif
#if FILESYSTEM_FEATURE == ESP_SPIFFS_FILESYSTEM #if FILESYSTEM_FEATURE == ESP_SPIFFS_FILESYSTEM
#include "SPIFFS.h" #include "SPIFFS.h"
#else #else
#if FILESYSTEM_FEATURE == ESP_FAT_FILESYSTEM #if FILESYSTEM_FEATURE == ESP_FAT_FILESYSTEM
#include "FFat.h" #include "FFat.h"
#else #else
#error Unknow FileSystem defined #error Unknow FileSystem defined
#endif #endif
#endif #endif
//Driver wrote based on lvg 6.0.3 documentation //Driver wrote based on lvg 6.0.3 documentation
@ -48,9 +48,13 @@ lv_fs_res_t esp_flash_open(lv_fs_drv_t * drv, void * file_p, const char * fn, lv
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
const char * flags = ""; const char * flags = "";
if(mode == LV_FS_MODE_WR) flags = "w"; if(mode == LV_FS_MODE_WR) {
else if(mode == LV_FS_MODE_RD) flags = "r"; flags = "w";
else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "a"; } else if(mode == LV_FS_MODE_RD) {
flags = "r";
} else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) {
flags = "a";
}
char buf[256]; char buf[256];
sprintf(buf, "/%s", fn); sprintf(buf, "/%s", fn);
File * f= new File(); File * f= new File();
@ -64,8 +68,7 @@ lv_fs_res_t esp_flash_open(lv_fs_drv_t * drv, void * file_p, const char * fn, lv
#endif #endif
if(!(*f)) { if(!(*f)) {
return LV_FS_RES_UNKNOWN; return LV_FS_RES_UNKNOWN;
} } else {
else {
f->seek(0); f->seek(0);
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
ft->fileobjecthandle = f; ft->fileobjecthandle = f;
@ -85,7 +88,7 @@ lv_fs_res_t esp_flash_close(lv_fs_drv_t * drv, void * file_p)
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
if(ft->fileobjecthandle){ if(ft->fileobjecthandle) {
(ft->fileobjecthandle)->close(); (ft->fileobjecthandle)->close();
delete(ft->fileobjecthandle); delete(ft->fileobjecthandle);
ft->fileobjecthandle = nullptr; ft->fileobjecthandle = nullptr;
@ -107,7 +110,7 @@ lv_fs_res_t esp_flash_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
if(ft->fileobjecthandle){ if(ft->fileobjecthandle) {
*br = (ft->fileobjecthandle)->read((uint8_t*)buf,btr); *br = (ft->fileobjecthandle)->read((uint8_t*)buf,btr);
return LV_FS_RES_OK; return LV_FS_RES_OK;
} else { } else {
@ -127,7 +130,7 @@ lv_fs_res_t esp_flash_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos)
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
if(ft->fileobjecthandle){ if(ft->fileobjecthandle) {
(ft->fileobjecthandle)->seek(pos); (ft->fileobjecthandle)->seek(pos);
return LV_FS_RES_OK; return LV_FS_RES_OK;
} else { } else {
@ -147,7 +150,7 @@ lv_fs_res_t esp_flash_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
if(ft->fileobjecthandle){ if(ft->fileobjecthandle) {
*pos_p = (ft->fileobjecthandle)->position(); *pos_p = (ft->fileobjecthandle)->position();
return LV_FS_RES_OK; return LV_FS_RES_OK;
} else { } else {

View File

@ -27,7 +27,7 @@
**********************/ **********************/
typedef struct { typedef struct {
File * fileobjecthandle; File * fileobjecthandle;
}file_t; } file_t;
/********************** /**********************
* PROTOTYPES * PROTOTYPES

View File

@ -145,7 +145,7 @@ size_t ESP_FileSystem::max_update_size()
//Is OTA available ? //Is OTA available ?
if (esp_ota_get_running_partition()) { if (esp_ota_get_running_partition()) {
const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL); const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL);
if (partition){ if (partition) {
flashsize = partition->size; flashsize = partition->size;
} }
} else { } else {

View File

@ -25,383 +25,398 @@
/* Generated by bin2c, do not edit manually */ /* Generated by bin2c, do not edit manually */
/* Contents of file tool.html.gz */ /* Contents of file tool.html.gz */
#define tool_html_gz_size 6005 #define tool_html_gz_size 6244
const unsigned char tool_html_gz[6005] PROGMEM = { const unsigned char tool_html_gz[6244] PROGMEM = {
0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xED, 0x3C, 0x69, 0x77, 0xDB, 0xB6, 0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xED, 0x3C, 0x89, 0x72, 0xDB, 0xC6,
0x96, 0x7F, 0x85, 0x41, 0x4F, 0x2D, 0x71, 0x4C, 0x4A, 0xDC, 0xB4, 0x5B, 0xCA, 0x4B, 0x9B, 0xA4, 0x92, 0xBF, 0x02, 0x4F, 0x2A, 0x26, 0xB1, 0x04, 0x48, 0x1C, 0xBC, 0x29, 0x52, 0xCF, 0x89, 0xED,
0xF5, 0x9C, 0xA4, 0xC9, 0x89, 0x9D, 0x97, 0x99, 0x93, 0xE4, 0xE4, 0x50, 0x22, 0x24, 0x71, 0x42, 0x44, 0x5B, 0xBE, 0x4A, 0x92, 0x9F, 0xF7, 0x95, 0xED, 0x52, 0x81, 0xC4, 0x90, 0xC4, 0x1A, 0x04,
0x91, 0x32, 0x09, 0x59, 0x76, 0x1C, 0xCF, 0x6F, 0x9F, 0x7B, 0x01, 0x90, 0x04, 0xB5, 0x79, 0x69, 0x28, 0x60, 0x68, 0x4A, 0x96, 0xB5, 0xDF, 0xBE, 0xDD, 0x33, 0x03, 0x60, 0xC0, 0x4B, 0x47, 0xFC,
0xDE, 0xBC, 0x7E, 0x68, 0x15, 0x89, 0x24, 0x96, 0x8B, 0xBB, 0x2F, 0x00, 0xDD, 0x93, 0x39, 0x5B, 0x36, 0xD9, 0xAA, 0x44, 0x16, 0x01, 0xCE, 0xD1, 0xD3, 0xD3, 0x77, 0xF7, 0x8C, 0x72, 0x34, 0x67,
0x44, 0xA3, 0x93, 0x39, 0xF5, 0x83, 0xD1, 0x49, 0xC6, 0xAE, 0x23, 0x3A, 0xC2, 0x96, 0x9B, 0x69, 0x8B, 0x70, 0x74, 0x34, 0xA7, 0x9E, 0x3F, 0x3A, 0x4A, 0xD9, 0x75, 0x48, 0x47, 0xD8, 0x72, 0x33,
0x12, 0x33, 0x73, 0xEA, 0x2F, 0xC2, 0xE8, 0xBA, 0x9F, 0xF9, 0x71, 0x66, 0x66, 0x34, 0x0D, 0xA7, 0x8D, 0x23, 0x66, 0x4E, 0xBD, 0x45, 0x10, 0x5E, 0xF7, 0x53, 0x2F, 0x4A, 0xCD, 0x94, 0x26, 0xC1,
0x03, 0x73, 0x91, 0x99, 0x8C, 0x5E, 0x31, 0x33, 0x0B, 0xBF, 0x51, 0xD3, 0x0F, 0xFE, 0x67, 0x95, 0x74, 0x60, 0x2E, 0x52, 0x93, 0xD1, 0x2B, 0x66, 0xA6, 0xC1, 0x37, 0x6A, 0x7A, 0xFE, 0x7F, 0xAF,
0xB1, 0xBE, 0x6D, 0x59, 0x3F, 0x0F, 0xCC, 0x35, 0x1D, 0x7F, 0x0D, 0xD9, 0x9E, 0x5E, 0x0E, 0x0E, 0x52, 0xD6, 0xB7, 0x2D, 0xEB, 0xE7, 0x81, 0xB9, 0xA6, 0xE3, 0x2F, 0x01, 0xDB, 0xD3, 0xCB, 0xC1,
0x5B, 0xE1, 0x71, 0x79, 0x75, 0x3B, 0x4E, 0x82, 0xEB, 0xCA, 0x12, 0xE4, 0x77, 0x1A, 0x5D, 0x52, 0x61, 0x2B, 0x7C, 0x5D, 0x5E, 0xDD, 0x8E, 0x63, 0xFF, 0xBA, 0xB4, 0x04, 0xF9, 0x9D, 0x86, 0x5F,
0x16, 0x4E, 0x7C, 0xED, 0x0F, 0xBA, 0xA2, 0xC4, 0x28, 0x9E, 0x8D, 0x67, 0x69, 0xE8, 0x47, 0x86, 0x29, 0x0B, 0x26, 0x9E, 0xF6, 0x86, 0xAE, 0x28, 0x31, 0xF2, 0xEF, 0xC6, 0xB3, 0x24, 0xF0, 0x42,
0x82, 0x83, 0x02, 0xCB, 0x5B, 0x5E, 0x0D, 0xA2, 0x30, 0xA6, 0xE6, 0x9C, 0x86, 0xB3, 0x39, 0xAC, 0x43, 0xC1, 0x41, 0x81, 0xD5, 0x5C, 0x5E, 0x0D, 0xC2, 0x20, 0xA2, 0xE6, 0x9C, 0x06, 0xB3, 0x39,
0xD5, 0xF0, 0x9C, 0x6E, 0xAB, 0x63, 0x7B, 0xEE, 0x60, 0x92, 0x44, 0x49, 0xDA, 0xFF, 0xC9, 0x75, 0xAC, 0x55, 0x6F, 0x3A, 0xDD, 0x56, 0xC7, 0x6E, 0xBA, 0x83, 0x49, 0x1C, 0xC6, 0x49, 0xFF, 0x27,
0xDD, 0xC1, 0xD8, 0x9F, 0x7C, 0x9D, 0xA5, 0xC9, 0x2A, 0x0E, 0x4C, 0xD9, 0x3A, 0x9D, 0x4E, 0x6F, 0xD7, 0x75, 0x07, 0x63, 0x6F, 0xF2, 0x65, 0x96, 0xC4, 0xAB, 0xC8, 0x37, 0x65, 0xEB, 0x74, 0x3A,
0x99, 0x3F, 0x8E, 0xE8, 0xCD, 0x38, 0x49, 0x03, 0x9A, 0xF6, 0xAD, 0x81, 0xB8, 0x31, 0xB3, 0xA5, 0xBD, 0x65, 0xDE, 0x38, 0xA4, 0x37, 0xE3, 0x38, 0xF1, 0x69, 0xD2, 0xB7, 0x06, 0xE2, 0xC5, 0x4C,
0x3F, 0x09, 0xE3, 0x19, 0x34, 0x2C, 0xFC, 0x2B, 0x73, 0x1D, 0x06, 0x6C, 0xCE, 0x29, 0xB8, 0x65, 0x97, 0xDE, 0x24, 0x88, 0x66, 0xD0, 0xB0, 0xF0, 0xAE, 0xCC, 0x75, 0xE0, 0xB3, 0x39, 0xDF, 0xC1,
0xC1, 0xCD, 0x7A, 0x1E, 0x32, 0xCA, 0x47, 0xD0, 0x7E, 0x9C, 0xAC, 0x53, 0x7F, 0x39, 0x58, 0xFA, 0x2D, 0xF3, 0x6F, 0xD6, 0xF3, 0x80, 0x51, 0x3E, 0x82, 0xF6, 0xA3, 0x78, 0x9D, 0x78, 0xCB, 0xC1,
0x41, 0x80, 0xC3, 0x9D, 0xC5, 0xE2, 0x96, 0xCD, 0x6F, 0x38, 0xF1, 0x7E, 0x14, 0xCE, 0xE2, 0x7E, 0xD2, 0xF3, 0x7D, 0x1C, 0xEE, 0x2C, 0x16, 0xB7, 0x6C, 0x7E, 0xC3, 0x37, 0xEF, 0x85, 0xC1, 0x2C,
0x44, 0xA7, 0xEC, 0xB6, 0xC1, 0x17, 0x19, 0x31, 0xA4, 0x77, 0xC4, 0xD2, 0x11, 0x0B, 0x8C, 0xAD, 0xEA, 0x87, 0x74, 0xCA, 0x6E, 0xEB, 0x7C, 0x91, 0x11, 0xC3, 0xFD, 0x8E, 0x58, 0x32, 0x62, 0xBE,
0xA6, 0x79, 0xD1, 0xC4, 0x85, 0x50, 0x1D, 0x55, 0x34, 0xCD, 0x6F, 0xF2, 0xA5, 0xBA, 0xFB, 0x69, 0xB1, 0xD5, 0x34, 0xCF, 0x9B, 0x38, 0x13, 0xCA, 0xA3, 0xF2, 0xA6, 0xF9, 0x4D, 0xB6, 0x54, 0x77,
0xBE, 0xA4, 0x29, 0xB2, 0x2C, 0x92, 0x28, 0xB0, 0x64, 0x99, 0x93, 0x05, 0xB7, 0x7D, 0x7B, 0x79, 0xFF, 0x9E, 0xBF, 0xD2, 0x04, 0x49, 0x16, 0x4A, 0x14, 0x58, 0xBC, 0xCC, 0xB6, 0x05, 0xAF, 0x7D,
0xA5, 0x65, 0x49, 0x14, 0x06, 0xDA, 0x4F, 0x41, 0x10, 0x48, 0xDC, 0xCC, 0x8C, 0xA5, 0xE1, 0x92, 0x7B, 0x79, 0xA5, 0xA5, 0x71, 0x18, 0xF8, 0xDA, 0x4F, 0xBE, 0xEF, 0x4B, 0xDC, 0xCC, 0x94, 0x25,
0x06, 0x05, 0x42, 0xFD, 0x98, 0xCD, 0xCD, 0x64, 0x6A, 0xB2, 0xEB, 0x25, 0xAD, 0x27, 0x41, 0xA0, 0xC1, 0x92, 0xFA, 0x39, 0x42, 0xFD, 0x88, 0xCD, 0xCD, 0x78, 0x6A, 0xB2, 0xEB, 0x25, 0xAD, 0xC6,
0xDF, 0xEC, 0x60, 0x5F, 0x0F, 0x3F, 0xB7, 0xFE, 0xCD, 0x32, 0xC9, 0x42, 0x16, 0x26, 0x71, 0x3F, 0xBE, 0xAF, 0xDF, 0xEC, 0x20, 0x5F, 0x0F, 0x7F, 0x6E, 0xBD, 0x9B, 0x65, 0x9C, 0x06, 0x2C, 0x88,
0xA5, 0x91, 0xCF, 0xC2, 0x4B, 0x3A, 0x08, 0xC2, 0x6C, 0x19, 0xF9, 0xD7, 0xFD, 0x71, 0x94, 0x4C, 0xA3, 0x7E, 0x42, 0x43, 0x8F, 0x05, 0x5F, 0xE9, 0xC0, 0x0F, 0xD2, 0x65, 0xE8, 0x5D, 0xF7, 0xC7,
0xBE, 0x16, 0xEC, 0x41, 0xA1, 0x6B, 0x76, 0x0B, 0x30, 0xE7, 0x1C, 0x0A, 0xE8, 0x24, 0x49, 0x7D, 0x61, 0x3C, 0xF9, 0x92, 0x93, 0x07, 0x99, 0xAE, 0xD9, 0x2D, 0xC0, 0x9C, 0x53, 0xC8, 0xA7, 0x93,
0x3E, 0x31, 0x4E, 0x62, 0x9A, 0xCB, 0x6A, 0x32, 0x99, 0xDC, 0x36, 0xFC, 0x09, 0xC2, 0xB9, 0x29, 0x38, 0xF1, 0xF8, 0xC4, 0x28, 0x8E, 0x68, 0xC6, 0xAB, 0xC9, 0x64, 0x72, 0x5B, 0xF7, 0x26, 0x08,
0x05, 0xB5, 0x43, 0x7C, 0x96, 0x65, 0xE5, 0x03, 0x35, 0xDF, 0xF0, 0xFB, 0xD3, 0x64, 0xB2, 0xCA, 0xE7, 0xA6, 0x60, 0xD4, 0x0E, 0xF6, 0x59, 0x96, 0x95, 0x0D, 0xD4, 0x3C, 0xC3, 0xEB, 0x4F, 0xE3,
0xE0, 0x3A, 0x4F, 0x80, 0x03, 0xCA, 0xD4, 0xDB, 0xC6, 0xD2, 0x8F, 0x69, 0x74, 0xB3, 0xF0, 0xD3, 0xC9, 0x2A, 0x85, 0xE7, 0x3C, 0x06, 0x0A, 0x28, 0x53, 0x6F, 0xEB, 0x4B, 0x2F, 0xA2, 0xE1, 0xCD,
0x59, 0x18, 0x9B, 0xE3, 0x84, 0xB1, 0x64, 0xD1, 0x77, 0x00, 0x99, 0xDD, 0x3A, 0x21, 0xB9, 0xB5, 0xC2, 0x4B, 0x66, 0x41, 0x64, 0x8E, 0x63, 0xC6, 0xE2, 0x45, 0xDF, 0x01, 0x64, 0x76, 0xCB, 0x84,
0xC1, 0xA9, 0x9C, 0x87, 0xA9, 0x1F, 0x84, 0xAB, 0xAC, 0x8F, 0x3A, 0x97, 0x2B, 0xFB, 0x38, 0xB9, 0xA4, 0xD6, 0x06, 0xA5, 0x32, 0x1A, 0x26, 0x9E, 0x1F, 0xAC, 0xD2, 0x3E, 0xCA, 0x5C, 0x26, 0xEC,
0x32, 0xB3, 0xB9, 0x1F, 0x24, 0xEB, 0xBE, 0xA5, 0xE1, 0x2C, 0xFC, 0xA6, 0xB3, 0xB1, 0x5F, 0xB7, 0xE3, 0xF8, 0xCA, 0x4C, 0xE7, 0x9E, 0x1F, 0xAF, 0xFB, 0x96, 0x86, 0xB3, 0xF0, 0x37, 0x99, 0x8D,
0x0C, 0xFC, 0x34, 0xAC, 0x96, 0x3E, 0xB8, 0xCF, 0x20, 0x89, 0xA9, 0xC9, 0x0D, 0xA3, 0xE0, 0x1A, 0xBD, 0xAA, 0x65, 0xE0, 0x4F, 0xDD, 0x6A, 0xE9, 0x83, 0xFB, 0x0C, 0x92, 0x98, 0x9A, 0x5C, 0x31,
0x30, 0x2C, 0xEF, 0x40, 0x45, 0x80, 0xB6, 0x9B, 0x6D, 0x8E, 0x1E, 0x56, 0xF4, 0x16, 0x7E, 0x72, 0x72, 0xAA, 0x01, 0xC1, 0xB2, 0x0E, 0x14, 0x04, 0x68, 0xBB, 0xD9, 0xA6, 0xE8, 0x61, 0x41, 0x6F,
0x0A, 0x64, 0xA3, 0x42, 0x13, 0xE8, 0x85, 0x99, 0xA2, 0x1A, 0xE5, 0xD4, 0xB9, 0xC8, 0x9B, 0xB2, 0xE1, 0x4F, 0xB6, 0x03, 0xD9, 0xA8, 0xEC, 0x09, 0xE4, 0xC2, 0x4C, 0x50, 0x8C, 0xB2, 0xDD, 0xB9,
0x0F, 0xB5, 0x78, 0x47, 0x97, 0xE4, 0xE4, 0xA6, 0x46, 0x4D, 0x93, 0x74, 0x01, 0x8B, 0xC4, 0x2C, 0x48, 0x9B, 0xA2, 0x0F, 0xA5, 0x78, 0x47, 0x97, 0xA4, 0xE4, 0xA6, 0x44, 0x4D, 0xE3, 0x64, 0x01,
0x4D, 0xA2, 0x9B, 0xAA, 0x26, 0x08, 0x4B, 0xF2, 0x57, 0x2C, 0x19, 0x48, 0xBD, 0x75, 0x91, 0x91, 0x8B, 0x44, 0x2C, 0x89, 0xC3, 0x9B, 0xB2, 0x24, 0x08, 0x4D, 0xF2, 0x56, 0x2C, 0x1E, 0x48, 0xB9,
0x39, 0x39, 0x6D, 0xA4, 0xC6, 0x81, 0x86, 0x07, 0x19, 0x77, 0xAB, 0xD5, 0xDA, 0x27, 0xC8, 0xB2, 0x75, 0x91, 0x90, 0xD9, 0x76, 0xDA, 0xB8, 0x1B, 0x07, 0x1A, 0x1E, 0xA4, 0xDC, 0xAD, 0x56, 0x6B,
0x35, 0x5C, 0xF8, 0x33, 0x2A, 0xF4, 0x6C, 0x5B, 0xBC, 0xA0, 0x72, 0xF7, 0x13, 0x6F, 0x18, 0x67, 0x1F, 0x23, 0x8B, 0xD6, 0x60, 0xE1, 0xCD, 0xA8, 0x90, 0xB3, 0x6D, 0xF6, 0x82, 0xC8, 0xDD, 0x8F,
0x94, 0x69, 0x7B, 0xE4, 0xD7, 0xA9, 0x4A, 0xF9, 0xCE, 0xB1, 0x66, 0x62, 0xB2, 0x14, 0x1C, 0x9A, 0xBD, 0x41, 0x94, 0x52, 0xA6, 0xED, 0xE1, 0x5F, 0xA7, 0xCC, 0xE5, 0x3B, 0xC7, 0x9A, 0xB1, 0xC9,
0xB0, 0x1D, 0x55, 0x38, 0x1A, 0xF5, 0x33, 0x6A, 0x82, 0xAE, 0x26, 0x2B, 0xA6, 0x35, 0xEC, 0x56, 0x12, 0x30, 0x68, 0x42, 0x77, 0x54, 0xE6, 0x68, 0xD4, 0x4B, 0xA9, 0x09, 0xB2, 0x1A, 0xAF, 0x98,
0x66, 0x94, 0x70, 0xB7, 0xFA, 0xAA, 0x0C, 0x17, 0x56, 0x70, 0x53, 0x15, 0x75, 0xBB, 0xED, 0x4F, 0x56, 0xB7, 0x5B, 0xA9, 0x51, 0xC0, 0xDD, 0xEA, 0x2B, 0x13, 0x5C, 0x68, 0xC1, 0x4D, 0x99, 0xD5,
0x69, 0x6F, 0x00, 0x33, 0x90, 0x93, 0xE0, 0xD5, 0x1E, 0x41, 0x9A, 0x61, 0x41, 0x67, 0x37, 0xEF, 0xED, 0xB6, 0x37, 0xA5, 0xBD, 0x01, 0xCC, 0x40, 0x4A, 0x82, 0x55, 0x7B, 0xC4, 0xD6, 0x0C, 0x0B,
0xB0, 0x2D, 0xC7, 0xB0, 0x3B, 0x2D, 0xC3, 0x71, 0x5D, 0xA3, 0xD1, 0xD6, 0x25, 0x0E, 0xC8, 0xEB, 0x3A, 0xBB, 0x59, 0x87, 0x6D, 0x39, 0x86, 0xDD, 0x69, 0x19, 0x8E, 0xEB, 0x1A, 0xF5, 0xB6, 0x2E,
0xE5, 0x86, 0x9D, 0x09, 0xF5, 0x1D, 0xB3, 0xB8, 0x50, 0x85, 0x30, 0xE6, 0xF2, 0x14, 0x1A, 0x51, 0x71, 0x40, 0x5A, 0x2F, 0x37, 0xF4, 0x4C, 0x88, 0xEF, 0x98, 0x45, 0xB9, 0x28, 0x04, 0x11, 0xE7,
0x1D, 0x6C, 0x09, 0xC9, 0xAF, 0x85, 0xA8, 0x3D, 0xCB, 0x1A, 0x28, 0xBE, 0x74, 0x42, 0x63, 0x46, 0xA7, 0x90, 0x88, 0xF2, 0x60, 0x4B, 0x70, 0x7E, 0x2D, 0x58, 0xDD, 0xB4, 0xAC, 0x81, 0x62, 0x4B,
0xD3, 0x4D, 0xF7, 0xB6, 0x08, 0x83, 0x20, 0xA2, 0x22, 0x24, 0x25, 0xAB, 0xC9, 0xDC, 0x44, 0x8F, 0x27, 0x34, 0x62, 0x34, 0xD9, 0x34, 0x6F, 0x8B, 0xC0, 0xF7, 0x43, 0x2A, 0x5C, 0x52, 0xBC, 0x9A,
0x00, 0xFC, 0x5C, 0xF8, 0x71, 0xB8, 0x5C, 0x45, 0xDC, 0xBF, 0x0C, 0xF6, 0xF7, 0x4C, 0x56, 0x69, 0xCC, 0x4D, 0xB4, 0x08, 0x40, 0xCF, 0x85, 0x17, 0x05, 0xCB, 0x55, 0xC8, 0xED, 0xCB, 0x60, 0x7F,
0x06, 0x2C, 0x5A, 0x26, 0x21, 0x07, 0x7E, 0x4F, 0x8D, 0xE1, 0x72, 0x5B, 0xFA, 0x29, 0x60, 0x34, 0xCF, 0x64, 0x95, 0xA4, 0x40, 0xA2, 0x65, 0x1C, 0x70, 0xE0, 0xF7, 0x94, 0x18, 0xCE, 0xB7, 0xA5,
0x38, 0x10, 0x0F, 0x1E, 0xA8, 0xCF, 0x3B, 0x54, 0x70, 0x91, 0x7C, 0x33, 0x57, 0x19, 0x46, 0x24, 0x97, 0x00, 0x46, 0x83, 0x03, 0xFE, 0xE0, 0x81, 0xF2, 0xBC, 0x43, 0x04, 0x17, 0xF1, 0x37, 0x73,
0x1A, 0xD1, 0x09, 0x13, 0xE8, 0x20, 0xAD, 0x5B, 0x8D, 0x9B, 0x0D, 0x9C, 0xE7, 0xE6, 0x32, 0x05, 0x95, 0xA2, 0x47, 0xA2, 0x21, 0x9D, 0x30, 0x81, 0x0E, 0xEE, 0x75, 0xAB, 0x71, 0xB3, 0x81, 0xD3,
0x32, 0xD2, 0xEB, 0xC3, 0x8E, 0xD4, 0x75, 0x3B, 0xFE, 0xB8, 0xB3, 0xE1, 0x1E, 0x1C, 0xDA, 0x0E, 0xDC, 0x5C, 0x26, 0xB0, 0x8D, 0xE4, 0xFA, 0xB0, 0x21, 0x75, 0xDD, 0x8E, 0x37, 0xEE, 0x6C, 0x98,
0x7C, 0xAF, 0x02, 0x45, 0x3A, 0x5B, 0xA3, 0xD2, 0x26, 0xBC, 0x6E, 0xA5, 0x89, 0x3B, 0xE0, 0x4A, 0x07, 0x87, 0xB6, 0x7D, 0xAF, 0x59, 0x82, 0x22, 0x8D, 0xAD, 0x51, 0x6A, 0x13, 0x56, 0xB7, 0xD4,
0x53, 0x7F, 0xC7, 0xCC, 0xFE, 0xF6, 0xCC, 0x2D, 0xD7, 0xBD, 0x03, 0x59, 0xA7, 0xDB, 0xB6, 0x7A, 0xC4, 0x0D, 0x70, 0xA9, 0xA9, 0xBF, 0x63, 0x66, 0x7F, 0x7B, 0xE6, 0x96, 0xE9, 0xDE, 0x81, 0xAC,
0xD6, 0x06, 0xB2, 0xB6, 0xE3, 0x8C, 0x3D, 0x8B, 0x23, 0x1B, 0x2E, 0x66, 0x37, 0x52, 0xA8, 0x73, 0xD3, 0x6D, 0x5B, 0x3D, 0x6B, 0x03, 0x59, 0xDB, 0x71, 0xC6, 0x4D, 0x8B, 0x23, 0x1B, 0x2C, 0x66,
0x3F, 0xDE, 0x74, 0xDB, 0xED, 0xC2, 0x7B, 0xA9, 0xF6, 0xCF, 0x83, 0x84, 0x98, 0x2B, 0x51, 0xD8, 0x37, 0x92, 0xA9, 0x73, 0x2F, 0xDA, 0x34, 0xDB, 0xED, 0xDC, 0x7A, 0xA9, 0xFA, 0xCF, 0x9D, 0x84,
0xE1, 0x4F, 0x2C, 0xFC, 0x6C, 0xAC, 0xDB, 0x9E, 0xE0, 0xE7, 0xD1, 0xE6, 0x84, 0xFA, 0x31, 0x4B, 0x98, 0x2B, 0x51, 0xD8, 0x61, 0x4F, 0x2C, 0xFC, 0xD9, 0x58, 0xB7, 0x3D, 0xC1, 0x9F, 0x47, 0xAB,
0xE9, 0xF5, 0x43, 0xDC, 0x46, 0x65, 0x22, 0xC7, 0x9A, 0xA3, 0x79, 0x98, 0x6C, 0xD7, 0x92, 0x46, 0x13, 0xCA, 0xC7, 0x2C, 0xA1, 0xD7, 0x0F, 0x31, 0x1B, 0xA5, 0x89, 0x1C, 0x6B, 0x8E, 0xE6, 0xE1,
0x98, 0x8F, 0xBD, 0x8B, 0xCC, 0x7F, 0x27, 0x45, 0x11, 0x20, 0x05, 0x16, 0xF2, 0xD5, 0x28, 0x6F, 0x6D, 0xBB, 0x96, 0x54, 0xC2, 0x6C, 0xEC, 0x5D, 0xDB, 0xFC, 0x33, 0x77, 0x14, 0x02, 0x52, 0xA0,
0xFB, 0xD5, 0x7C, 0x80, 0x47, 0xFE, 0xB2, 0xB3, 0xA2, 0x35, 0xD8, 0x17, 0xC6, 0xCB, 0x15, 0xFB, 0x21, 0x5F, 0x8C, 0xE2, 0xB5, 0x5F, 0x8E, 0x07, 0xB8, 0xE7, 0x2F, 0x3A, 0x4B, 0x52, 0x83, 0x7D,
0x88, 0xB9, 0xCB, 0x70, 0x1A, 0x46, 0xF4, 0x73, 0xBF, 0x9F, 0xD3, 0x83, 0x8F, 0xE6, 0x6A, 0x19, 0x41, 0xB4, 0x5C, 0xB1, 0x8F, 0x18, 0xBB, 0x0C, 0xA7, 0x41, 0x48, 0x3F, 0xF7, 0xFB, 0xD9, 0x7E,
0x25, 0x7E, 0x60, 0x8E, 0x57, 0xE0, 0x73, 0xFE, 0x76, 0x4B, 0xFF, 0xBF, 0x6E, 0x69, 0x70, 0xD0, 0xF0, 0xAB, 0xB9, 0x5A, 0x86, 0xB1, 0xE7, 0x9B, 0xE3, 0x15, 0xD8, 0x9C, 0xBF, 0xCD, 0xD2, 0xFF,
0xB8, 0x5B, 0xE3, 0x89, 0x15, 0xD0, 0x0D, 0x23, 0xF3, 0xDA, 0xE3, 0x6E, 0xE0, 0x3F, 0x48, 0xA8, 0xAD, 0x59, 0x1A, 0x1C, 0x54, 0xEE, 0xD6, 0x78, 0x62, 0xF9, 0x74, 0x43, 0xC9, 0x9A, 0xED, 0x71,
0x32, 0x0A, 0xFE, 0x2D, 0xDA, 0xBF, 0x8E, 0x68, 0x5D, 0x7B, 0x6C, 0x05, 0x9B, 0x39, 0xA8, 0x3D, 0xD7, 0xF7, 0x1E, 0xC4, 0x54, 0xE9, 0x05, 0xFF, 0x66, 0xED, 0x5F, 0x87, 0xB5, 0xAE, 0x3D, 0xB6,
0x6E, 0x07, 0xDD, 0xD6, 0xC3, 0x44, 0x2B, 0xAC, 0xFD, 0x6F, 0xD1, 0xFE, 0xC5, 0x45, 0xEB, 0xB4, 0xFC, 0xCD, 0x18, 0xD4, 0x1E, 0xB7, 0xFD, 0x6E, 0xEB, 0x61, 0xAC, 0x15, 0xDA, 0xFE, 0x37, 0x6B,
0x7B, 0xFE, 0x78, 0x92, 0x17, 0x2E, 0xD3, 0x24, 0x01, 0x8E, 0x1C, 0xA8, 0x5B, 0xEC, 0x8E, 0xD5, 0xFF, 0xE2, 0xAC, 0x75, 0xDA, 0x3D, 0x6F, 0x3C, 0xC9, 0x12, 0x97, 0x69, 0x1C, 0x03, 0x45, 0x0E,
0xDD, 0x05, 0xFB, 0x1E, 0xA5, 0xCB, 0x56, 0x01, 0xF2, 0x6F, 0x58, 0x72, 0x91, 0x04, 0x7E, 0x59, 0xE4, 0x2D, 0x76, 0xC7, 0xEA, 0xEE, 0x82, 0x7D, 0x8F, 0xD4, 0x65, 0x2B, 0x01, 0xF9, 0x13, 0x96,
0xEC, 0x70, 0x96, 0x15, 0x55, 0xF1, 0x34, 0xBC, 0xA2, 0xC1, 0xE0, 0x1B, 0xE4, 0xEC, 0x01, 0xBD, 0x5C, 0xC4, 0xBE, 0x57, 0x24, 0x3B, 0x9C, 0x64, 0x79, 0x56, 0x3C, 0x0D, 0xAE, 0xA8, 0x3F, 0xF8,
0xC2, 0x6D, 0x04, 0xD0, 0x44, 0x89, 0x95, 0x80, 0x65, 0x61, 0x29, 0x8A, 0x35, 0x16, 0xA8, 0x2C, 0x06, 0x31, 0xBB, 0x4F, 0xAF, 0xB0, 0x8C, 0x00, 0x92, 0x28, 0xB1, 0x12, 0xB0, 0x2C, 0x4C, 0x45,
0x36, 0x58, 0x83, 0x72, 0xC7, 0x21, 0xAF, 0x93, 0xF8, 0x3D, 0x6A, 0xFE, 0x34, 0x82, 0x90, 0xCA, 0x31, 0xC7, 0x02, 0x91, 0xC5, 0x06, 0x6B, 0x50, 0x54, 0x1C, 0xB2, 0x3C, 0x89, 0xBF, 0xA3, 0xE4,
0x2B, 0xA8, 0x9D, 0x15, 0xF1, 0x76, 0xAB, 0x1A, 0x6E, 0x3D, 0x5D, 0xA2, 0xCA, 0xCB, 0x05, 0x50, 0x4F, 0x43, 0x70, 0xA9, 0x3C, 0x83, 0xDA, 0x99, 0x11, 0x6F, 0xB7, 0xAA, 0xEE, 0xB6, 0xA9, 0x4B,
0xB8, 0x9B, 0x3D, 0x55, 0x9E, 0x6D, 0x55, 0x2B, 0xC0, 0x4A, 0x75, 0xA8, 0x76, 0x0A, 0x5B, 0xDB, 0x54, 0x79, 0xBA, 0x00, 0x02, 0x77, 0xB3, 0x27, 0xCB, 0xB3, 0xAD, 0x72, 0x06, 0x58, 0xCA, 0x0E,
0x3B, 0x57, 0x76, 0xEF, 0x9B, 0xDE, 0x77, 0x4A, 0x3E, 0x16, 0x59, 0xA8, 0x52, 0x27, 0x63, 0xBD, 0xD5, 0x4E, 0xA1, 0x6B, 0x7B, 0xE7, 0xCA, 0xEE, 0x7D, 0xD3, 0xFB, 0x4E, 0x41, 0xC7, 0x3C, 0x0A,
0x61, 0xA3, 0xE2, 0x5B, 0x95, 0xAC, 0xC1, 0xD1, 0x07, 0xDB, 0x7B, 0x0E, 0xC2, 0xF8, 0x05, 0x6B, 0x55, 0xF2, 0x64, 0xCC, 0x37, 0x6C, 0x14, 0x7C, 0xAB, 0x14, 0x35, 0x38, 0xFA, 0x60, 0xBB, 0xE6,
0x72, 0xA1, 0xEF, 0x60, 0xC7, 0x4F, 0x53, 0x8A, 0x9F, 0x9C, 0x0F, 0x58, 0x51, 0x2B, 0x5A, 0xE2, 0x20, 0x94, 0x5F, 0x90, 0x26, 0x63, 0xFA, 0x0E, 0x72, 0xFC, 0x34, 0xA5, 0xF8, 0x93, 0xD1, 0x01,
0xC8, 0x05, 0x73, 0x25, 0xE1, 0xD9, 0xD0, 0x4E, 0x25, 0x71, 0xF0, 0xB3, 0xAF, 0x48, 0x7E, 0x20, 0x33, 0x6A, 0x45, 0x4A, 0x1C, 0xB9, 0x60, 0x26, 0x24, 0x3C, 0x1A, 0xDA, 0x29, 0x24, 0x0E, 0xFE,
0xFB, 0x2A, 0xB5, 0xE8, 0x14, 0x3F, 0x39, 0x7A, 0xD5, 0x9D, 0x00, 0x4B, 0x62, 0x97, 0xF7, 0x6E, 0xEC, 0x4B, 0x92, 0x1F, 0x48, 0xBE, 0x52, 0x2E, 0x3A, 0xC5, 0x9F, 0x0C, 0xBD, 0x72, 0x25, 0xC0,
0xAA, 0x78, 0x3B, 0xC7, 0x5E, 0x2A, 0x8D, 0xD7, 0x68, 0xD1, 0xC5, 0xC3, 0x49, 0xD9, 0x46, 0xE7, 0x92, 0xD8, 0x65, 0xBD, 0x9B, 0x22, 0xDE, 0xCE, 0xB0, 0x97, 0x42, 0xD3, 0xAC, 0xB7, 0xE8, 0xE2,
0x4F, 0x4A, 0xFB, 0xB6, 0x31, 0x0F, 0x03, 0xFA, 0x25, 0x64, 0x15, 0x0B, 0xB9, 0xFD, 0xC7, 0x82, 0xE1, 0x5B, 0xD9, 0x46, 0xE7, 0x0F, 0x72, 0xFB, 0xB6, 0x3E, 0x0F, 0x7C, 0x7A, 0x11, 0xB0, 0x92,
0x06, 0xA1, 0xAF, 0xD5, 0x17, 0xE0, 0xB3, 0x85, 0xC6, 0x77, 0xDA, 0x20, 0x71, 0xFD, 0x66, 0x43, 0x86, 0xDC, 0xFE, 0x63, 0x41, 0xFD, 0xC0, 0xD3, 0xAA, 0x0B, 0xB0, 0xD9, 0x42, 0xE2, 0x3B, 0x6D,
0x47, 0x45, 0x5F, 0xAB, 0x8B, 0x90, 0xF2, 0x49, 0xD9, 0x24, 0xA5, 0x34, 0xD6, 0x20, 0xD5, 0x85, 0xE0, 0xB8, 0x7E, 0xB3, 0x21, 0xA3, 0xA2, 0xAF, 0xD5, 0x45, 0x48, 0xD9, 0xA4, 0x74, 0x92, 0x50,
0xF9, 0xC5, 0x1E, 0x5D, 0xA7, 0xDD, 0xD9, 0x3B, 0x9F, 0xEF, 0xDF, 0xDD, 0x9E, 0x34, 0xC5, 0xF6, 0x1A, 0x69, 0x10, 0xEA, 0xC2, 0xFC, 0xBC, 0x46, 0xD7, 0x69, 0x77, 0xF6, 0xCE, 0xE7, 0xF5, 0xBB,
0xE6, 0x09, 0x0B, 0x19, 0x5C, 0x5E, 0x9C, 0xBD, 0x75, 0x9F, 0x6B, 0x2C, 0x49, 0x22, 0x6D, 0x09, 0xDB, 0xA3, 0x86, 0x28, 0x6F, 0x1E, 0xB1, 0x80, 0xC1, 0xE3, 0xC5, 0xD9, 0x3B, 0xF7, 0xB9, 0xC6,
0x1E, 0xFA, 0xA4, 0x29, 0x9A, 0x4F, 0x9A, 0x62, 0x2B, 0x94, 0xEF, 0x86, 0x9D, 0x04, 0xE1, 0xA5, 0xE2, 0x38, 0xD4, 0x96, 0x60, 0xA1, 0x8F, 0x1A, 0xA2, 0xF9, 0xA8, 0x21, 0x4A, 0xA1, 0xBC, 0x1A,
0x36, 0x89, 0xFC, 0x2C, 0x1B, 0x12, 0xEE, 0x5A, 0x08, 0xCC, 0xC6, 0x5D, 0x33, 0x8D, 0x03, 0x1E, 0x76, 0xE4, 0x07, 0x5F, 0xB5, 0x49, 0xE8, 0xA5, 0xE9, 0x90, 0x70, 0xD3, 0x42, 0x60, 0x36, 0x56,
0x12, 0x84, 0x8C, 0x6D, 0x29, 0x7C, 0x61, 0x92, 0x9F, 0x0F, 0x16, 0x15, 0x05, 0xD1, 0xE6, 0x29, 0xCD, 0x34, 0x0E, 0x78, 0x48, 0x10, 0x32, 0xB6, 0x25, 0xF0, 0x0B, 0x93, 0xBC, 0x6C, 0xB0, 0xC8,
0x9D, 0x0E, 0xC9, 0x9C, 0xB1, 0x65, 0xD6, 0x6F, 0x36, 0xD7, 0xEB, 0x75, 0x63, 0x16, 0xB2, 0xF9, 0x28, 0x88, 0x36, 0x4F, 0xE8, 0x74, 0x48, 0xE6, 0x8C, 0x2D, 0xD3, 0x7E, 0xA3, 0xB1, 0x5E, 0xAF,
0x6A, 0xDC, 0x98, 0x24, 0x8B, 0x66, 0xB4, 0x9A, 0x98, 0xE2, 0xB1, 0xC9, 0x91, 0x69, 0x32, 0x20, 0xEB, 0xB3, 0x80, 0xCD, 0x57, 0xE3, 0xFA, 0x24, 0x5E, 0x34, 0xC2, 0xD5, 0xC4, 0x14, 0x5F, 0x1B,
0xAC, 0xE9, 0x36, 0x2C, 0xA2, 0x31, 0xD0, 0x68, 0xCA, 0x86, 0xE4, 0x0B, 0xA4, 0xBA, 0xF1, 0x57, 0x1C, 0x99, 0x06, 0x83, 0x8D, 0x35, 0xDC, 0xBA, 0x45, 0x34, 0x06, 0x12, 0x4D, 0xD9, 0x90, 0x5C,
0x58, 0x21, 0xBB, 0x9C, 0x15, 0x6B, 0xD2, 0x05, 0x00, 0xE6, 0x62, 0x96, 0x0F, 0x97, 0x21, 0x5D, 0x40, 0xA8, 0x1B, 0x7D, 0x81, 0x15, 0xD2, 0xAF, 0xB3, 0x7C, 0x4D, 0xBA, 0x00, 0xC0, 0x9C, 0xCD,
0xFF, 0x92, 0x5C, 0x0D, 0x09, 0xA6, 0xD3, 0xB6, 0x6B, 0xC1, 0x8F, 0x63, 0x59, 0x30, 0x6B, 0x26, 0xF2, 0xCB, 0xD7, 0x80, 0xAE, 0x7F, 0x89, 0xAF, 0x86, 0x04, 0xC3, 0x69, 0xDB, 0xB5, 0xE0, 0xC3,
0x22, 0x0C, 0x56, 0xE8, 0x43, 0xC2, 0x6F, 0xC1, 0x62, 0x68, 0xBD, 0x65, 0x19, 0x38, 0x40, 0x07, 0xB1, 0x2C, 0x98, 0x35, 0x13, 0x1E, 0x06, 0x33, 0xF4, 0x21, 0xE1, 0xAF, 0xA0, 0x31, 0xB4, 0xDA,
0x56, 0xFA, 0x11, 0xAD, 0xDB, 0x86, 0x66, 0xDA, 0x3A, 0x0C, 0x5F, 0xFA, 0x6C, 0xAE, 0x05, 0x43, 0xB2, 0x0C, 0x1C, 0xA0, 0x03, 0x29, 0xBD, 0x90, 0x56, 0x6D, 0x43, 0x33, 0x6D, 0x1D, 0x86, 0x2F,
0xF2, 0xBA, 0x8D, 0x20, 0xEC, 0x8E, 0x77, 0xE1, 0xBA, 0x00, 0xB1, 0xE3, 0x69, 0x66, 0x2B, 0x72, 0x3D, 0x36, 0xD7, 0xFC, 0x21, 0x79, 0xDD, 0x46, 0x10, 0x76, 0xA7, 0x79, 0xE9, 0xBA, 0x00, 0xB1,
0xBB, 0x30, 0xAA, 0xE5, 0x44, 0x2D, 0xB8, 0x5C, 0x78, 0x3D, 0xF8, 0xF5, 0xB4, 0x1E, 0xF4, 0xB8, 0xD3, 0xD4, 0xCC, 0x56, 0xE8, 0x76, 0x61, 0x54, 0xCB, 0x09, 0x5B, 0xF0, 0xB8, 0x6C, 0xF6, 0xE0,
0x3D, 0x6C, 0x72, 0x22, 0xDB, 0xF5, 0xB4, 0xAE, 0x75, 0xD1, 0xB6, 0x35, 0xD3, 0xEB, 0x6A, 0xB6, 0xB3, 0xA9, 0xF5, 0xA0, 0xC7, 0xED, 0x61, 0x93, 0x13, 0xDA, 0x6E, 0x53, 0xEB, 0x5A, 0x97, 0x6D,
0x05, 0x5D, 0xB6, 0xD5, 0x8A, 0xCC, 0xAE, 0x05, 0x37, 0xAE, 0x17, 0xB9, 0x00, 0xE4, 0xC2, 0x81, 0x5B, 0x33, 0x9B, 0x5D, 0xCD, 0xB6, 0xA0, 0xCB, 0xB6, 0x5A, 0xA1, 0xD9, 0xB5, 0xE0, 0xC5, 0x6D,
0xA1, 0x9E, 0xA7, 0xB9, 0x30, 0xBD, 0xE7, 0x46, 0x30, 0xB4, 0x1D, 0x01, 0x4C, 0x00, 0xD2, 0xBD, 0x86, 0x2E, 0x00, 0xB9, 0x74, 0x60, 0x68, 0xB3, 0xA9, 0xB9, 0x30, 0xBD, 0xE7, 0x86, 0x30, 0xB4,
0xC0, 0x1E, 0x57, 0x83, 0xDF, 0x8E, 0x7B, 0x01, 0x53, 0x5C, 0x5C, 0x14, 0x1E, 0xBC, 0xC8, 0x94, 0x1D, 0x02, 0x4C, 0x00, 0xD2, 0xBD, 0xC4, 0x1E, 0x57, 0x83, 0xCF, 0x8E, 0x7B, 0x09, 0x53, 0x5C,
0x23, 0xE0, 0x06, 0xC6, 0x5F, 0xC0, 0x23, 0x8C, 0xEC, 0xE1, 0xC2, 0x1C, 0x88, 0x89, 0x80, 0x23, 0x5C, 0x14, 0xBE, 0x34, 0x43, 0x53, 0x8E, 0x80, 0x17, 0x18, 0x7F, 0x09, 0x5F, 0x61, 0x64, 0x0F,
0xB9, 0xCA, 0x05, 0xAE, 0x6D, 0x22, 0x0E, 0x25, 0x02, 0x1C, 0x31, 0x3B, 0x42, 0x68, 0xEE, 0x05, 0x17, 0xE6, 0x40, 0x4C, 0x04, 0x1C, 0xCA, 0x55, 0x2E, 0x71, 0x6D, 0x13, 0x71, 0x28, 0x10, 0xE0,
0xAE, 0x6E, 0x22, 0x16, 0x12, 0x75, 0x93, 0xE3, 0x6E, 0x0A, 0xE2, 0x6C, 0xED, 0x02, 0x71, 0x10, 0x88, 0xD9, 0x21, 0x42, 0x73, 0x2F, 0x71, 0x75, 0x13, 0xB1, 0x90, 0xA8, 0x9B, 0x1C, 0x77, 0x53,
0xEB, 0x22, 0xBA, 0x26, 0xA7, 0x1F, 0x1F, 0x5A, 0x7C, 0x0C, 0x0C, 0xC1, 0x19, 0xCE, 0x05, 0x22, 0x6C, 0xCE, 0xD6, 0x2E, 0x11, 0x07, 0xB1, 0x2E, 0xA2, 0x6B, 0xF2, 0xFD, 0xE3, 0x97, 0x16, 0x1F,
0x00, 0xF4, 0x23, 0x14, 0x01, 0xC4, 0x15, 0xEB, 0x98, 0x5D, 0xFB, 0xC2, 0x6C, 0x5B, 0x1A, 0x62, 0x03, 0x43, 0x70, 0x86, 0x73, 0x89, 0x08, 0xC0, 0xFE, 0x11, 0x8A, 0x00, 0xE2, 0x8A, 0x75, 0xCC,
0x81, 0x18, 0x20, 0x02, 0x5D, 0x94, 0x89, 0x87, 0x78, 0x02, 0x40, 0x58, 0xDA, 0x43, 0x44, 0xBA, 0xAE, 0x7D, 0x69, 0xB6, 0x2D, 0x0D, 0xB1, 0x40, 0x0C, 0x10, 0x81, 0x2E, 0xF2, 0xA4, 0x89, 0x78,
0x1A, 0xA2, 0xEE, 0x68, 0xED, 0x88, 0xAF, 0x0B, 0xF4, 0x9B, 0x6D, 0xCD, 0x03, 0x3A, 0xDB, 0xC0, 0x02, 0x40, 0x58, 0xBA, 0x89, 0x88, 0x74, 0x35, 0x44, 0xDD, 0xD1, 0xDA, 0x21, 0x5F, 0x17, 0xF6,
0x6E, 0xA0, 0x1F, 0x16, 0x86, 0x3B, 0x60, 0x11, 0xEF, 0x8C, 0x60, 0xE0, 0x85, 0xED, 0x22, 0x58, 0x6F, 0xB6, 0xB5, 0x26, 0xEC, 0xB3, 0x0D, 0xE4, 0x86, 0xFD, 0xC3, 0xC2, 0xF0, 0x06, 0x24, 0xE2,
0x31, 0xD3, 0xD5, 0x04, 0x67, 0x91, 0x64, 0xAF, 0xA3, 0x01, 0xC1, 0xB0, 0x12, 0x5F, 0xCD, 0x86, 0x9D, 0x21, 0x0C, 0xBC, 0xB4, 0x5D, 0x04, 0x2B, 0x66, 0xBA, 0x9A, 0xA0, 0x2C, 0x6E, 0xB9, 0xD9,
0x99, 0xD0, 0x13, 0x21, 0x96, 0xB0, 0x12, 0xAC, 0x27, 0x70, 0x84, 0xDE, 0x88, 0x53, 0x00, 0xCD, 0xD1, 0x60, 0xC3, 0xB0, 0x12, 0x5F, 0xCD, 0x86, 0x99, 0xD0, 0x13, 0x22, 0x96, 0xB0, 0x12, 0xAC,
0xC8, 0x66, 0xA4, 0xE9, 0x1B, 0x17, 0x74, 0x17, 0x18, 0x7A, 0x61, 0x76, 0x7B, 0x48, 0x29, 0x67, 0x27, 0x70, 0x84, 0xDE, 0x90, 0xEF, 0x00, 0x9A, 0x91, 0xCC, 0xB8, 0xA7, 0x6F, 0x9C, 0xD1, 0x5D,
0x75, 0xDB, 0x65, 0xF0, 0xE5, 0x0C, 0x69, 0xB4, 0x58, 0x79, 0x97, 0x77, 0xE2, 0x15, 0x2E, 0xD0, 0x20, 0xE8, 0xA5, 0xD9, 0xED, 0xE1, 0x4E, 0x39, 0xA9, 0xDB, 0x2E, 0x83, 0x5F, 0x4E, 0x90, 0x7A,
0x21, 0xDA, 0xCD, 0xF2, 0x4E, 0x74, 0x7D, 0x03, 0x5D, 0x6A, 0xA2, 0x32, 0xC1, 0x65, 0x06, 0x5F, 0x8B, 0x15, 0x6F, 0x59, 0x27, 0x3E, 0xE1, 0x01, 0x1D, 0xA2, 0xDD, 0x2C, 0xDE, 0x44, 0xD7, 0x37,
0x50, 0xDE, 0x91, 0x76, 0x02, 0xA9, 0x4D, 0x5C, 0xD8, 0x47, 0x5E, 0xC1, 0x91, 0xD1, 0xCB, 0x30, 0x90, 0xA5, 0x06, 0x0A, 0x13, 0x3C, 0x66, 0xF0, 0x0B, 0xC2, 0x3B, 0xD2, 0x8E, 0x20, 0xB4, 0x89,
0x5D, 0xAC, 0x21, 0x05, 0x82, 0x61, 0x30, 0x00, 0x46, 0xFB, 0xF0, 0x45, 0x63, 0xFA, 0xF3, 0x06, 0x72, 0xFD, 0xC8, 0x32, 0x38, 0x32, 0x7A, 0x19, 0x24, 0x8B, 0x35, 0x84, 0x40, 0x30, 0x0C, 0x06,
0x65, 0x7E, 0x78, 0xF1, 0xCB, 0xFB, 0xD3, 0xBF, 0x98, 0x59, 0x59, 0x3D, 0xEF, 0xA2, 0xEB, 0x20, 0xC0, 0x68, 0x0F, 0x7E, 0x51, 0x99, 0xFE, 0xB8, 0x42, 0x99, 0x1F, 0x5E, 0xFC, 0xF2, 0xFE, 0xE4,
0xC4, 0xB6, 0xD5, 0x40, 0xED, 0x73, 0x90, 0xB5, 0x1E, 0x30, 0xBF, 0xD5, 0x63, 0xB6, 0xDD, 0xC6, 0x2F, 0xA6, 0x56, 0x56, 0xAF, 0x79, 0xD9, 0x75, 0x10, 0x62, 0xDB, 0xAA, 0xA3, 0xF4, 0x39, 0x48,
0xB6, 0x2E, 0xB6, 0xF5, 0x3C, 0xBC, 0xED, 0x81, 0x04, 0xBA, 0xFC, 0xE2, 0x39, 0x45, 0x17, 0xAA, 0xDA, 0x26, 0x10, 0xBF, 0xD5, 0x63, 0xB6, 0xDD, 0xC6, 0xB6, 0x2E, 0xB6, 0xF5, 0x9A, 0xF8, 0xDA,
0x5E, 0xAB, 0xC3, 0x19, 0x5E, 0xDC, 0xA1, 0xE2, 0xF2, 0x4E, 0xB3, 0xDD, 0x95, 0x13, 0xCD, 0x02, 0x03, 0x0E, 0x74, 0xF9, 0xA3, 0xE9, 0xE4, 0x5D, 0x28, 0x7A, 0xAD, 0x0E, 0x27, 0x78, 0xFE, 0x86,
0x84, 0xA9, 0x02, 0x36, 0xF3, 0xD5, 0x40, 0x5C, 0xBD, 0x02, 0x05, 0xF9, 0xE0, 0x14, 0x23, 0xF8, 0x82, 0xCB, 0x3B, 0xCD, 0x76, 0x57, 0x4E, 0x34, 0x73, 0x10, 0xA6, 0x0A, 0xD8, 0xCC, 0x56, 0x03,
0x00, 0x3E, 0x4D, 0xCC, 0xE2, 0xC0, 0x7A, 0x39, 0xFC, 0x9E, 0x58, 0x32, 0x07, 0xA8, 0x71, 0x24, 0x76, 0xF5, 0x72, 0x14, 0xE4, 0x17, 0x27, 0x1F, 0xC1, 0x07, 0xF0, 0x69, 0x62, 0x16, 0x07, 0xD6,
0xF2, 0x2B, 0x47, 0x95, 0x77, 0x01, 0xEE, 0xBD, 0x96, 0xC6, 0xF2, 0xB9, 0x0A, 0x3C, 0xB9, 0x84, 0xCB, 0xE0, 0xF7, 0xC4, 0x92, 0x19, 0x40, 0x8D, 0x23, 0x91, 0x3D, 0x39, 0xAA, 0xBC, 0x0B, 0x70,
0xE0, 0x02, 0xAE, 0xFA, 0xED, 0x75, 0xB7, 0xDB, 0x85, 0xBE, 0x1E, 0x37, 0x71, 0xB4, 0x72, 0x1B, 0xEF, 0xB5, 0x34, 0x96, 0xCD, 0x55, 0xE0, 0xC9, 0x25, 0x04, 0x15, 0x70, 0xD5, 0x6F, 0xAF, 0xBB,
0xF4, 0xD5, 0x61, 0x1C, 0x41, 0xEE, 0x39, 0x5A, 0x1D, 0xD4, 0x67, 0x40, 0xAA, 0x87, 0x1E, 0xC2, 0xDD, 0x2E, 0xF4, 0xF5, 0xB8, 0x8A, 0xA3, 0x96, 0xDB, 0x20, 0xAF, 0x0E, 0xE3, 0x08, 0x72, 0xCB,
0x76, 0xD0, 0xDE, 0x80, 0x37, 0x0E, 0x0C, 0xC2, 0x1F, 0x7C, 0x12, 0x37, 0x78, 0x85, 0x1E, 0xB8, 0xD1, 0xEA, 0xA0, 0x3C, 0x03, 0x52, 0x3D, 0xB4, 0x10, 0xB6, 0x83, 0xFA, 0x06, 0xB4, 0x71, 0x60,
0xBD, 0xC0, 0x45, 0x34, 0x07, 0x14, 0xD4, 0x06, 0xB6, 0x6B, 0x76, 0x4F, 0xF3, 0xF8, 0x72, 0x80, 0x10, 0x7E, 0xE0, 0x37, 0xF1, 0x82, 0x4F, 0xE8, 0x81, 0xD7, 0x4B, 0x5C, 0x44, 0x73, 0x40, 0x40,
0x73, 0x07, 0x49, 0x87, 0x11, 0x66, 0x07, 0x80, 0xB5, 0xD1, 0xA1, 0xB5, 0x11, 0x6A, 0x17, 0x9C, 0x6D, 0x20, 0xBB, 0x66, 0xF7, 0xB4, 0x26, 0x5F, 0x0E, 0x70, 0xEE, 0xE0, 0xD6, 0x61, 0x84, 0xD9,
0x88, 0x8D, 0x3A, 0xDF, 0xD6, 0x84, 0xAB, 0xB1, 0x50, 0x16, 0x70, 0x05, 0x14, 0x2F, 0x1C, 0xF4, 0x01, 0x60, 0x6D, 0x34, 0x68, 0x6D, 0x84, 0xDA, 0x05, 0x23, 0x62, 0xA3, 0xCC, 0xB7, 0x35, 0x61,
0x44, 0x60, 0xA8, 0x1D, 0x70, 0x0A, 0x36, 0xC3, 0x89, 0x5D, 0x87, 0xF5, 0x84, 0x60, 0x6C, 0xA0, 0x6A, 0x2C, 0xE4, 0x05, 0x3C, 0x01, 0xC5, 0x4B, 0x07, 0x2D, 0x11, 0x28, 0x6A, 0x07, 0x8C, 0x82,
0x0E, 0x9D, 0x47, 0x17, 0x89, 0x73, 0x5D, 0xCE, 0x58, 0x5C, 0x4C, 0x3E, 0x38, 0x1E, 0xEF, 0xE7, 0xCD, 0x70, 0x62, 0xD7, 0x61, 0x3D, 0xC1, 0x18, 0x1B, 0x76, 0x87, 0xC6, 0xA3, 0x8B, 0x9B, 0x73,
0xDD, 0x7C, 0x46, 0x17, 0x2D, 0xA6, 0x63, 0x89, 0x2B, 0x40, 0xEC, 0xC0, 0x42, 0x17, 0x36, 0x58, 0x5D, 0x4E, 0x58, 0x5C, 0x4C, 0x7E, 0x71, 0x9A, 0xBC, 0x9F, 0x77, 0xF3, 0x19, 0x5D, 0xD4, 0x98,
0x32, 0xB0, 0x4C, 0xF3, 0x72, 0xBE, 0x7A, 0xD0, 0x7B, 0x61, 0xF6, 0xB8, 0x3F, 0x46, 0xA4, 0x80, 0x8E, 0x25, 0x9E, 0x00, 0xB1, 0x03, 0x0B, 0x5D, 0xDA, 0xA0, 0xC9, 0x40, 0x32, 0xAD, 0x99, 0xD1,
0x92, 0x6E, 0xEF, 0xDB, 0x6B, 0x0F, 0x5C, 0x41, 0xC7, 0xE9, 0x80, 0x57, 0x41, 0x6F, 0x22, 0xBD, 0xB5, 0x09, 0xBD, 0x97, 0x66, 0x8F, 0xDB, 0x63, 0x44, 0x0A, 0x76, 0xD2, 0xED, 0x7D, 0x7B, 0xDD,
0x22, 0xFF, 0x72, 0x89, 0xBA, 0xB8, 0x0A, 0x17, 0x3E, 0x9F, 0xEF, 0xC2, 0x54, 0x94, 0x04, 0x92, 0x04, 0x53, 0xD0, 0x71, 0x3A, 0x60, 0x55, 0xD0, 0x9A, 0x48, 0xAB, 0xC8, 0x7F, 0x39, 0x47, 0x5D,
0x65, 0x83, 0x27, 0x41, 0xD2, 0x5C, 0xCD, 0xE5, 0x7A, 0x62, 0xDB, 0xCC, 0x45, 0xA1, 0xD8, 0x9D, 0x5C, 0x85, 0x33, 0x9F, 0xCF, 0x77, 0x61, 0x2A, 0x72, 0x02, 0xB7, 0x65, 0x83, 0x25, 0xC1, 0xAD,
0x08, 0x60, 0x81, 0x3F, 0x81, 0x45, 0x91, 0xFF, 0x88, 0x22, 0x22, 0x0E, 0x58, 0xB4, 0xE5, 0x2D, 0xB9, 0x9A, 0xCB, 0xE5, 0xC4, 0xB6, 0x99, 0x8B, 0x4C, 0xB1, 0x3B, 0x21, 0xC0, 0x02, 0x7B, 0x02,
0xF7, 0x9E, 0xE8, 0x40, 0xC1, 0x59, 0x00, 0x3A, 0xB0, 0x28, 0xC7, 0xD6, 0x74, 0x80, 0xD5, 0x16, 0x8B, 0x22, 0xFD, 0x11, 0x45, 0x44, 0x1C, 0xB0, 0x68, 0xCB, 0x57, 0x6E, 0x3D, 0xD1, 0x80, 0x82,
0x33, 0x5D, 0x07, 0xF9, 0xF9, 0x20, 0xE3, 0x3F, 0xC5, 0x6A, 0x69, 0x0A, 0x25, 0xCF, 0x0E, 0xEB, 0xB1, 0x00, 0x74, 0x60, 0x51, 0x8E, 0xAD, 0xE9, 0x00, 0xA9, 0x2D, 0x66, 0xBA, 0x0E, 0xD2, 0xF3,
0xD7, 0x78, 0xB8, 0x1E, 0x92, 0x32, 0x86, 0x93, 0xAD, 0x3E, 0xA5, 0xAC, 0xE3, 0xA9, 0x07, 0x41, 0x41, 0xCA, 0x7F, 0x82, 0xD9, 0xD2, 0x14, 0x52, 0x9E, 0x1D, 0xDA, 0xAF, 0x71, 0x77, 0x3D, 0x24,
0x97, 0x21, 0x7C, 0x44, 0x13, 0x72, 0x80, 0x69, 0x38, 0xDB, 0x65, 0xF4, 0x88, 0x4B, 0x08, 0x06, 0x85, 0x0F, 0x27, 0x5B, 0x7D, 0x4A, 0x5A, 0xC7, 0x43, 0x0F, 0x82, 0x26, 0x43, 0xD8, 0x88, 0x06,
0xF9, 0xF2, 0xC3, 0x3F, 0x5F, 0xBC, 0x3B, 0x3B, 0x7D, 0xF3, 0x07, 0xD9, 0x81, 0xDA, 0x16, 0x46, 0xC4, 0x00, 0xD3, 0x60, 0xB6, 0x4B, 0xE9, 0x11, 0x97, 0x00, 0x14, 0xF2, 0xE5, 0x87, 0x7F, 0xBE,
0x4D, 0x8C, 0xF2, 0x4D, 0x71, 0x2E, 0x77, 0xD2, 0x84, 0xCC, 0x60, 0x67, 0x7A, 0x20, 0xAA, 0xCB, 0x38, 0x3D, 0x3B, 0x79, 0xFB, 0x86, 0xEC, 0x40, 0x6D, 0x0B, 0xA3, 0x06, 0x7A, 0xF9, 0x86, 0x38,
0xD1, 0xC9, 0xDC, 0xE1, 0x4B, 0xBC, 0x3E, 0xFB, 0x0D, 0x41, 0xCD, 0x1D, 0xF8, 0xC9, 0xBB, 0x76, 0x97, 0x3B, 0x6A, 0x40, 0x64, 0xB0, 0x33, 0x3C, 0x10, 0xD9, 0xE5, 0xE8, 0x68, 0xEE, 0xF0, 0x25,
0xCF, 0xD5, 0x64, 0xA2, 0x44, 0x04, 0x6A, 0xA7, 0xAF, 0x5E, 0x9C, 0xFD, 0xF7, 0xD9, 0xF9, 0x8B, 0x5E, 0x9F, 0xFD, 0x86, 0xA0, 0xE6, 0x0E, 0x7C, 0x64, 0x5D, 0xBB, 0xE7, 0x6A, 0x32, 0x50, 0x22,
0xD7, 0x64, 0x7B, 0x68, 0x7E, 0x18, 0x04, 0xCE, 0x13, 0x5A, 0xE7, 0xDA, 0x4B, 0x28, 0x95, 0xB3, 0x02, 0xB5, 0x93, 0x57, 0x2F, 0xCE, 0xFE, 0x75, 0x76, 0xFE, 0xE2, 0x35, 0xD9, 0x1E, 0x9A, 0x1D,
0xEB, 0x8C, 0xD1, 0xC5, 0x1E, 0xD8, 0x3C, 0x99, 0x04, 0x40, 0xBC, 0xDA, 0xD6, 0x78, 0xB5, 0x4D, 0x06, 0x81, 0xF1, 0x84, 0xD6, 0xB9, 0xF6, 0x12, 0x52, 0xE5, 0xF4, 0x3A, 0x65, 0x74, 0xB1, 0x07,
0xB0, 0xBE, 0x16, 0x6B, 0xF1, 0x4A, 0x5B, 0x94, 0x7C, 0x44, 0x8B, 0xFD, 0x05, 0x74, 0x2E, 0xAE, 0x36, 0x0F, 0x26, 0x01, 0x10, 0xCF, 0xB6, 0x35, 0x9E, 0x6D, 0x13, 0xCC, 0xAF, 0xC5, 0x5A, 0x3C,
0xB1, 0x31, 0xFB, 0xF8, 0x99, 0x68, 0x8B, 0x55, 0xC4, 0xC2, 0x25, 0x32, 0x3B, 0xBF, 0x23, 0x20, 0xD3, 0x16, 0x29, 0x1F, 0xD1, 0x22, 0x6F, 0x01, 0x9D, 0x8B, 0x6B, 0x6C, 0x4C, 0x3F, 0x7E, 0x26,
0x4F, 0x01, 0xA9, 0x74, 0xCE, 0x9A, 0xB2, 0x97, 0x4B, 0xE4, 0x0A, 0xA2, 0x6A, 0x17, 0x6B, 0x54, 0xDA, 0x62, 0x15, 0xB2, 0x60, 0x89, 0xC4, 0xCE, 0xDE, 0x08, 0xF0, 0x53, 0x40, 0x2A, 0x8C, 0xB3,
0x0A, 0x79, 0xA2, 0x25, 0xF1, 0x24, 0x0A, 0x27, 0x5F, 0x87, 0xE4, 0x8C, 0xC6, 0x01, 0x2E, 0x55, 0xA6, 0xD4, 0x72, 0x89, 0x5C, 0x41, 0x64, 0xED, 0x62, 0x8D, 0x52, 0x22, 0x4F, 0xB4, 0x38, 0x9A,
0xD7, 0x07, 0xE0, 0x70, 0xFD, 0x68, 0x05, 0xF3, 0xDE, 0xF3, 0xB1, 0x64, 0x74, 0x14, 0x8F, 0xB3, 0x84, 0xC1, 0xE4, 0xCB, 0x90, 0x9C, 0xD1, 0xC8, 0xC7, 0xA5, 0xAA, 0xFA, 0x00, 0x0C, 0xAE, 0x17,
0xE5, 0x40, 0xFC, 0x9E, 0x2C, 0xD3, 0x64, 0x96, 0xD2, 0x2C, 0xCB, 0x25, 0x7F, 0x19, 0x66, 0xE1, 0xAE, 0x60, 0xDE, 0x7B, 0x3E, 0x96, 0x8C, 0x9E, 0x46, 0xE3, 0x74, 0x39, 0x10, 0x9F, 0x47, 0xCB,
0x38, 0x8C, 0x42, 0x76, 0xDD, 0x07, 0xC6, 0x05, 0x34, 0xCE, 0x51, 0x5F, 0xA6, 0x33, 0xB1, 0x24, 0x24, 0x9E, 0x25, 0x34, 0x4D, 0x33, 0xCE, 0x7F, 0x0D, 0xD2, 0x60, 0x1C, 0x84, 0x01, 0xBB, 0xEE,
0xBF, 0x81, 0x04, 0x91, 0x67, 0x69, 0x5C, 0x29, 0x25, 0x08, 0x48, 0xEE, 0x52, 0xF1, 0xDD, 0x21, 0x03, 0xE1, 0x7C, 0x1A, 0x65, 0xA8, 0x2F, 0x93, 0x99, 0x58, 0x92, 0xBF, 0x40, 0x80, 0xC8, 0xA3,
0xBF, 0x7D, 0xAC, 0x93, 0x72, 0x17, 0x99, 0x5E, 0x1E, 0x33, 0xB8, 0x4A, 0x3E, 0x84, 0x15, 0x15, 0x34, 0x2E, 0x94, 0x12, 0x04, 0x04, 0x77, 0x89, 0xF8, 0xDD, 0xC1, 0xBF, 0x7D, 0xA4, 0x93, 0x7C,
0xBA, 0x7F, 0x4D, 0x16, 0x0B, 0xC8, 0x62, 0xEB, 0xB5, 0x28, 0xCC, 0x58, 0xCD, 0xA8, 0xF9, 0x51, 0x17, 0x91, 0x5E, 0xE6, 0x33, 0xB8, 0x48, 0x3E, 0x84, 0x14, 0xA5, 0x7D, 0xFF, 0x1A, 0x2F, 0x16,
0x54, 0x53, 0xD8, 0xF0, 0x8E, 0x4E, 0x01, 0xDB, 0xB9, 0xA2, 0xF4, 0xEA, 0xAA, 0x88, 0x67, 0x01, 0x10, 0xC5, 0x56, 0x2B, 0x61, 0x90, 0xB2, 0x8A, 0x51, 0xF1, 0xC2, 0xB0, 0xA2, 0x90, 0xE1, 0x94,
0xED, 0xD7, 0x94, 0x42, 0x00, 0x0A, 0xC2, 0xB4, 0xAE, 0x93, 0x8D, 0x88, 0x59, 0x89, 0x71, 0x9E, 0x4E, 0x01, 0xDB, 0xB9, 0x22, 0xF4, 0xEA, 0xAA, 0x88, 0x67, 0x0E, 0xED, 0xD7, 0x84, 0x82, 0x03,
0x55, 0x86, 0x38, 0xBC, 0xAF, 0x44, 0x38, 0x0F, 0xFF, 0xC1, 0xF8, 0x14, 0xF4, 0x40, 0x83, 0xB6, 0xF2, 0x83, 0xA4, 0xAA, 0x93, 0x0D, 0x8F, 0x59, 0xF2, 0x71, 0x4D, 0xAB, 0x70, 0x71, 0xF8, 0x5E,
0x16, 0xD1, 0xAE, 0x91, 0x77, 0x24, 0x9F, 0xED, 0x2A, 0xB3, 0x1D, 0xB8, 0x4F, 0x61, 0x90, 0x03, 0xF2, 0x70, 0x4D, 0xFC, 0x07, 0xE3, 0x13, 0x90, 0x03, 0x0D, 0xDA, 0x5A, 0x44, 0xBB, 0x46, 0xDA,
0x97, 0x6B, 0x7E, 0x01, 0x29, 0x46, 0x43, 0x22, 0x77, 0x04, 0x48, 0xB3, 0x84, 0x83, 0x43, 0xAF, 0x91, 0x6C, 0xB6, 0xAB, 0xCC, 0x76, 0xE0, 0x3D, 0x81, 0x41, 0x0E, 0x3C, 0xAE, 0xF9, 0x03, 0xB8,
0x39, 0xB8, 0x3C, 0xD2, 0xB6, 0x94, 0x40, 0xDB, 0xBA, 0x13, 0x0E, 0xDA, 0x38, 0xC2, 0xB1, 0x05, 0x18, 0x0E, 0x89, 0xAC, 0x08, 0x90, 0x46, 0x01, 0x07, 0x87, 0x5E, 0x73, 0x70, 0x99, 0xA7, 0x6D,
0x42, 0x0E, 0x5C, 0x8A, 0x7D, 0x10, 0x68, 0xED, 0xCA, 0xC7, 0xB5, 0x84, 0xD8, 0x05, 0x61, 0x4B, 0x29, 0x8E, 0xB6, 0x75, 0x27, 0x1C, 0xD4, 0x71, 0x84, 0x63, 0x0B, 0x84, 0x1C, 0x78, 0xE4, 0x75,
0x20, 0x7C, 0x4B, 0x85, 0x8C, 0x8E, 0x81, 0x81, 0x00, 0x43, 0xFA, 0x22, 0x69, 0x22, 0x1B, 0x3C, 0x10, 0x68, 0xED, 0xCA, 0xAF, 0x6B, 0x09, 0xB1, 0x0B, 0xCC, 0x96, 0x40, 0x78, 0x49, 0x85, 0x8C,
0x95, 0xEE, 0x05, 0xB9, 0xCA, 0x75, 0x07, 0xFC, 0x57, 0xC1, 0xC9, 0x30, 0x9E, 0x26, 0xB9, 0x36, 0x6A, 0x40, 0x40, 0x80, 0x21, 0x6D, 0x91, 0x54, 0x91, 0x0D, 0x9A, 0x4A, 0xF3, 0x82, 0x54, 0xE5,
0xAA, 0xB3, 0x2B, 0x0E, 0x41, 0x94, 0x05, 0x72, 0x86, 0x78, 0xA8, 0x9C, 0xAF, 0x93, 0x5C, 0x71, 0xB2, 0x03, 0xF6, 0x2B, 0xA7, 0x64, 0x10, 0x4D, 0xE3, 0x4C, 0x1A, 0xD5, 0xD9, 0x25, 0x83, 0x20,
0xCB, 0x4D, 0x20, 0xD4, 0x2A, 0x51, 0x6C, 0x70, 0xAD, 0x9A, 0xAB, 0xF2, 0x3D, 0x07, 0xB5, 0x01, 0xD2, 0x02, 0x39, 0x43, 0x7C, 0x29, 0x9D, 0xAF, 0x93, 0x4C, 0x70, 0x8B, 0x22, 0x10, 0x4A, 0x95,
0xD8, 0x73, 0x6C, 0x1F, 0xFD, 0x01, 0x8A, 0x5D, 0x3C, 0x9C, 0x01, 0xD9, 0xF9, 0x83, 0x70, 0x15, 0x48, 0x36, 0xB8, 0x54, 0xCD, 0x55, 0xFE, 0x9E, 0x83, 0xD8, 0x00, 0xEC, 0x39, 0xB6, 0x8F, 0xDE,
0x67, 0x5F, 0x58, 0xB8, 0x00, 0x3A, 0xCF, 0xC3, 0x72, 0x58, 0x45, 0x57, 0x36, 0xDA, 0x0A, 0x57, 0x80, 0x60, 0xE7, 0x5F, 0xCE, 0x60, 0xDB, 0xD9, 0x17, 0x61, 0x2A, 0xCE, 0x2E, 0x58, 0xB0, 0x80,
0x3A, 0x2F, 0x68, 0x90, 0x68, 0xA0, 0xAE, 0x17, 0x2E, 0xE1, 0x0B, 0xAA, 0x25, 0x1F, 0x27, 0x6A, 0x7D, 0x9E, 0x07, 0xC5, 0xB0, 0x92, 0xAC, 0x6C, 0xB4, 0xE5, 0xA6, 0x74, 0x9E, 0xEF, 0x41, 0xA2,
0xA1, 0xC3, 0xAE, 0x4F, 0x56, 0xA4, 0xC2, 0xF4, 0x32, 0xE6, 0xB3, 0x55, 0x46, 0x0A, 0x5E, 0x6F, 0x81, 0xB2, 0x9E, 0x9B, 0x84, 0x0B, 0x14, 0x4B, 0x3E, 0x4E, 0xE4, 0x42, 0x87, 0x4D, 0x9F, 0xCC,
0xFD, 0xDE, 0xE1, 0xFC, 0x3E, 0xBC, 0x7F, 0xFB, 0xFC, 0xD9, 0xF9, 0x8B, 0xC3, 0xAE, 0x4F, 0xE6, 0x48, 0x85, 0xEA, 0xA5, 0xCC, 0x63, 0xAB, 0x94, 0xE4, 0xB4, 0xDE, 0xFA, 0xBC, 0xC3, 0xF8, 0x7D,
0x8D, 0xDA, 0xFB, 0x65, 0x00, 0xCA, 0x7F, 0x87, 0xE7, 0xAB, 0x98, 0xEF, 0x5E, 0x47, 0xB8, 0xDE, 0x78, 0xFF, 0xEE, 0xF9, 0xB3, 0xF3, 0x17, 0x87, 0x4D, 0x9F, 0x8C, 0x1B, 0xB5, 0xF7, 0x4B, 0x1F,
0xEB, 0x06, 0x95, 0x9C, 0xF4, 0xC1, 0xAE, 0x0F, 0x1E, 0x14, 0xCB, 0x17, 0xDE, 0x6D, 0xDB, 0xE7, 0x84, 0xFF, 0x0E, 0xCB, 0x57, 0x52, 0xDF, 0xBD, 0x86, 0x70, 0xBD, 0xD7, 0x0C, 0x2A, 0x31, 0xE9,
0x21, 0x11, 0xEA, 0x32, 0x0F, 0x71, 0x78, 0xD3, 0x75, 0xE1, 0xF2, 0xF0, 0x76, 0xB7, 0xD3, 0x2B, 0x83, 0x4D, 0x1F, 0x7C, 0x51, 0x34, 0x5F, 0x58, 0xB7, 0x6D, 0x9B, 0x87, 0x9B, 0x50, 0x97, 0x79,
0x20, 0x17, 0xF1, 0x6F, 0x91, 0xCD, 0xC8, 0x7E, 0xF0, 0xA3, 0x77, 0x14, 0xE4, 0x98, 0x32, 0xE0, 0x88, 0xC1, 0x9B, 0xAE, 0x73, 0x93, 0x87, 0xAF, 0xBB, 0x8D, 0x5E, 0x0E, 0x39, 0xF7, 0x7F, 0x8B,
0xB6, 0xA1, 0x81, 0xDB, 0xF7, 0x33, 0x28, 0x7B, 0xFD, 0x90, 0x35, 0xE0, 0xBF, 0x3C, 0x38, 0x16, 0x74, 0x46, 0xF6, 0x83, 0x1F, 0x9D, 0x52, 0xE0, 0x63, 0xC2, 0x80, 0xDA, 0x86, 0x06, 0x66, 0xDF,
0xA0, 0x26, 0xC9, 0x0A, 0x83, 0x9B, 0x12, 0x36, 0xF7, 0x84, 0xCC, 0x52, 0x4C, 0x38, 0x2D, 0x4A, 0x4B, 0x21, 0xED, 0xF5, 0x02, 0x56, 0x87, 0xFF, 0x32, 0xE7, 0x98, 0x83, 0x9A, 0xC4, 0x2B, 0x74,
0x66, 0xC0, 0x4E, 0x28, 0xBF, 0x0B, 0x63, 0xE3, 0xF5, 0x7B, 0x55, 0xF0, 0x95, 0x92, 0x7E, 0x57, 0x6E, 0x8A, 0xDB, 0xDC, 0xE3, 0x32, 0x0B, 0x36, 0xE1, 0xB4, 0x30, 0x9E, 0x01, 0x39, 0x21, 0xFD,
0x97, 0xD8, 0xC9, 0x81, 0x9E, 0xB9, 0x3B, 0x3A, 0x05, 0xD4, 0x59, 0x38, 0x0D, 0x27, 0x7C, 0x5F, 0xCE, 0x95, 0x8D, 0xE7, 0xEF, 0x65, 0xC6, 0x97, 0x52, 0xFA, 0x5D, 0x5D, 0xA2, 0x92, 0x03, 0x3D,
0x16, 0x22, 0xAF, 0xBB, 0x43, 0xE7, 0xCA, 0x1D, 0x16, 0x99, 0x0E, 0x8C, 0x2A, 0x09, 0x8A, 0xE8, 0x73, 0x77, 0x74, 0x02, 0xA8, 0xB3, 0x60, 0x1A, 0x4C, 0x78, 0x5D, 0x16, 0x3C, 0xAF, 0xBB, 0x43,
0x46, 0x9F, 0x41, 0xB4, 0x22, 0xBD, 0x1F, 0xBD, 0xCF, 0xC0, 0x6C, 0x25, 0x79, 0x1B, 0x01, 0x50, 0xE6, 0x8A, 0x0A, 0x8B, 0x0C, 0x07, 0x46, 0xA5, 0x00, 0x45, 0x74, 0xA3, 0xCD, 0x20, 0x5A, 0x1E,
0x3D, 0x86, 0xCF, 0x55, 0x40, 0x4C, 0xE7, 0x44, 0xA2, 0xFC, 0x2B, 0xC9, 0x0C, 0xEE, 0x54, 0x95, 0xDE, 0x8F, 0xDE, 0xA7, 0xA0, 0xB6, 0x72, 0x7B, 0x1B, 0x0E, 0x50, 0x3D, 0x86, 0xCF, 0x44, 0x40,
0xAC, 0x9A, 0xA7, 0xF7, 0x47, 0xE2, 0x2D, 0xF4, 0xAD, 0xC1, 0x83, 0x3C, 0x00, 0x91, 0xA5, 0x9C, 0x4C, 0xE7, 0x9B, 0x44, 0xFE, 0x97, 0x82, 0x19, 0xAC, 0x54, 0x15, 0xA4, 0x9A, 0x27, 0xF7, 0x47,
0x22, 0x91, 0x59, 0x1E, 0x46, 0x66, 0xBC, 0x2B, 0x41, 0x51, 0xF7, 0x9C, 0x36, 0xD2, 0x88, 0x5C, 0xE2, 0x1D, 0xF4, 0xAD, 0xC1, 0x82, 0x3C, 0x00, 0x91, 0xA5, 0x9C, 0x22, 0x91, 0x59, 0x1E, 0x46,
0xD3, 0xF7, 0xD9, 0x43, 0x19, 0xF1, 0x5E, 0xBD, 0xC3, 0xE8, 0x24, 0xF5, 0xFD, 0x6C, 0x35, 0x5E, 0x66, 0xBC, 0x2B, 0x40, 0x51, 0x6B, 0x4E, 0x1B, 0x61, 0x44, 0x26, 0xE9, 0xFB, 0xF4, 0xA1, 0xF0,
0x84, 0x6C, 0xA7, 0x87, 0xC8, 0x26, 0xE0, 0x30, 0xD9, 0xE8, 0xD2, 0x4F, 0xB5, 0x75, 0xF6, 0x25, 0x78, 0xAF, 0x4E, 0xD1, 0x3B, 0x49, 0x79, 0x3F, 0x5B, 0x8D, 0x17, 0x01, 0xDB, 0x69, 0x21, 0xD2,
0x4B, 0x56, 0xE9, 0x84, 0x1A, 0x93, 0x55, 0x8A, 0xBB, 0xE4, 0xE8, 0x97, 0x21, 0xB5, 0x23, 0x06, 0x09, 0x18, 0x4C, 0x36, 0xFA, 0xEA, 0x25, 0xDA, 0x3A, 0xBD, 0x48, 0xE3, 0x55, 0x32, 0xA1, 0xC6,
0x20, 0x3D, 0x47, 0x41, 0x0B, 0x31, 0x0F, 0x9F, 0xD8, 0xC6, 0x9A, 0x8E, 0x57, 0xDC, 0x88, 0xF0, 0xD5, 0x22, 0xC4, 0xA4, 0x4F, 0x84, 0x11, 0xC6, 0x64, 0x95, 0x60, 0xCD, 0x1C, 0xAD, 0x34, 0x04,
0x61, 0x5A, 0x64, 0x44, 0xB2, 0x2B, 0x4B, 0x26, 0x5F, 0x29, 0xFB, 0xB2, 0x4C, 0x52, 0x36, 0xB4, 0x7A, 0xC4, 0x80, 0x2D, 0xCC, 0x91, 0xED, 0x82, 0xE9, 0xC3, 0x27, 0xB6, 0xB1, 0xA6, 0xE3, 0x15,
0x0C, 0x3F, 0xBB, 0x8E, 0x27, 0x5F, 0xA0, 0x19, 0xAA, 0xC6, 0xC5, 0x2A, 0x56, 0xA0, 0xA0, 0x2E, 0x57, 0x29, 0xFC, 0x32, 0xCD, 0xE3, 0x23, 0xD9, 0x95, 0xC6, 0x93, 0x2F, 0x94, 0x5D, 0x2C, 0xE3,
0x7E, 0x41, 0x3E, 0x11, 0x03, 0x74, 0xF3, 0x4B, 0x32, 0x9D, 0x56, 0x01, 0x70, 0x8B, 0xA0, 0x01, 0x84, 0x0D, 0x2D, 0xA5, 0xE1, 0xE4, 0xDD, 0x90, 0x00, 0xB4, 0xF4, 0x3A, 0x9A, 0x5C, 0x40, 0x2B,
0x34, 0x0E, 0xA6, 0xAB, 0x98, 0x1F, 0x04, 0x80, 0x19, 0x5E, 0x8E, 0x7D, 0x08, 0xBD, 0x37, 0x88, 0xE4, 0x94, 0x8B, 0x55, 0xA4, 0x40, 0x45, 0x49, 0xBD, 0x40, 0x2A, 0x12, 0x03, 0x24, 0xF7, 0x22,
0x32, 0xD0, 0xA6, 0x38, 0x1B, 0x62, 0xB0, 0xA1, 0x82, 0x7A, 0x23, 0x5B, 0x82, 0x85, 0xD5, 0x81, 0x9E, 0x4E, 0xCB, 0x00, 0xB9, 0xBE, 0x50, 0x1F, 0x1B, 0x69, 0xBA, 0xBC, 0xA0, 0x49, 0x12, 0x27,
0x00, 0xDD, 0x88, 0x39, 0x1D, 0xE1, 0x10, 0x00, 0x25, 0x69, 0x9D, 0x1E, 0xE3, 0xBC, 0x40, 0xB2, 0x17, 0x0B, 0xD0, 0x3E, 0x98, 0x87, 0x93, 0x8A, 0xC6, 0x49, 0xEC, 0x53, 0x58, 0x1A, 0x69, 0x28,
0xB1, 0x26, 0x82, 0x77, 0x4D, 0x2B, 0xD8, 0xF7, 0x89, 0xA8, 0x1C, 0xA8, 0x35, 0x6B, 0x03, 0x6D, 0xF6, 0x34, 0xB4, 0x06, 0xD3, 0x55, 0xC4, 0x4F, 0x16, 0x40, 0xAF, 0xBF, 0x8E, 0x3D, 0xF0, 0xE5,
0x7F, 0x0A, 0xF1, 0x89, 0x8C, 0x9A, 0xDC, 0x00, 0xC9, 0x20, 0x3C, 0x61, 0x8D, 0x88, 0xC6, 0x33, 0x37, 0x48, 0x03, 0x98, 0xA8, 0x58, 0x2F, 0x62, 0xB0, 0xA1, 0xB2, 0xFB, 0x7A, 0xBA, 0x04, 0x95,
0x36, 0x37, 0xED, 0x81, 0xBE, 0x67, 0x95, 0x3D, 0x8B, 0x90, 0xE3, 0x7A, 0x7C, 0x3C, 0x64, 0x1F, 0xAD, 0x02, 0x0D, 0x74, 0x23, 0xE2, 0xA4, 0x08, 0x86, 0xF6, 0x00, 0xA4, 0xA0, 0x4A, 0x6B, 0x38,
0xC3, 0xCF, 0xC7, 0x88, 0xF1, 0x31, 0xB9, 0x6B, 0x51, 0x72, 0x2C, 0x06, 0x17, 0xAE, 0x46, 0x62, 0xCF, 0x97, 0x7C, 0xA9, 0x88, 0x68, 0xA0, 0xA2, 0xE5, 0xFC, 0xF8, 0x44, 0x54, 0x22, 0x56, 0x1A,
0x61, 0x84, 0xC7, 0xC7, 0x83, 0x94, 0xB2, 0x55, 0x1A, 0x6B, 0x1C, 0x05, 0xD5, 0x2F, 0x90, 0xDB, 0x95, 0x81, 0xB6, 0x3F, 0x26, 0xF9, 0x44, 0x46, 0x0D, 0xAE, 0xD1, 0x64, 0x10, 0x1C, 0xB1, 0x7A,
0x82, 0x91, 0xA0, 0xE6, 0xD9, 0xFC, 0x4B, 0x08, 0xFA, 0x0B, 0xCC, 0x14, 0xE3, 0x49, 0x9E, 0x46, 0x48, 0xA3, 0x19, 0x9B, 0x9B, 0xF6, 0x40, 0xDF, 0xB3, 0xCA, 0x9E, 0x45, 0x48, 0xAD, 0x1A, 0xD5,
0xD4, 0x5A, 0x4E, 0x0D, 0xC2, 0x7F, 0xCD, 0x86, 0x0B, 0x24, 0x0C, 0xB5, 0x76, 0x0D, 0x13, 0x06, 0x86, 0xEC, 0x63, 0xF0, 0xB9, 0x86, 0x18, 0xD7, 0xC8, 0x5D, 0x8B, 0x92, 0x9A, 0x18, 0x9C, 0xDB,
0xBC, 0x88, 0xA8, 0x56, 0x73, 0x5A, 0xB5, 0x3C, 0xAB, 0xA8, 0x75, 0x6A, 0x52, 0xC5, 0x6B, 0x98, 0x2E, 0x89, 0x85, 0x11, 0xD4, 0x6A, 0x83, 0x84, 0xB2, 0x55, 0x12, 0x69, 0x1C, 0x05, 0xD5, 0xD0,
0x08, 0xF4, 0x53, 0x1A, 0x0C, 0x6A, 0x5A, 0x13, 0x10, 0xD9, 0x06, 0xB7, 0x1B, 0x80, 0x53, 0x05, 0x90, 0xDB, 0x9C, 0x90, 0xA0, 0x37, 0xE9, 0xFC, 0x22, 0x00, 0x85, 0x00, 0x62, 0x8A, 0xF1, 0x24,
0xC0, 0x13, 0x89, 0x2D, 0x10, 0xAE, 0x25, 0x40, 0x74, 0xF7, 0x60, 0xD4, 0xEE, 0x94, 0x00, 0xC1, 0x8B, 0x4B, 0x2A, 0x2D, 0xA7, 0x02, 0xF1, 0x44, 0xC5, 0x86, 0x07, 0x44, 0x20, 0x95, 0x76, 0x05,
0x1B, 0xDF, 0x8D, 0x93, 0x53, 0x05, 0x68, 0x5B, 0x02, 0x22, 0x5E, 0x25, 0xC8, 0xAE, 0x0A, 0xD2, 0x23, 0x10, 0x7C, 0x08, 0x37, 0x59, 0x71, 0x5A, 0x95, 0x2C, 0x4C, 0xA9, 0x74, 0x2A, 0x52, 0x67,
0xBB, 0x37, 0x44, 0xA7, 0xB7, 0x13, 0x82, 0x7B, 0x1F, 0x2A, 0x3D, 0x01, 0xC2, 0x73, 0x05, 0x52, 0x2A, 0x18, 0x59, 0xF4, 0x13, 0xEA, 0x0F, 0x2A, 0x5A, 0x03, 0x10, 0xD9, 0x06, 0xB7, 0x1B, 0x80,
0x1D, 0x81, 0x53, 0xA7, 0x00, 0xA8, 0xC0, 0x6B, 0xDF, 0x0B, 0x60, 0xFB, 0x47, 0x03, 0xEC, 0xFE, 0x53, 0x06, 0xC0, 0x23, 0x93, 0x2D, 0x10, 0xAE, 0x25, 0x40, 0x74, 0xF7, 0x60, 0xD4, 0xEE, 0x14,
0x08, 0x80, 0x22, 0x39, 0x44, 0xB0, 0x65, 0xBE, 0x5C, 0x73, 0x3C, 0x45, 0x25, 0xE0, 0x3E, 0xCF, 0x00, 0xC1, 0xBC, 0xDF, 0x8D, 0x93, 0x53, 0x06, 0x68, 0x5B, 0x02, 0x22, 0x3E, 0x25, 0xC8, 0xAE,
0x97, 0x6B, 0x7C, 0x47, 0xC8, 0xC1, 0xED, 0x89, 0x6E, 0x6D, 0xF4, 0x23, 0x55, 0xF4, 0xCF, 0xEA, 0x0A, 0xB2, 0x79, 0x6F, 0x88, 0x4E, 0x6F, 0x27, 0x04, 0xF7, 0x3E, 0xBB, 0x6C, 0x0A, 0x10, 0x4D,
0xE7, 0x8F, 0x55, 0xCE, 0x1F, 0xAC, 0x99, 0x7F, 0x56, 0x2D, 0x7F, 0xAC, 0x4E, 0xFE, 0x58, 0x85, 0x57, 0x20, 0xD5, 0x11, 0x38, 0x75, 0x72, 0x80, 0x0A, 0xBC, 0xF6, 0xBD, 0x00, 0xB6, 0x7F, 0x34,
0xFC, 0x97, 0x68, 0x63, 0xE9, 0x1A, 0xF1, 0xEC, 0x66, 0xD3, 0x33, 0xDE, 0x57, 0x51, 0x1D, 0x0F, 0xC0, 0xEE, 0x8F, 0x00, 0x28, 0xA2, 0x4D, 0x04, 0x5B, 0x04, 0xE0, 0x15, 0xA7, 0xA9, 0x88, 0x04,
0xFE, 0xD5, 0x8A, 0x7D, 0xC8, 0xDA, 0xEB, 0x8E, 0xE1, 0x6A, 0xAF, 0x1C, 0xA3, 0xAB, 0xBD, 0xEA, 0xBC, 0x67, 0x01, 0x78, 0x85, 0x97, 0x98, 0x1C, 0xAC, 0x77, 0x74, 0x2B, 0xA3, 0x1F, 0x29, 0xA2,
0x18, 0xB6, 0xCB, 0x7F, 0x2D, 0xED, 0x95, 0x2D, 0x2F, 0x5D, 0xC3, 0xB6, 0xC5, 0xA5, 0x25, 0x1A, 0x7F, 0x54, 0x3E, 0x7F, 0xAC, 0x70, 0xFE, 0x60, 0xC9, 0xFC, 0xA3, 0x62, 0xF9, 0x63, 0x65, 0xF2,
0xDB, 0x70, 0xB1, 0xF8, 0xA5, 0x67, 0xD8, 0x1D, 0xFE, 0xDB, 0xE3, 0x4D, 0x0E, 0x0C, 0x77, 0xE4, 0xC7, 0x0A, 0xE4, 0xBF, 0x45, 0x1A, 0x0B, 0xD3, 0x88, 0x87, 0x41, 0x9B, 0x96, 0xF1, 0xBE, 0x82,
0xC5, 0x31, 0xEC, 0x2E, 0xBF, 0x74, 0x79, 0x5B, 0x1B, 0xA1, 0xB6, 0xB5, 0x6F, 0x48, 0x60, 0x9A, 0xEA, 0x34, 0xE1, 0x5F, 0x25, 0x2F, 0x6C, 0x56, 0x5E, 0x77, 0x0C, 0x57, 0x7B, 0xE5, 0x18, 0x5D,
0x7C, 0x05, 0x0A, 0xF9, 0xD6, 0x4A, 0x4D, 0x54, 0x66, 0x35, 0x4E, 0xE9, 0x4E, 0x42, 0x45, 0x02, 0xED, 0x55, 0xC7, 0xB0, 0x5D, 0xFE, 0x69, 0x69, 0xAF, 0x6C, 0xF9, 0xE8, 0x1A, 0xB6, 0x2D, 0x1E,
0xFE, 0x05, 0x6B, 0x59, 0xAA, 0xDF, 0x28, 0xF1, 0xE8, 0x78, 0x48, 0x31, 0x0C, 0x19, 0x6A, 0x04, 0x2D, 0xD1, 0xD8, 0x86, 0x87, 0xC5, 0x1F, 0x3D, 0xC3, 0xEE, 0xF0, 0xCF, 0x1E, 0x6F, 0x72, 0x60,
0x22, 0xBC, 0x44, 0x31, 0x08, 0x44, 0x20, 0xA2, 0x97, 0x30, 0x20, 0xAA, 0xE3, 0xA1, 0xFA, 0x19, 0xB8, 0x23, 0x1F, 0x8E, 0x61, 0x77, 0xF9, 0xA3, 0xCB, 0xDB, 0xDA, 0x08, 0xB5, 0xAD, 0x7D, 0xC3,
0x54, 0x5E, 0xF1, 0x2C, 0xAB, 0x53, 0x83, 0xE5, 0x4C, 0xAB, 0xD3, 0x21, 0x6D, 0xB0, 0xE4, 0x55, 0x0D, 0x26, 0xF1, 0x17, 0xD8, 0x21, 0xAF, 0xD5, 0x54, 0x44, 0xAA, 0x57, 0xE1, 0x3B, 0xDD, 0xB9,
0xB2, 0xA6, 0xE9, 0xAF, 0x90, 0xD0, 0xD6, 0x75, 0xFD, 0xA4, 0xCE, 0x86, 0x6C, 0xA3, 0xED, 0xA9, 0x51, 0x11, 0xD1, 0x5F, 0x60, 0x72, 0x4C, 0xF5, 0x1B, 0xC5, 0x1F, 0xD5, 0x86, 0x14, 0xDD, 0x90,
0x69, 0xF7, 0xD9, 0x09, 0x7D, 0x6A, 0xF7, 0xAD, 0x12, 0x2A, 0x1E, 0x60, 0xF9, 0x6C, 0x32, 0xE7, 0xA1, 0x7A, 0x20, 0xC2, 0x73, 0x1E, 0x83, 0x80, 0x07, 0x22, 0x7A, 0x01, 0x03, 0x02, 0x01, 0x3C,
0xB9, 0x05, 0x2F, 0x70, 0x10, 0x43, 0x8C, 0xF9, 0x0C, 0xD3, 0x05, 0x4C, 0x1F, 0x06, 0xE1, 0x14, 0xA5, 0x3F, 0x83, 0x54, 0x2E, 0x9A, 0xA5, 0x55, 0x6A, 0xB0, 0x8C, 0x68, 0x55, 0x3A, 0xA4, 0x75,
0xA0, 0x11, 0x75, 0xE3, 0xE2, 0x8C, 0x8F, 0xEC, 0x6B, 0xE4, 0x98, 0x36, 0xC4, 0x2C, 0x83, 0x1D, 0x16, 0xBF, 0x8A, 0xD7, 0x34, 0xF9, 0x15, 0x22, 0xE4, 0xAA, 0xAE, 0x1F, 0x55, 0xD9, 0x90, 0x6D,
0x57, 0x87, 0x7C, 0x57, 0x1F, 0xCE, 0x13, 0xE6, 0x47, 0x9A, 0x78, 0x0D, 0x80, 0x4F, 0x62, 0xD8, 0xB4, 0x1D, 0x9B, 0x76, 0x9F, 0x1D, 0xD1, 0x63, 0xBB, 0x6F, 0x15, 0x50, 0xF1, 0x44, 0xCC, 0x63,
0x70, 0x78, 0x0E, 0x64, 0xA6, 0x81, 0x3A, 0x65, 0x05, 0xCF, 0x87, 0x67, 0xBC, 0x99, 0x4C, 0x56, 0x93, 0x39, 0x0F, 0x4F, 0x78, 0xC6, 0x84, 0x18, 0xA2, 0xCF, 0x67, 0x18, 0x2C, 0x60, 0xC4, 0x31,
0x4B, 0xF1, 0x02, 0xB6, 0x46, 0xF8, 0xD0, 0x93, 0x05, 0x85, 0xE4, 0x4E, 0x5B, 0x84, 0x31, 0x28, 0x08, 0xA6, 0x00, 0x8D, 0xA8, 0x95, 0x90, 0x33, 0x3E, 0xB2, 0xAF, 0x91, 0x1A, 0xAD, 0x8B, 0x59,
0x4D, 0x8D, 0x97, 0x10, 0xC2, 0x2F, 0xCC, 0x41, 0xAB, 0x86, 0xB5, 0x1E, 0xDC, 0x89, 0xD4, 0xAD, 0x06, 0xAB, 0x95, 0x87, 0x7C, 0x57, 0xBF, 0x9C, 0xC7, 0xCC, 0x0B, 0x35, 0x71, 0xAF, 0x80, 0x4F,
0x86, 0x2B, 0x24, 0xC5, 0x7C, 0xC8, 0x0A, 0x40, 0x88, 0x7C, 0xB2, 0x2C, 0x91, 0x37, 0xFB, 0x7F, 0x62, 0xD8, 0x70, 0x78, 0x0E, 0x84, 0xBA, 0xBE, 0x3A, 0x65, 0x05, 0xDF, 0x0F, 0xCF, 0x78, 0x3B,
0x26, 0x46, 0x90, 0x4C, 0x56, 0x0B, 0x90, 0x63, 0x63, 0x46, 0xD9, 0x8B, 0x88, 0xE2, 0xED, 0x2F, 0x99, 0xAC, 0x96, 0xE2, 0x46, 0xB7, 0x46, 0xF8, 0xD0, 0xA3, 0x05, 0x85, 0x68, 0x51, 0x5B, 0x04,
0xD7, 0xA7, 0x20, 0x3F, 0x59, 0x28, 0xEA, 0x8D, 0x30, 0x8E, 0x69, 0xFA, 0xFB, 0xF9, 0xEB, 0x57, 0x11, 0x08, 0x4D, 0x85, 0xE7, 0x24, 0xC2, 0x2E, 0xCC, 0x41, 0xAA, 0x86, 0x95, 0x1E, 0xBC, 0x89,
0x43, 0x66, 0x70, 0x76, 0x82, 0xA8, 0x9F, 0xA8, 0xA9, 0x93, 0xE0, 0x74, 0x58, 0xC9, 0xA6, 0x20, 0x58, 0xB0, 0x82, 0x2B, 0xC4, 0xF9, 0x7C, 0x88, 0x0A, 0x80, 0x89, 0x7C, 0xB2, 0xCC, 0xB9, 0x37,
0x8B, 0x61, 0xA7, 0x78, 0xB4, 0xFE, 0x66, 0x8A, 0x39, 0x95, 0x51, 0xE9, 0x13, 0x49, 0x8F, 0xA3, 0xFB, 0x7F, 0x26, 0x86, 0x1F, 0x4F, 0x56, 0x0B, 0xE0, 0x63, 0x7D, 0x46, 0xD9, 0x8B, 0x90, 0xE2,
0x0F, 0x38, 0x75, 0x2C, 0xCD, 0x2D, 0x4D, 0x7D, 0x55, 0xEE, 0x40, 0xEA, 0x53, 0xC9, 0xDA, 0x60, 0xEB, 0x2F, 0xD7, 0x27, 0xC0, 0x3F, 0x99, 0x79, 0xEA, 0xF5, 0x20, 0x8A, 0x68, 0xF2, 0xFB, 0xF9,
0x08, 0xAD, 0x5B, 0x90, 0xC6, 0xD8, 0xF7, 0xC8, 0x82, 0x30, 0xC1, 0x82, 0x54, 0x48, 0xB1, 0xD8, 0xEB, 0x57, 0x43, 0x66, 0x70, 0x72, 0x02, 0xAB, 0x9F, 0xA8, 0xA1, 0x93, 0xA0, 0x74, 0x50, 0x8A,
0x32, 0x23, 0x02, 0xD5, 0x8C, 0x30, 0xCF, 0x06, 0xFF, 0x50, 0x1B, 0x41, 0xE5, 0x8A, 0x95, 0x54, 0xA6, 0x20, 0x8A, 0x61, 0x27, 0x78, 0x56, 0xFF, 0x76, 0x8A, 0x31, 0x95, 0x51, 0xEA, 0x13, 0x41,
0x5E, 0x28, 0x91, 0x5B, 0xDA, 0xE0, 0xBA, 0xD5, 0x00, 0xFC, 0x58, 0x3D, 0xD7, 0x3B, 0x55, 0x7D, 0x8F, 0xA3, 0x0F, 0xF8, 0xEE, 0x58, 0x92, 0x69, 0x9A, 0x7A, 0xF7, 0xEE, 0x40, 0xE8, 0x53, 0x8A,
0xB7, 0x34, 0xBB, 0x81, 0x25, 0xA0, 0xC1, 0xF8, 0x45, 0xBF, 0xD5, 0x91, 0x6B, 0x43, 0x95, 0x45, 0xDA, 0x60, 0x08, 0xAD, 0x5A, 0x10, 0xC6, 0xD8, 0xF7, 0x88, 0x82, 0x30, 0xC0, 0x82, 0x50, 0x48,
0x47, 0x47, 0x75, 0xD0, 0x4B, 0x4B, 0xE7, 0x39, 0x26, 0x32, 0x30, 0xC1, 0x74, 0x36, 0x1A, 0x5A, 0xD1, 0xD8, 0x22, 0x22, 0x02, 0xD1, 0x0C, 0x31, 0x70, 0x07, 0xFB, 0x50, 0x19, 0x41, 0x2A, 0x8C,
0x83, 0xE8, 0x24, 0x5F, 0x4D, 0x70, 0x6A, 0x10, 0x1D, 0x1F, 0xEB, 0xC4, 0xB4, 0x81, 0xEB, 0x02, 0xA9, 0x59, 0x96, 0x79, 0x91, 0x5B, 0x5A, 0xE7, 0xB2, 0x55, 0x07, 0xFC, 0x58, 0x35, 0x93, 0x3B,
0x7A, 0x5D, 0xF6, 0x7F, 0x8C, 0x3E, 0x37, 0x70, 0xAB, 0x45, 0x07, 0x58, 0x9C, 0x95, 0xE7, 0xEF, 0x55, 0x7C, 0xB7, 0x24, 0xBB, 0x8E, 0x39, 0xA5, 0xC1, 0xF8, 0x43, 0xBF, 0xD5, 0x91, 0x6A, 0x43,
0x46, 0x52, 0x65, 0x78, 0x31, 0x09, 0x4E, 0x48, 0xF5, 0x3C, 0x8A, 0x43, 0xDA, 0xE1, 0x84, 0xB4, 0x95, 0x44, 0x4F, 0x9F, 0x56, 0x41, 0x2E, 0x2D, 0x9D, 0xC7, 0x98, 0x48, 0xC0, 0x10, 0x83, 0xDD,
0xD1, 0x27, 0x56, 0xFA, 0x21, 0xDB, 0x70, 0xC0, 0x8F, 0x18, 0x8E, 0x8D, 0xDE, 0xC8, 0xC1, 0xFB, 0x18, 0xA2, 0xD7, 0xF8, 0x28, 0x5B, 0x4D, 0x50, 0x6A, 0x10, 0xD7, 0x6A, 0x3A, 0x31, 0x6D, 0xA0,
0xB6, 0xB8, 0x74, 0x78, 0x9B, 0x8D, 0x1E, 0xE4, 0x95, 0xED, 0xC8, 0x5F, 0x5B, 0xC3, 0x61, 0xF6, 0xBA, 0x80, 0x5E, 0x95, 0xFD, 0x1F, 0xE3, 0xCF, 0x75, 0xAC, 0xDD, 0xE8, 0x00, 0x8B, 0x93, 0xF2,
0x3D, 0x7C, 0x0A, 0xBE, 0x17, 0xA3, 0x5D, 0xD9, 0x22, 0x12, 0x5F, 0xE3, 0xB5, 0xA6, 0x5D, 0x39, 0xFC, 0x74, 0x24, 0x45, 0x86, 0x67, 0xA7, 0x60, 0x84, 0x54, 0xCB, 0xA3, 0x18, 0xA4, 0x1D, 0x46,
0x70, 0x01, 0xDF, 0x7B, 0xED, 0xF0, 0x28, 0xB8, 0x01, 0x41, 0x3C, 0x9A, 0x12, 0x79, 0xBB, 0xD6, 0x48, 0x1B, 0x69, 0xF0, 0x5F, 0x61, 0x89, 0x6C, 0xC3, 0x01, 0x4B, 0x62, 0x38, 0x36, 0xDA, 0x23,
0xCC, 0x49, 0x94, 0x5B, 0x46, 0x3C, 0x8B, 0x85, 0x86, 0xDA, 0xC9, 0xF9, 0x73, 0x99, 0x3D, 0x7F, 0x07, 0xDF, 0xDB, 0xE2, 0xD1, 0xE1, 0x6D, 0x36, 0xDA, 0x90, 0x57, 0xB6, 0x23, 0x3F, 0x6D, 0x0D,
0x92, 0xE9, 0xF3, 0xA7, 0xDC, 0x87, 0x93, 0xE2, 0xD5, 0x83, 0xE5, 0xD5, 0x40, 0xD9, 0x88, 0xAE, 0x87, 0xD9, 0xF7, 0xB0, 0x2A, 0x78, 0xD5, 0x46, 0xBB, 0xB2, 0x85, 0x2F, 0xBE, 0xC6, 0x67, 0x45,
0x81, 0x3D, 0x70, 0x07, 0xA6, 0x30, 0x14, 0xE5, 0x75, 0x5C, 0x2B, 0xF6, 0xA6, 0xC5, 0xD6, 0x74, 0xBB, 0x72, 0xE0, 0x01, 0xD6, 0xF7, 0xDA, 0xE1, 0x7E, 0x70, 0x03, 0x82, 0xF8, 0x6A, 0x4A, 0xF4,
0xA5, 0xE4, 0x52, 0x76, 0xA2, 0x6B, 0xB8, 0xF2, 0xC6, 0x64, 0x83, 0xF0, 0x77, 0x4A, 0x1A, 0xF8, 0xED, 0x4A, 0x23, 0xDB, 0xA4, 0xAC, 0x42, 0xF1, 0x38, 0x16, 0x1A, 0x2A, 0x47, 0xE7, 0xCF, 0x65,
0xB7, 0x3A, 0x8D, 0xD9, 0x37, 0x90, 0xDA, 0xC6, 0x80, 0xA3, 0x23, 0x65, 0xC4, 0x76, 0xF7, 0xF7, 0xFC, 0xFC, 0x49, 0x06, 0xD0, 0x9F, 0x32, 0x2B, 0x4E, 0xF2, 0xDB, 0x0C, 0xCB, 0xAB, 0x81, 0x52,
0xEF, 0xA8, 0x18, 0xB6, 0x2E, 0xA9, 0x14, 0xE5, 0x17, 0xEE, 0x74, 0x9F, 0x3F, 0x1F, 0x01, 0x8D, 0xDB, 0xAE, 0x80, 0x46, 0x70, 0x13, 0xA6, 0x90, 0x14, 0x39, 0x56, 0xAB, 0xE4, 0xE5, 0x6E, 0x51,
0x82, 0xDA, 0x0D, 0x0D, 0x90, 0x63, 0x79, 0xAF, 0xD2, 0x35, 0xF7, 0xB3, 0x37, 0xEB, 0xF8, 0x6D, 0xED, 0x2E, 0x65, 0x71, 0x4A, 0x71, 0xBB, 0x82, 0x2B, 0x6F, 0x4C, 0x36, 0x08, 0xBF, 0xA6, 0x52,
0x9A, 0x2C, 0x69, 0xCA, 0xAE, 0xEB, 0x84, 0x6F, 0x46, 0xE9, 0x4F, 0xEB, 0xA0, 0x6A, 0x96, 0x98, 0xC7, 0x3F, 0xFF, 0xA9, 0xCF, 0xBE, 0x01, 0xDF, 0x36, 0x06, 0x3C, 0x7D, 0xAA, 0x8C, 0xD8, 0xEE,
0xB2, 0x03, 0x1E, 0x0E, 0x52, 0xE0, 0xE9, 0xFD, 0x7C, 0xA0, 0x84, 0x2F, 0x1F, 0x73, 0x75, 0xB2, 0xFE, 0xFE, 0x1D, 0x45, 0xC3, 0xD6, 0xE5, 0x2E, 0x45, 0x46, 0x87, 0xC5, 0xF3, 0xF3, 0xE7, 0x23,
0x7E, 0xAE, 0xA9, 0xDC, 0xF9, 0x24, 0x77, 0x37, 0x3F, 0x11, 0xC5, 0x80, 0x9F, 0x43, 0xE4, 0x60, 0xD8, 0xA3, 0xD8, 0xED, 0x86, 0x0C, 0xC8, 0xB1, 0xBC, 0x57, 0xE9, 0x9A, 0x7B, 0xE9, 0xDB, 0x75,
0xB4, 0xCE, 0xFD, 0x53, 0x95, 0xD1, 0xA4, 0xA6, 0x63, 0x75, 0x82, 0x40, 0xD5, 0x12, 0xA3, 0x42, 0xF4, 0x2E, 0x89, 0x97, 0x34, 0x61, 0xD7, 0x55, 0xC2, 0xEB, 0x5B, 0xFA, 0x71, 0x15, 0x84, 0xCD,
0x3B, 0x2E, 0x2D, 0x2C, 0x11, 0x7F, 0x50, 0xC7, 0x4B, 0xA3, 0xC9, 0xC0, 0x5E, 0xB2, 0x4D, 0x7B, 0x12, 0x53, 0x76, 0xC0, 0xC3, 0x41, 0x0A, 0x3C, 0xBD, 0x9F, 0x0D, 0x94, 0xF0, 0xE5, 0xD7, 0x4C,
0xC9, 0xA4, 0xBD, 0x0C, 0x37, 0xED, 0x25, 0xDB, 0xB6, 0x97, 0x47, 0x59, 0x8A, 0x62, 0x27, 0x3D, 0xA0, 0xAC, 0x9F, 0x2B, 0x2A, 0x75, 0x3E, 0xC9, 0x82, 0xE9, 0x27, 0xA2, 0xA8, 0xF0, 0x73, 0xF0,
0x11, 0x92, 0x7B, 0x18, 0x5C, 0x21, 0x30, 0x43, 0x0C, 0x96, 0x3F, 0x2D, 0x0C, 0xB3, 0x1E, 0xDA, 0x1D, 0x8C, 0x56, 0xB9, 0x85, 0x2A, 0x13, 0x9A, 0x54, 0x74, 0xCC, 0x4F, 0x10, 0xA8, 0x9A, 0x64,
0x85, 0x87, 0x96, 0xD4, 0xE2, 0xE6, 0xE4, 0xF0, 0xA1, 0x78, 0xC1, 0xE0, 0x8C, 0xC6, 0xE5, 0xF2, 0x94, 0xF6, 0x8E, 0x4B, 0x0B, 0x5D, 0xC4, 0x0F, 0x94, 0xF2, 0x42, 0x6D, 0x52, 0xD0, 0x98, 0x74,
0xF9, 0x2D, 0xFE, 0xEB, 0x08, 0xDB, 0x82, 0xFE, 0xFB, 0xC5, 0xE6, 0x52, 0xF9, 0xB9, 0x40, 0xAA, 0x53, 0x63, 0x52, 0xA9, 0x31, 0xC3, 0x4D, 0x8D, 0x49, 0xB7, 0x35, 0xE6, 0x51, 0xBA, 0xA2, 0xE8,
0xB5, 0xA3, 0x56, 0xA8, 0x69, 0x91, 0xC9, 0x6C, 0xBF, 0x75, 0xA5, 0x7A, 0x59, 0x25, 0xBC, 0x2B, 0x49, 0x4F, 0x38, 0xE5, 0x1E, 0xBA, 0x57, 0x70, 0xCD, 0xE0, 0x85, 0xE5, 0x47, 0x0B, 0x1D, 0x6D,
0x82, 0xCA, 0x4A, 0x41, 0x0D, 0x72, 0x49, 0x6D, 0xF4, 0x95, 0xCA, 0x52, 0x68, 0x89, 0xA2, 0x2E, 0x13, 0xF5, 0xA2, 0x89, 0x9A, 0xD4, 0xE2, 0xEA, 0xE4, 0xF0, 0xA1, 0xF8, 0x40, 0xF7, 0x8C, 0xCA,
0xCA, 0xE0, 0xDD, 0xEA, 0x68, 0xA8, 0xDA, 0xF8, 0x70, 0xAD, 0xDA, 0x8F, 0xEF, 0xA3, 0x14, 0x6B, 0xE5, 0xF2, 0xF9, 0x2D, 0xFE, 0xE9, 0x08, 0xDD, 0x82, 0xFE, 0xFB, 0x79, 0xE7, 0x42, 0xF8, 0x39,
0x6F, 0x3C, 0xCC, 0xF7, 0x72, 0xD5, 0x80, 0x98, 0x3C, 0x25, 0xA4, 0x4F, 0x70, 0x73, 0xF7, 0x40, 0x43, 0xCA, 0xD9, 0xA3, 0x96, 0x8B, 0x69, 0x1E, 0xCB, 0x6C, 0x5F, 0xE4, 0x52, 0xED, 0xAC, 0xE2,
0x20, 0xC5, 0x73, 0x26, 0x75, 0x52, 0xFC, 0x94, 0xE0, 0xA9, 0x90, 0x56, 0xF1, 0x12, 0x5A, 0x98, 0xE0, 0x15, 0x46, 0xA5, 0x05, 0xA3, 0x06, 0x19, 0xA7, 0x36, 0xFA, 0x0A, 0x61, 0xC9, 0xA5, 0x44,
0x41, 0x80, 0xCF, 0x32, 0x75, 0x47, 0x4F, 0x1C, 0xCC, 0x68, 0x21, 0x83, 0x35, 0x72, 0x97, 0x55, 0x11, 0x17, 0x65, 0xF0, 0x6E, 0x71, 0x34, 0x54, 0x69, 0x7C, 0xB8, 0x54, 0xED, 0xC7, 0xF7, 0x51,
0x6B, 0xD6, 0x24, 0x4B, 0xB4, 0xDA, 0xC6, 0x86, 0x4E, 0x6D, 0xF4, 0x5B, 0xA2, 0xB1, 0x44, 0x13, 0x82, 0xB5, 0xD7, 0x23, 0x66, 0xE5, 0x61, 0xD5, 0x25, 0x86, 0xC7, 0x84, 0xF4, 0x09, 0xD6, 0x8B,
0x6F, 0xCF, 0x84, 0xE5, 0xF1, 0x9D, 0x3F, 0x3A, 0x80, 0x5D, 0xB9, 0x9D, 0x5C, 0x8D, 0xF4, 0x7B, 0x0F, 0xB8, 0x52, 0x3C, 0xBA, 0x52, 0x27, 0x45, 0xC7, 0x04, 0x0F, 0x9A, 0xB4, 0x92, 0x95, 0xD0,
0x27, 0xF0, 0xFD, 0xF7, 0x0A, 0x3D, 0x72, 0x8F, 0xA5, 0x4C, 0xC7, 0xA4, 0xB9, 0x63, 0x92, 0x88, 0x82, 0x14, 0x5C, 0x7C, 0x9A, 0xAA, 0x45, 0x42, 0x51, 0xD0, 0xD0, 0x02, 0x06, 0x6B, 0x64, 0x26,
0x07, 0x7D, 0xE9, 0xA2, 0x4E, 0x7E, 0x15, 0x37, 0x5A, 0x80, 0x5D, 0x38, 0x26, 0x99, 0xA2, 0x4E, 0xAB, 0xD2, 0xA8, 0x48, 0x92, 0x68, 0x95, 0x8D, 0x1A, 0x51, 0x65, 0xF4, 0x5B, 0xAC, 0xB1, 0x58,
0x8B, 0xAC, 0x08, 0xEC, 0xB1, 0x92, 0x3A, 0xF2, 0x41, 0xC0, 0x52, 0xBA, 0x05, 0x33, 0xCF, 0x3D, 0x13, 0x17, 0x72, 0x82, 0xE2, 0x44, 0xD0, 0x1B, 0x1D, 0xC0, 0xAE, 0xA8, 0x50, 0x97, 0x7D, 0xFD,
0x0F, 0x81, 0x85, 0x31, 0xA0, 0xC7, 0x49, 0x7A, 0x7D, 0x00, 0x36, 0x8C, 0xA9, 0x82, 0x57, 0x8E, 0xDE, 0x09, 0xBC, 0xA4, 0x5F, 0xDA, 0x8F, 0xAC, 0xB2, 0x14, 0x01, 0x99, 0x54, 0x77, 0x0C, 0x13,
0x69, 0xE4, 0x5E, 0xD1, 0x32, 0x85, 0x80, 0xCE, 0xEA, 0xE4, 0x79, 0x0E, 0x8E, 0xEF, 0xE9, 0x42, 0xF1, 0xEC, 0x30, 0x59, 0x54, 0xC9, 0xAF, 0xE2, 0x45, 0xF3, 0xB1, 0x0B, 0xC7, 0xC4, 0x53, 0x94,
0xF6, 0x03, 0x4A, 0x12, 0xAF, 0xA2, 0x08, 0xFC, 0xF6, 0x06, 0xE8, 0x49, 0x0E, 0x03, 0x95, 0x1E, 0x69, 0x11, 0x17, 0x81, 0x3E, 0x96, 0x82, 0x47, 0x3E, 0x08, 0x48, 0x4A, 0xB7, 0x60, 0x66, 0xD1,
0x1C, 0xCF, 0x02, 0xD2, 0xD5, 0x72, 0x05, 0x75, 0x28, 0xCF, 0x1B, 0x70, 0x99, 0x78, 0x18, 0xD3, 0xE7, 0x21, 0xB0, 0x30, 0x06, 0xE4, 0x38, 0x4E, 0xAE, 0x0F, 0xC0, 0x86, 0x31, 0x65, 0xF0, 0xCA,
0xB5, 0xF6, 0x5F, 0xAF, 0x5F, 0xFD, 0xCE, 0xD8, 0xF2, 0x1D, 0xBD, 0x58, 0x41, 0xFA, 0x6A, 0x84, 0xC9, 0x8F, 0xAC, 0x16, 0x2D, 0x13, 0x70, 0xE9, 0xAC, 0x4A, 0x9E, 0x67, 0xE0, 0x78, 0x99, 0x18,
0x43, 0xD2, 0xE4, 0xCA, 0xFC, 0x54, 0xBC, 0xCE, 0x3A, 0x04, 0x32, 0xF6, 0xEB, 0xE5, 0xA6, 0x7A, 0xE2, 0x1F, 0x10, 0x92, 0x68, 0x15, 0x86, 0x60, 0xB7, 0x37, 0x40, 0x4F, 0x32, 0x18, 0x28, 0xF4,
0x21, 0x4F, 0x62, 0xC0, 0x18, 0x34, 0xA9, 0xD1, 0x68, 0xE0, 0x06, 0x0F, 0x24, 0x9B, 0x08, 0x4E, 0x60, 0x78, 0x16, 0x10, 0xB0, 0x16, 0x2B, 0xA8, 0x43, 0x79, 0xE4, 0x80, 0xCB, 0x44, 0xC3, 0x88,
0x6C, 0x49, 0x1F, 0xD3, 0x78, 0x92, 0x04, 0xF4, 0xFD, 0xBB, 0xD3, 0x3A, 0xD3, 0x45, 0xA7, 0xD8, 0xAE, 0xB5, 0xFF, 0x7A, 0xFD, 0xEA, 0x77, 0xC6, 0x96, 0xA7, 0xF4, 0x72, 0x05, 0x01, 0xAC, 0x11,
0xB9, 0x53, 0x3A, 0xD4, 0xDC, 0xCE, 0x88, 0x1B, 0x49, 0x0C, 0x84, 0x05, 0xD7, 0x98, 0x10, 0xD2, 0x0C, 0x49, 0x83, 0x0B, 0xF3, 0xB1, 0xB8, 0x21, 0x3B, 0x84, 0x6D, 0xEC, 0x97, 0xCB, 0x4D, 0xF1,
0x09, 0x24, 0x67, 0x33, 0x3A, 0x2C, 0x32, 0x20, 0xFD, 0xC6, 0x1B, 0x0E, 0xE3, 0x06, 0x1F, 0x80, 0x42, 0x9A, 0x44, 0x80, 0x31, 0x48, 0x52, 0xBD, 0x5E, 0xC7, 0x12, 0x0F, 0x84, 0x9B, 0x08, 0x4E,
0xF9, 0x34, 0xF0, 0xA4, 0xEE, 0x58, 0x16, 0xB6, 0x89, 0x04, 0xF2, 0xE9, 0x8E, 0xDC, 0xFC, 0x3F, 0x54, 0xB9, 0x6B, 0x34, 0xC2, 0x9A, 0xD9, 0xFB, 0xD3, 0x93, 0x2A, 0xD3, 0x45, 0xA7, 0x28, 0xFF,
0xCF, 0xDE, 0xFC, 0x01, 0x71, 0x37, 0x85, 0x84, 0x1E, 0xA7, 0x66, 0xCB, 0x24, 0xCE, 0xE8, 0x39, 0x29, 0x1D, 0x6A, 0x74, 0x67, 0x44, 0xF5, 0x38, 0x82, 0x8D, 0xF9, 0xD7, 0x18, 0x12, 0xD2, 0x09,
0xBD, 0x62, 0xBA, 0xDE, 0xF7, 0x2C, 0x5B, 0x99, 0xFC, 0xEE, 0x55, 0x5D, 0xEF, 0xD7, 0x41, 0xDC, 0x84, 0x67, 0x33, 0x3A, 0xCC, 0x63, 0x20, 0xFD, 0xA6, 0x39, 0x1C, 0x46, 0x75, 0x3E, 0x00, 0x23,
0x59, 0x12, 0xD1, 0x46, 0x94, 0xCC, 0xEA, 0x79, 0x97, 0x6E, 0xBC, 0xFC, 0xF0, 0x22, 0x4D, 0x21, 0x6A, 0xA0, 0x49, 0xD5, 0xB1, 0x2C, 0x6C, 0x13, 0x21, 0xE4, 0xF1, 0x8E, 0xE8, 0xFC, 0x3F, 0xCF,
0x0C, 0xE8, 0xC0, 0x65, 0xC4, 0x72, 0x49, 0xE3, 0x3A, 0xF9, 0xED, 0xC5, 0x39, 0x90, 0x6C, 0x40, 0xDE, 0xBE, 0x01, 0xBF, 0x9B, 0x40, 0x48, 0x8F, 0x53, 0xD3, 0x65, 0x1C, 0xA5, 0xF4, 0x9C, 0x5E,
0x5E, 0x05, 0x4D, 0x19, 0xB0, 0xBC, 0xBE, 0x21, 0x02, 0xB1, 0xBB, 0x2F, 0x65, 0x7C, 0xD0, 0x2A, 0x31, 0x5D, 0xEF, 0x37, 0x2D, 0x5B, 0x99, 0x7C, 0xFA, 0xAA, 0xAA, 0xF7, 0xAB, 0xC0, 0xEE, 0x34,
0xF2, 0x03, 0x07, 0x5D, 0x78, 0x16, 0x2C, 0x20, 0x2C, 0x0C, 0xD6, 0x22, 0xC8, 0xE8, 0x37, 0x7B, 0x0E, 0x69, 0x3D, 0x8C, 0x67, 0xD5, 0xAC, 0x4B, 0x37, 0x5E, 0x7E, 0x78, 0x81, 0x25, 0x40, 0x20,
0x27, 0x57, 0x0F, 0x54, 0xF5, 0x46, 0xE5, 0xEC, 0x34, 0x17, 0xCB, 0x7E, 0xFB, 0x4A, 0x67, 0x30, 0xB2, 0x7E, 0x8B, 0x58, 0x2E, 0x69, 0x54, 0x25, 0xBF, 0xBD, 0x38, 0x87, 0x2D, 0x1B, 0x10, 0x59,
0x87, 0x7B, 0xEC, 0x46, 0xB9, 0xF3, 0x2F, 0x4F, 0x01, 0x22, 0x4A, 0x06, 0xA2, 0xAC, 0x41, 0xBD, 0x41, 0x53, 0x0A, 0x24, 0xAF, 0x6E, 0xB0, 0x40, 0x1C, 0x18, 0x48, 0x1E, 0x1F, 0xD4, 0x8A, 0xEC,
0x79, 0x99, 0xA4, 0x8B, 0xE7, 0x3E, 0xF3, 0x07, 0xAC, 0xE1, 0x2F, 0x97, 0x48, 0xAC, 0xB0, 0x4E, 0x0C, 0x43, 0x17, 0x96, 0x05, 0x53, 0x08, 0x0B, 0x9D, 0xB5, 0x70, 0x32, 0xFA, 0xCD, 0xDE, 0xC9,
0x35, 0xDB, 0x2E, 0x43, 0x65, 0x0C, 0xA1, 0x32, 0x3E, 0xC9, 0xF1, 0x1F, 0xC4, 0x10, 0x24, 0x65, 0xE5, 0x33, 0x5A, 0xBD, 0x5E, 0x3A, 0x8E, 0xCD, 0xD8, 0xB2, 0x5F, 0xBF, 0x92, 0x19, 0xCC, 0xE1,
0xE2, 0x4E, 0x3F, 0xC6, 0x9F, 0xC1, 0x0B, 0xAB, 0x15, 0x5D, 0x28, 0xBD, 0xE8, 0x19, 0x29, 0x81, 0x16, 0xBB, 0x5E, 0x1C, 0x26, 0xC8, 0x83, 0x85, 0x90, 0x92, 0x81, 0x48, 0x6C, 0x50, 0x6E, 0x5E,
0x27, 0x46, 0x28, 0xC2, 0xA7, 0x51, 0xAE, 0x57, 0x1E, 0xC3, 0x00, 0xD7, 0xB7, 0x01, 0xE8, 0xB7, 0xC6, 0xC9, 0xE2, 0xB9, 0xC7, 0xBC, 0x01, 0xAB, 0x7B, 0xCB, 0x25, 0x6E, 0x56, 0x68, 0xA7, 0x1A,
0xB8, 0x42, 0xB4, 0x43, 0xCB, 0x07, 0x91, 0x94, 0xD8, 0xDB, 0x37, 0x67, 0xE7, 0x58, 0x53, 0x70, 0x6F, 0x17, 0xAE, 0x32, 0x02, 0x57, 0x19, 0x1D, 0x65, 0xF8, 0x0F, 0x22, 0x70, 0x92, 0x32, 0x74,
0x38, 0x84, 0x4B, 0x2E, 0x6A, 0x08, 0x16, 0x36, 0x20, 0x5E, 0xBD, 0xB8, 0x04, 0x88, 0xAF, 0xC0, 0xA7, 0x1F, 0xA3, 0xCF, 0x60, 0x85, 0xD5, 0x9C, 0x2E, 0x90, 0x56, 0xF4, 0x8C, 0x14, 0xC0, 0x43,
0x3F, 0x51, 0x50, 0x70, 0xE4, 0x8E, 0x38, 0x33, 0x21, 0x46, 0x99, 0x84, 0xEB, 0x37, 0x20, 0x9A, 0x23, 0x10, 0xEE, 0xD3, 0x28, 0xD6, 0x2B, 0x4E, 0x76, 0x80, 0xEA, 0xDB, 0x00, 0xF4, 0xDB, 0x6A,
0x9C, 0x2E, 0x30, 0xB1, 0xE5, 0x8A, 0x6F, 0x5F, 0xE6, 0x05, 0x20, 0xEA, 0x8D, 0x1F, 0xD0, 0xA0, 0xA9, 0xE2, 0xBC, 0x43, 0xDC, 0x75, 0xC9, 0xB9, 0x77, 0x6F, 0xCF, 0xCE, 0x31, 0xBB, 0xE0, 0xF0,
0x29, 0x0B, 0xB6, 0xFF, 0x80, 0xDA, 0x69, 0xBF, 0x39, 0x09, 0xF6, 0x0B, 0x91, 0x1D, 0xF0, 0x82, 0x08, 0xE7, 0x60, 0x69, 0x6A, 0x5D, 0x3E, 0xC0, 0x87, 0xBD, 0xF8, 0x0A, 0xAB, 0xBC, 0x02, 0x9B,
0x77, 0xC9, 0x58, 0x43, 0x21, 0x1F, 0x63, 0xF1, 0xFA, 0x12, 0x5F, 0x34, 0xAE, 0x5B, 0x3A, 0x56, 0x45, 0x41, 0xE8, 0x91, 0x62, 0xE2, 0x68, 0x86, 0x18, 0x45, 0x68, 0xAE, 0xDF, 0x00, 0xBB, 0xB2,
0x5B, 0xB7, 0xB7, 0x06, 0x26, 0x76, 0x40, 0x7A, 0x8C, 0xE3, 0x54, 0x33, 0xE2, 0x46, 0x33, 0x8C, 0xBD, 0x82, 0xDA, 0x2D, 0x57, 0xBC, 0xA8, 0x99, 0xA5, 0x85, 0x28, 0x4B, 0x9E, 0x4F, 0xFD, 0x86,
0x72, 0xC5, 0xAF, 0x3F, 0x6E, 0xE5, 0x47, 0xE8, 0x95, 0x3C, 0x52, 0x3A, 0x1C, 0x21, 0x4A, 0x5B, 0x4C, 0xE3, 0xFE, 0x03, 0x32, 0xAA, 0xFD, 0x2A, 0x26, 0x58, 0x22, 0xD8, 0x78, 0xC0, 0x32, 0xDE,
0x90, 0xCB, 0xC1, 0xF8, 0x83, 0x76, 0x1D, 0x6D, 0xD8, 0xB5, 0xDE, 0xF7, 0x23, 0x08, 0xFA, 0x75, 0xC5, 0x77, 0x0D, 0x19, 0x5F, 0xC3, 0x94, 0xF6, 0x25, 0xDE, 0x67, 0xAE, 0x5A, 0x3A, 0xE6, 0x60,
0xF2, 0x2C, 0xD6, 0x28, 0x9A, 0xAD, 0x86, 0x75, 0x28, 0xA8, 0x4B, 0xF0, 0x84, 0x80, 0xF9, 0x46, 0xB7, 0xB7, 0x06, 0x0F, 0xF6, 0x8A, 0x0A, 0xB6, 0xBD, 0xB1, 0xF1, 0x38, 0xE2, 0xCD, 0x8A, 0xCE,
0xC2, 0x56, 0x99, 0x7E, 0x5B, 0x5A, 0xEB, 0xEF, 0x61, 0x40, 0x9F, 0x45, 0x11, 0xCA, 0xB7, 0xD8, 0x71, 0x0D, 0x1B, 0x96, 0x47, 0x49, 0x8D, 0xA9, 0x3E, 0x0E, 0xBD, 0x47, 0x08, 0xA4, 0x3C, 0xDE,
0xEF, 0xB7, 0xB6, 0xF7, 0xFB, 0x8F, 0x8E, 0x8A, 0xA3, 0x88, 0xC6, 0x24, 0x4A, 0x70, 0x93, 0xA0, 0x3A, 0xEC, 0x5A, 0x0A, 0x25, 0x92, 0xCB, 0xC1, 0xF8, 0x83, 0x06, 0xA1, 0xBC, 0xA9, 0xB2, 0x71,
0xA4, 0x85, 0xBF, 0x38, 0x3A, 0xAC, 0x3E, 0x1E, 0x93, 0x3A, 0xE0, 0x3E, 0x11, 0x5E, 0x92, 0x06, 0xD0, 0xFB, 0xA2, 0x59, 0xEA, 0xFD, 0xED, 0x06, 0x9D, 0xB8, 0xBA, 0x33, 0xFD, 0xB6, 0x50, 0x78,
0xFA, 0x03, 0x42, 0x37, 0xDD, 0x3F, 0x54, 0x79, 0x2B, 0x24, 0xE7, 0xB2, 0x7C, 0xAD, 0x76, 0x48, 0x08, 0x78, 0xDE, 0xAC, 0x16, 0x63, 0x10, 0x12, 0x6E, 0x71, 0x0B, 0x4D, 0x40, 0xB6, 0xCB, 0xD8,
0xF0, 0xBD, 0xDA, 0x03, 0xAB, 0x14, 0x67, 0xAA, 0xBB, 0x27, 0x96, 0x1C, 0x29, 0x3C, 0xDE, 0x4D, 0x10, 0xAC, 0xB9, 0x14, 0x93, 0x23, 0x36, 0xD0, 0xC1, 0xD8, 0x5A, 0xA4, 0x16, 0x65, 0x45, 0xF1,
0xCE, 0x1B, 0xF2, 0xD2, 0x07, 0xF6, 0x07, 0x18, 0xF6, 0xCB, 0xF3, 0x12, 0x7C, 0x05, 0x16, 0xD2, 0xA8, 0x80, 0x05, 0xBB, 0x7B, 0xF7, 0x2B, 0xBA, 0xFA, 0xDC, 0x7A, 0xA0, 0x2C, 0x83, 0xFA, 0xD1,
0xD3, 0x97, 0x1F, 0x9E, 0xA8, 0x3B, 0x2F, 0x2F, 0x3F, 0xBC, 0xF9, 0x5A, 0x3F, 0xE0, 0xB5, 0xF6, 0xBC, 0x82, 0x8E, 0x14, 0x78, 0x09, 0xAE, 0xE1, 0x5F, 0x14, 0xFD, 0x61, 0x8D, 0x98, 0xA4, 0xA6,
0xC5, 0x11, 0x0A, 0x4A, 0x55, 0x9E, 0xD9, 0x80, 0x7B, 0x7F, 0x14, 0x0B, 0xF8, 0x9F, 0x82, 0x40, 0x60, 0x80, 0xBD, 0xAF, 0xE3, 0x88, 0xCD, 0xA1, 0x0B, 0x62, 0xBC, 0x9D, 0xFD, 0x08, 0x0E, 0x82,
0xAE, 0x57, 0x1C, 0x05, 0x1D, 0x04, 0xB4, 0x97, 0x21, 0x12, 0x4C, 0x49, 0xD5, 0x69, 0x1C, 0xB2, 0x94, 0xDD, 0x9D, 0xBF, 0xC7, 0x90, 0x21, 0xEF, 0xED, 0x7D, 0x1D, 0x44, 0x2B, 0x46, 0xF7, 0xF7,
0xF7, 0xA7, 0xF5, 0x03, 0xD1, 0x94, 0xF2, 0xF7, 0x8D, 0x78, 0xDC, 0x7D, 0x3A, 0x59, 0x04, 0x95, 0x9F, 0x51, 0x30, 0xA3, 0xBE, 0xE8, 0x2F, 0x76, 0xF5, 0x7B, 0xE0, 0xD3, 0x67, 0x61, 0x88, 0x0A,
0x40, 0x47, 0x3E, 0x42, 0xB2, 0xD4, 0xB5, 0xAC, 0xCF, 0x10, 0xD3, 0xF7, 0x1C, 0x3C, 0x6D, 0x9F, 0x93, 0x9F, 0xC4, 0x58, 0xDB, 0x27, 0x31, 0x4F, 0x9F, 0xE6, 0x47, 0x48, 0xF5, 0x49, 0x18, 0x63,
0x66, 0xDD, 0x15, 0x10, 0xC1, 0x19, 0x6D, 0xC4, 0xC4, 0x3C, 0xDC, 0x88, 0x5D, 0xA8, 0x4A, 0x78, 0x2D, 0xA6, 0xE0, 0x3B, 0xBF, 0xF0, 0x3B, 0x2C, 0x7F, 0xAD, 0x91, 0x2A, 0xF0, 0x79, 0x22, 0x5C,
0xCC, 0x9D, 0xD4, 0xFE, 0x90, 0x38, 0xB8, 0x4C, 0xC2, 0x40, 0x43, 0xE7, 0xC0, 0x1A, 0x2F, 0x3F, 0x11, 0xF5, 0xF5, 0x07, 0xC4, 0x47, 0x74, 0xFF, 0x50, 0xE5, 0x36, 0x4F, 0x26, 0x91, 0xF2, 0x3A,
0xFC, 0x93, 0xA6, 0x19, 0x2C, 0xF3, 0xFD, 0xBB, 0xD2, 0xFA, 0x7B, 0x92, 0x31, 0x51, 0x38, 0x2A, 0xF4, 0x90, 0xE0, 0x7D, 0xE8, 0x03, 0xAB, 0xE4, 0x67, 0xE1, 0xBB, 0x27, 0x16, 0x14, 0xC9, 0xDD,
0x8D, 0x1F, 0xE8, 0x58, 0x1C, 0x5C, 0x6F, 0xB6, 0x9E, 0x71, 0xEB, 0xC1, 0xD3, 0xB6, 0xCD, 0x9E, 0xCA, 0x4D, 0x46, 0x1B, 0xF2, 0xD2, 0x03, 0x51, 0xF5, 0x31, 0xB6, 0x2A, 0x4E, 0xB2, 0xF0, 0xEA,
0x5F, 0x55, 0xC2, 0x2B, 0x9D, 0xE5, 0x5B, 0x4C, 0x95, 0xE6, 0x67, 0x15, 0xDE, 0x3C, 0x05, 0x02, 0x32, 0xE4, 0x00, 0x2F, 0x3F, 0x3C, 0x51, 0x0B, 0x5C, 0x2F, 0x3F, 0xBC, 0xFD, 0x52, 0x3D, 0xE0,
0xAD, 0xFE, 0x21, 0xA9, 0xE6, 0xAF, 0x74, 0x55, 0xD4, 0xEC, 0x12, 0xDD, 0x64, 0x41, 0x98, 0x41, 0x1A, 0xF6, 0x39, 0x6B, 0x0A, 0x0A, 0x58, 0x9C, 0xAE, 0x81, 0x0F, 0x7D, 0x14, 0x09, 0xF8, 0x9F,
0xFE, 0x40, 0x9D, 0x7F, 0x52, 0x59, 0x14, 0x74, 0x45, 0x3D, 0x35, 0xB4, 0x0C, 0x35, 0x21, 0x50, 0xF0, 0x40, 0x40, 0x9D, 0x1F, 0xDA, 0x1D, 0x04, 0xB4, 0x97, 0x20, 0x12, 0x4C, 0xB1, 0xAB, 0x93,
0x07, 0xEA, 0xBA, 0x01, 0xF9, 0x5A, 0x86, 0xDE, 0x3F, 0xE0, 0x30, 0x0A, 0x2E, 0x00, 0x08, 0xE5, 0x28, 0x60, 0xEF, 0x4F, 0xAA, 0x07, 0x42, 0x16, 0xCA, 0xEF, 0x89, 0xF1, 0xE0, 0xE6, 0x78, 0xB2,
0x14, 0x72, 0x13, 0x42, 0x31, 0x4C, 0xD7, 0x37, 0x4F, 0x24, 0x37, 0x78, 0x56, 0x99, 0x58, 0x1D, 0xF0, 0x4B, 0xD1, 0x04, 0xF9, 0x08, 0x11, 0x69, 0xD7, 0xB2, 0x3E, 0x63, 0xF8, 0x0C, 0x3D, 0x8A,
0x0A, 0x6B, 0x9F, 0x81, 0x0A, 0xCD, 0xD3, 0x24, 0x4E, 0x56, 0x59, 0xBE, 0x7C, 0x85, 0xA9, 0x80, 0x22, 0xE9, 0x83, 0x3D, 0x67, 0x84, 0xDB, 0x07, 0x91, 0x77, 0x85, 0x21, 0x60, 0xEE, 0x37, 0x22,
0xC5, 0xBE, 0xF3, 0xCD, 0x1D, 0x28, 0x55, 0xA6, 0xEA, 0x98, 0xF0, 0xA0, 0x05, 0x1B, 0xDC, 0xEF, 0x91, 0x4C, 0x4D, 0x45, 0xF5, 0xAF, 0x14, 0x94, 0x64, 0x6E, 0x60, 0x7F, 0x20, 0x32, 0xF8, 0x1A,
0x09, 0x8C, 0xB6, 0x5D, 0x5D, 0xA9, 0x0D, 0x15, 0xA3, 0xDD, 0xBB, 0x33, 0xBB, 0xC1, 0xAF, 0xAA, 0x07, 0xBE, 0x86, 0x56, 0x96, 0xD5, 0x5F, 0x7E, 0xF8, 0x27, 0x4D, 0x52, 0x58, 0xE6, 0xFB, 0x77,
0x44, 0x11, 0xDD, 0x0D, 0xF5, 0xDF, 0x44, 0xB3, 0x3A, 0x01, 0x53, 0x31, 0x1A, 0x41, 0xE9, 0xB2, 0xA5, 0xF5, 0xF7, 0x38, 0x65, 0x22, 0x5D, 0x57, 0x1A, 0x3F, 0xD0, 0xB1, 0xB8, 0x81, 0xB0, 0xD9,
0x2B, 0x8B, 0xDB, 0xE2, 0x7B, 0x61, 0x03, 0xFA, 0x00, 0xE4, 0x53, 0x38, 0xB7, 0xDB, 0x8D, 0x6C, 0x7A, 0xC6, 0xD5, 0x09, 0x0F, 0x4A, 0x77, 0xF7, 0x9C, 0xBC, 0xDB, 0x6C, 0xFF, 0x55, 0x25, 0x48,
0x8E, 0xEE, 0xC9, 0xE6, 0x2A, 0x7C, 0xB8, 0xB9, 0x57, 0x5C, 0xA8, 0x17, 0x4D, 0xC3, 0xDD, 0x72, 0xA9, 0xB3, 0xB8, 0xA6, 0x56, 0x6A, 0x7E, 0x56, 0xA2, 0xD9, 0x31, 0x6C, 0xDC, 0xEA, 0x1F, 0x62,
0x78, 0x8A, 0x0E, 0xA4, 0x10, 0x78, 0x9D, 0xAC, 0xF1, 0x55, 0x66, 0x72, 0x5C, 0x30, 0x19, 0xDC, 0x7F, 0x76, 0x67, 0xAF, 0x24, 0x8F, 0x5F, 0xD1, 0x41, 0xE5, 0x1B, 0x36, 0xC8, 0x1B, 0x54, 0x8E,
0x0F, 0x1F, 0xD7, 0x98, 0x03, 0x97, 0x8F, 0x49, 0x73, 0x0D, 0x89, 0xC8, 0x47, 0xE2, 0xA7, 0xC1, 0x27, 0xA5, 0x45, 0x41, 0xA8, 0xD4, 0x83, 0x60, 0xF0, 0xD3, 0x10, 0x23, 0xA7, 0xE8, 0x5D, 0x7D,
0x2A, 0x8C, 0x13, 0xF2, 0x59, 0xEF, 0x3F, 0x64, 0xBE, 0xC8, 0xB0, 0xFA, 0xE4, 0xB8, 0xAA, 0x47, 0x3E, 0x32, 0xA7, 0x01, 0x0C, 0x54, 0x8E, 0x8F, 0x2D, 0x7D, 0xF3, 0xC4, 0x78, 0x83, 0x30, 0xE5,
0x15, 0x80, 0x7A, 0x63, 0x1C, 0xC6, 0x50, 0xDC, 0x9D, 0xF3, 0x13, 0x7D, 0x3F, 0x4D, 0xFD, 0xEB, 0xF3, 0xE3, 0x12, 0x6D, 0x0C, 0x72, 0x06, 0x62, 0x32, 0x4F, 0xE2, 0x28, 0x5E, 0xA5, 0xD9, 0x22,
0xF1, 0x6A, 0x3A, 0xA5, 0x50, 0x63, 0x94, 0xE4, 0x81, 0xC2, 0x01, 0xBB, 0x86, 0x6A, 0x46, 0xA4, 0x25, 0x02, 0xC1, 0x5A, 0xFB, 0x8E, 0x9B, 0x2D, 0x0C, 0x15, 0x51, 0x2D, 0x0D, 0x6E, 0xCC, 0x04,
0xF2, 0x99, 0x7C, 0x38, 0x23, 0xFA, 0xAE, 0x83, 0x72, 0xEB, 0xB6, 0x02, 0x84, 0x73, 0xA9, 0x02, 0xCC, 0x6D, 0xFB, 0x55, 0x70, 0xB4, 0xA4, 0x89, 0x7B, 0xAB, 0xDA, 0x1B, 0xBB, 0x2E, 0x53, 0x1F,
0x65, 0xD7, 0xE1, 0x7A, 0x45, 0x84, 0xE4, 0x7F, 0x39, 0x6C, 0x19, 0x9F, 0xBF, 0x7F, 0xCF, 0x28, 0xD1, 0xD9, 0x10, 0x61, 0x0B, 0xC2, 0x54, 0x1A, 0x42, 0x5A, 0xB7, 0x2B, 0xC2, 0x45, 0xFA, 0x18,
0xC3, 0x6A, 0x38, 0x59, 0xB1, 0xBA, 0x22, 0x1E, 0xC3, 0xA5, 0xAE, 0x5E, 0x5D, 0x8B, 0xE7, 0x00, 0x3B, 0xC3, 0x5C, 0x7D, 0x00, 0x74, 0xCC, 0x6D, 0xD2, 0xED, 0x46, 0xA4, 0x4B, 0xF7, 0x44, 0xBA,
0x07, 0x31, 0xC6, 0xF2, 0xAC, 0x32, 0x65, 0x01, 0x69, 0x9F, 0x3F, 0xAB, 0x22, 0x08, 0xEE, 0xF4, 0xA5, 0x9D, 0xDE, 0xDC, 0xCB, 0x9C, 0x57, 0xF3, 0xA6, 0xE1, 0x6E, 0x4A, 0x1E, 0xA3, 0xDE, 0xE7,
0x09, 0xA4, 0x7E, 0x60, 0xBA, 0x3E, 0x54, 0xBC, 0xB0, 0x64, 0x3C, 0xA1, 0x50, 0x02, 0x3E, 0x43, 0x4C, 0xA9, 0x92, 0x35, 0xDE, 0x1C, 0x27, 0x35, 0x95, 0x6B, 0x35, 0xC8, 0x54, 0x6B, 0x65, 0x2E,
0x3E, 0xFD, 0xC2, 0xF9, 0xA4, 0x97, 0x69, 0x20, 0x8E, 0xCA, 0x8F, 0xF9, 0xFB, 0xE0, 0xF1, 0x1D, 0xD7, 0x48, 0x63, 0x0D, 0x91, 0xD9, 0x47, 0xE2, 0x25, 0xFE, 0x2A, 0x88, 0x62, 0xF2, 0x59, 0xEF,
0xF4, 0x61, 0x22, 0x6B, 0x04, 0x4D, 0xCF, 0x77, 0x99, 0x4F, 0x9F, 0x13, 0x68, 0xFF, 0x68, 0x7D, 0x3F, 0x0A, 0x50, 0x09, 0x84, 0x5E, 0x1F, 0x07, 0x11, 0xE4, 0xBC, 0xE7, 0xFC, 0xEE, 0x84, 0x97,
0x86, 0xB6, 0xFC, 0x95, 0x03, 0xF6, 0xD1, 0xFE, 0x5C, 0xA5, 0xFB, 0xF4, 0x39, 0x14, 0x97, 0xB2, 0x24, 0xDE, 0xF5, 0x78, 0x35, 0x9D, 0x52, 0x48, 0xBD, 0x8A, 0x9D, 0x81, 0xB4, 0x00, 0xA5, 0x86,
0x1B, 0xBD, 0x8E, 0xF8, 0x53, 0x68, 0x65, 0xAE, 0xEC, 0x7B, 0xC2, 0xE7, 0x1E, 0x1D, 0x15, 0x01, 0x6A, 0x50, 0xA8, 0x92, 0x98, 0x7C, 0x38, 0x23, 0xFA, 0xAE, 0x4B, 0x07, 0xD6, 0x6D, 0x09, 0x08,
0xFB, 0x94, 0x69, 0x19, 0xA5, 0x8B, 0x4C, 0xBB, 0x4E, 0x56, 0x1A, 0xBE, 0x23, 0x25, 0x13, 0x11, 0x27, 0x50, 0x09, 0xCA, 0xCE, 0x8B, 0x0A, 0x25, 0xD0, 0xFF, 0xC3, 0x61, 0x4B, 0x8F, 0xFA, 0xFD,
0x6D, 0x0A, 0xF5, 0xA6, 0xE6, 0xC7, 0x09, 0xD8, 0x13, 0x64, 0xCC, 0x52, 0x4F, 0x0C, 0x1C, 0x96, 0x7B, 0x4A, 0x19, 0x1A, 0xBC, 0x78, 0xC5, 0xAA, 0x0A, 0x67, 0x0C, 0x97, 0xBA, 0x7A, 0x79, 0x2D,
0xF2, 0x71, 0x71, 0xB2, 0xD6, 0xD4, 0xBC, 0x85, 0x80, 0xAD, 0x29, 0xD9, 0x92, 0xFA, 0xEE, 0x12, 0x7E, 0xA9, 0xE1, 0x20, 0xC6, 0x98, 0xB5, 0x96, 0xA6, 0x64, 0xD7, 0x22, 0x36, 0x62, 0xDF, 0x27,
0xB2, 0x65, 0xAB, 0x44, 0xDE, 0x78, 0x29, 0x4B, 0x7B, 0x4A, 0xF4, 0xBB, 0xCB, 0xA0, 0xF5, 0xE3, 0xE0, 0xF5, 0x41, 0xF1, 0x3C, 0x2D, 0x88, 0x60, 0xC9, 0x68, 0x42, 0x21, 0x33, 0x7E, 0x86, 0x74,
0x8B, 0x20, 0x7C, 0xB5, 0xEA, 0x71, 0xF9, 0xA6, 0xB2, 0xE8, 0x23, 0xA6, 0xE3, 0x9B, 0x53, 0x87, 0xFA, 0x85, 0xD3, 0x49, 0x2F, 0x22, 0x61, 0x1C, 0x95, 0xDD, 0x7F, 0xE8, 0x43, 0x72, 0xEB, 0x1C,
0xEA, 0xA7, 0xBB, 0x66, 0x2A, 0xA1, 0xE9, 0x50, 0xCE, 0xF6, 0xF8, 0x74, 0x4F, 0xBC, 0x09, 0x76, 0x0D, 0xB3, 0xAB, 0x09, 0x20, 0xC6, 0x59, 0xF9, 0xFD, 0xE4, 0x39, 0x01, 0x23, 0xF3, 0xD1, 0xFA,
0xB0, 0xC4, 0xCB, 0x4B, 0xB6, 0x6A, 0x99, 0x67, 0xDC, 0x59, 0xC1, 0x11, 0xF0, 0x35, 0x0F, 0xAB, 0x0C, 0x6D, 0xD9, 0xF5, 0x0D, 0xF6, 0xD1, 0xFE, 0x5C, 0xDE, 0xF7, 0xC9, 0x73, 0x0D, 0x03, 0x0F,
0xDC, 0x44, 0xE1, 0x56, 0xCE, 0x7B, 0x40, 0xC1, 0x26, 0x82, 0x29, 0x90, 0xF2, 0x57, 0xA8, 0xD9, 0xDE, 0xAD, 0x83, 0x8A, 0x88, 0x3F, 0x3A, 0x57, 0xE6, 0xCA, 0xBE, 0x27, 0x7C, 0xEE, 0xD3, 0xA7,
0x38, 0x47, 0xEF, 0xAC, 0xDA, 0xB6, 0x24, 0xFC, 0xF8, 0x7A, 0x2D, 0x4F, 0xE4, 0x8A, 0x92, 0xED, 0xB9, 0x8B, 0x3D, 0x61, 0x5A, 0x4A, 0xE9, 0x22, 0xD5, 0xAE, 0xE3, 0x95, 0x86, 0xB7, 0xD1, 0x64,
0x6E, 0x5B, 0xB8, 0x6F, 0xA5, 0xB6, 0x85, 0xE5, 0x81, 0xB7, 0xFD, 0x0E, 0x80, 0xC9, 0xDF, 0xFB, 0xE8, 0xA0, 0x4D, 0x21, 0x0D, 0xD7, 0xBC, 0x28, 0x06, 0x65, 0x4A, 0x34, 0x70, 0x4C, 0x5C, 0x14,
0x7B, 0x9C, 0x31, 0x3C, 0xDE, 0x7E, 0x2B, 0x33, 0xF3, 0x77, 0x5D, 0x97, 0x57, 0xF7, 0xB4, 0xF8, 0x0D, 0x1C, 0x96, 0xF0, 0x71, 0x51, 0xBC, 0xD6, 0xD4, 0x48, 0x03, 0x15, 0xF3, 0xC5, 0xE9, 0xE9,
0xB2, 0xBE, 0xFC, 0x17, 0xF9, 0x87, 0xED, 0xE9, 0x0A, 0x8E, 0x03, 0xE1, 0x10, 0xF7, 0x17, 0xB2, 0xDB, 0xD3, 0x02, 0xDD, 0xED, 0x2B, 0x24, 0xEC, 0xA3, 0xF3, 0x79, 0xF3, 0x12, 0xC9, 0xD6, 0x66,
0xE8, 0x00, 0x89, 0xCD, 0x0F, 0x6D, 0x84, 0xD8, 0x8F, 0x8E, 0x88, 0x57, 0x7D, 0x54, 0x7B, 0xBF, 0x70, 0x50, 0x8D, 0x68, 0xD8, 0xD9, 0xC7, 0x0B, 0x14, 0xF6, 0x67, 0xDD, 0x28, 0xC5, 0x9F, 0x1B,
0x7F, 0x97, 0x65, 0xAF, 0x74, 0xBA, 0x53, 0x5E, 0xAE, 0x61, 0xDA, 0xE5, 0x40, 0xA4, 0xC8, 0x47, 0xE1, 0xA7, 0x37, 0xC6, 0xD3, 0x01, 0xCC, 0x46, 0x95, 0x08, 0xB4, 0x34, 0xE1, 0x06, 0xF3, 0xC7,
0xE9, 0xD5, 0x41, 0x13, 0x8C, 0x62, 0x11, 0xAF, 0x8C, 0x07, 0x3C, 0x9B, 0xC2, 0x35, 0x5D, 0x75, 0xD2, 0xAA, 0xC7, 0x55, 0x2F, 0xA4, 0x30, 0x4B, 0xDE, 0x5B, 0xD3, 0xA6, 0x3C, 0xD2, 0xA8, 0x82,
0xBC, 0xB0, 0x12, 0xEE, 0x0F, 0xEE, 0x34, 0x0A, 0x3C, 0x2E, 0xF6, 0x2C, 0x83, 0x0D, 0x21, 0x36, 0xFB, 0x2C, 0x0D, 0xAB, 0x11, 0x9D, 0x17, 0x33, 0x36, 0x37, 0xA2, 0x6F, 0xDD, 0x84, 0xD1, 0xFB,
0xF3, 0xBF, 0xE9, 0x00, 0x0E, 0xD7, 0x15, 0x45, 0x8E, 0x8F, 0x87, 0xF6, 0xDD, 0xCE, 0x4A, 0x88, 0xBB, 0x00, 0x42, 0x8C, 0x62, 0x80, 0xD1, 0x29, 0x72, 0x8C, 0xFF, 0x07, 0x69, 0xC2, 0x5E, 0xC3,
0x25, 0xBE, 0x8F, 0xB6, 0x95, 0x8A, 0xEB, 0xD9, 0x66, 0x6C, 0x78, 0xD6, 0x09, 0x26, 0x92, 0x13, 0xAB, 0xF7, 0x33, 0x31, 0x00, 0x97, 0x8D, 0x48, 0xA9, 0x86, 0x4F, 0xBD, 0x15, 0x88, 0x6A, 0xB0,
0xD0, 0xDB, 0xB4, 0x58, 0x9F, 0x61, 0xCE, 0x20, 0x53, 0xA1, 0x94, 0xA2, 0x3D, 0xE0, 0x5E, 0xA9, 0x55, 0x29, 0xDA, 0xB8, 0xEE, 0xA8, 0x1D, 0x13, 0xFD, 0xEE, 0x6A, 0xC0, 0xFA, 0xF1, 0xB5, 0x00,
0x61, 0x63, 0x9E, 0xC0, 0x49, 0xDE, 0xC5, 0x36, 0x2C, 0x67, 0xD5, 0xCE, 0x3B, 0xB7, 0x12, 0xCA, 0xBC, 0xB4, 0xF8, 0x38, 0xB2, 0x28, 0x8B, 0x3E, 0x62, 0x3A, 0xDE, 0x49, 0x3C, 0x54, 0x46, 0xB8,
0xE8, 0x88, 0x19, 0xE8, 0x7E, 0xFB, 0x2C, 0x5F, 0x75, 0xDD, 0x53, 0x70, 0x2A, 0x5B, 0x88, 0xF8, 0x6B, 0xA6, 0x12, 0x13, 0x1C, 0x8A, 0xAA, 0x1F, 0x1F, 0x90, 0x8B, 0x3B, 0x96, 0x07, 0x2B, 0x1D,
0xAA, 0xE4, 0xA3, 0x20, 0xF1, 0xA8, 0x30, 0xB8, 0x23, 0xE0, 0x46, 0xA5, 0xA3, 0x90, 0x3B, 0xC8, 0x59, 0xBE, 0x56, 0xAE, 0x76, 0x18, 0x77, 0x16, 0x32, 0x08, 0x78, 0x93, 0x87, 0x15, 0x30, 0x44,
0x20, 0xB8, 0xFD, 0xA3, 0x97, 0x5B, 0xA3, 0xF1, 0xD5, 0x45, 0x8E, 0xC4, 0xD3, 0xF7, 0x67, 0x2F, 0xFD, 0xA2, 0x98, 0xA7, 0xDF, 0xAA, 0x37, 0xCA, 0x8C, 0x07, 0x17, 0x31, 0x44, 0xD0, 0x03, 0xFB,
0xDE, 0xA9, 0xC5, 0x2E, 0x3A, 0x59, 0x40, 0x21, 0x66, 0xE0, 0x7C, 0x8F, 0xC9, 0xD1, 0xDB, 0x67, 0xDB, 0x51, 0xC7, 0xF8, 0x73, 0x0A, 0x18, 0x9C, 0xD6, 0x77, 0x96, 0x30, 0xB6, 0x78, 0x7F, 0xBF,
0x67, 0x67, 0x1F, 0xDE, 0xBC, 0x7B, 0xBE, 0x7B, 0x08, 0xC3, 0x21, 0x67, 0xEF, 0x7F, 0x79, 0x7D, 0xE2, 0xC5, 0x5D, 0xF5, 0x8A, 0x2C, 0xFE, 0xDE, 0x59, 0xB2, 0xB8, 0x5B, 0x7B, 0xEE, 0x6B, 0x82,
0x7A, 0x3E, 0xBC, 0xC6, 0x6D, 0xB9, 0x70, 0x57, 0x44, 0x08, 0xEF, 0xDE, 0x1A, 0x0E, 0xB7, 0xB6, 0xB6, 0xB0, 0x3F, 0x70, 0xF3, 0xF6, 0x00, 0x98, 0xEC, 0x0E, 0xEE, 0xE3, 0xD4, 0xE7, 0xF1, 0x1A,
0x86, 0x9F, 0x40, 0x9B, 0xAC, 0x0B, 0x78, 0x95, 0x10, 0x56, 0xAB, 0x84, 0xA2, 0x0C, 0xA8, 0xE4, 0x5F, 0x9A, 0x99, 0xDD, 0x3B, 0x5F, 0x5E, 0xDD, 0xD3, 0x46, 0x14, 0xF5, 0x95, 0x7F, 0x93, 0x45,
0x5B, 0x61, 0x51, 0x2A, 0xF4, 0xF3, 0x8A, 0x1F, 0x44, 0x1D, 0xAA, 0x65, 0x42, 0xCC, 0xC3, 0x50, 0xD9, 0x9E, 0xAE, 0xE0, 0x38, 0x10, 0x26, 0xF4, 0x7E, 0x85, 0x1C, 0x34, 0x9F, 0xC4, 0xE6, 0x27,
0x98, 0x97, 0x09, 0xEB, 0x30, 0x0E, 0x92, 0xF5, 0x0E, 0xC7, 0x9D, 0xCF, 0xBF, 0x1D, 0x9C, 0x34, 0x9F, 0x42, 0x04, 0x9E, 0x3E, 0x25, 0xCD, 0xF2, 0x57, 0xB5, 0xF7, 0xFB, 0xF7, 0xB2, 0xDB, 0x25,
0xE5, 0xFB, 0xAC, 0x27, 0x4D, 0xF9, 0x1A, 0x3D, 0xFF, 0x1F, 0x2E, 0xFE, 0x1F, 0xE4, 0x44, 0x87, 0x0E, 0xF8, 0xF6, 0xAC, 0x53, 0x2F, 0xFB, 0xBB, 0x09, 0x86, 0x3A, 0xC2, 0xE3, 0x0D, 0x78, 0xB4,
0x45, 0x77, 0x51, 0x00, 0x00 0x8D, 0x4B, 0xB9, 0xEA, 0x78, 0xA1, 0x40, 0xDC, 0x88, 0xDC, 0xA9, 0x2F, 0x78, 0xD9, 0xA2, 0x69,
0x19, 0x6C, 0x08, 0x01, 0x1C, 0xFF, 0x13, 0x2B, 0x20, 0x72, 0x55, 0x91, 0xEB, 0xA8, 0x36, 0xB4,
0xEF, 0xB6, 0x70, 0x82, 0x33, 0xD1, 0x7D, 0x04, 0xAE, 0x90, 0xDD, 0xA6, 0x6D, 0x46, 0x46, 0xD3,
0x3A, 0xC2, 0x54, 0x62, 0x02, 0xA2, 0x9B, 0xE4, 0xEB, 0x33, 0x0C, 0x2C, 0x37, 0x1C, 0x20, 0xC4,
0x84, 0x36, 0x06, 0x93, 0x7C, 0xCB, 0xE5, 0x22, 0xD9, 0x8E, 0xA6, 0x7D, 0x75, 0xB3, 0xC2, 0x8D,
0x62, 0x56, 0xB2, 0x5F, 0x2D, 0x8B, 0xDB, 0xE6, 0x7B, 0x6A, 0x07, 0x4A, 0xC9, 0x1D, 0x6F, 0x2B,
0x3F, 0x0A, 0x12, 0x77, 0x1F, 0x83, 0x3B, 0x3C, 0x73, 0x58, 0xD8, 0x07, 0x79, 0xE2, 0x02, 0xCC,
0xDA, 0x3F, 0x7A, 0xB9, 0x35, 0x1A, 0x2F, 0xFB, 0x72, 0x24, 0x8E, 0xDF, 0x9F, 0xBD, 0x38, 0x55,
0xEB, 0x16, 0x68, 0x73, 0x01, 0x85, 0x88, 0x81, 0x2D, 0xAE, 0x91, 0xA7, 0xEF, 0x9E, 0x9D, 0x9D,
0x7D, 0x78, 0x7B, 0xFA, 0x7C, 0xF7, 0x10, 0x86, 0x43, 0xCE, 0xDE, 0xFF, 0xF2, 0xFA, 0xE4, 0x7C,
0x78, 0x8D, 0xE5, 0xEB, 0x60, 0x87, 0x93, 0x18, 0x04, 0x77, 0x1F, 0xA5, 0x04, 0x5B, 0x47, 0x29,
0x4F, 0xA0, 0x4D, 0xE6, 0x8A, 0x3C, 0x73, 0x0C, 0xCA, 0x99, 0x63, 0x9E, 0x1A, 0x96, 0x62, 0xD7,
0x20, 0x4F, 0x1F, 0xFB, 0x59, 0xF1, 0x06, 0xD8, 0x1E, 0xA8, 0xA9, 0x63, 0xC4, 0x5D, 0x53, 0x90,
0xA5, 0x8E, 0xEB, 0x20, 0xF2, 0xE3, 0xF5, 0x0E, 0xDB, 0x9D, 0xCD, 0xBF, 0x1D, 0x1C, 0x35, 0xE4,
0x95, 0xF2, 0xA3, 0x86, 0xFC, 0x4B, 0x16, 0xFE, 0xFF, 0x3C, 0xFD, 0x5F, 0xA2, 0x56, 0x64, 0x29,
0xFA, 0x54, 0x00, 0x00
}; };
#endif //__embedded_h #endif //__embedded_h

View File

@ -190,7 +190,7 @@ void HTTP_Server::handleFSFileList ()
} }
} }
buffer2send += "],\"path\":\"" + path + "\","; buffer2send += "],\"path\":\"" + path + "\",";
if (ESP_FileSystem::totalBytes()>0) { if (ESP_FileSystem::totalBytes()>0) {
buffer2send += "\"occupation\":\"" + String(100*ESP_FileSystem::usedBytes()/ESP_FileSystem::totalBytes()) + "\","; buffer2send += "\"occupation\":\"" + String(100*ESP_FileSystem::usedBytes()/ESP_FileSystem::totalBytes()) + "\",";
} else { } else {

View File

@ -36,98 +36,116 @@ void HTTP_Server::FSFileupload ()
//Guest cannot upload - only admin //Guest cannot upload - only admin
if (auth_level == LEVEL_GUEST) { if (auth_level == LEVEL_GUEST) {
_webserver->send (401, "text/plain", "Wrong authentication!"); _webserver->send (401, "text/plain", "Wrong authentication!");
return; pushError(ESP_ERROR_AUTHENTICATION, "Upload rejected");
_upload_status=UPLOAD_STATUS_FAILED;
} }
static String filename; static String filename;
static ESP_File fsUploadFile; static ESP_File fsUploadFile;
if (_upload_status != UPLOAD_STATUS_FAILED) {
HTTPUpload& upload = _webserver->upload(); HTTPUpload& upload = _webserver->upload();
//Upload start //Upload start
if(upload.status == UPLOAD_FILE_START) { if(upload.status == UPLOAD_FILE_START) {
String upload_filename = upload.filename; String upload_filename = upload.filename;
if (upload_filename[0] != '/') { if (upload_filename[0] != '/') {
filename = "/" + upload_filename; filename = "/" + upload_filename;
} else {
filename = upload.filename;
}
if (ESP_FileSystem::exists (filename.c_str()) ) {
ESP_FileSystem::remove (filename.c_str());
}
if (fsUploadFile.isOpen() ) {
fsUploadFile.close();
}
//create file
fsUploadFile = ESP_FileSystem::open(filename.c_str(), ESP_FILE_WRITE);
//check If creation succeed
if (fsUploadFile) {
//if yes upload is started
_upload_status= UPLOAD_STATUS_ONGOING;
} else {
//if no set cancel flag
_upload_status=UPLOAD_STATUS_CANCELLED;
_webserver->send (500, "text/plain", "Cannot create file!");
_webserver->client().stop();
}
//Upload write
} else if(upload.status == UPLOAD_FILE_WRITE) {
//check if file is available and no error
if(fsUploadFile && _upload_status == UPLOAD_STATUS_ONGOING) {
//no error so write post date
fsUploadFile.write(upload.buf, upload.currentSize);
} else {
//we have a problem set flag UPLOAD_STATUS_CANCELLED
_upload_status=UPLOAD_STATUS_CANCELLED;
fsUploadFile.close();
if (ESP_FileSystem::exists (filename.c_str())) {
ESP_FileSystem::remove (filename.c_str());
}
_webserver->send (500, "text/plain", "Cannot write file!");
_webserver->client().stop();
}
//Upload end
} else if(upload.status == UPLOAD_FILE_END) {
//check if file is still open
if(fsUploadFile) {
//close it
fsUploadFile.close();
//check size
String sizeargname = upload.filename + "S";
//fsUploadFile = ESP_FileSystem::open (filename, ESP_FILE_READ);
uint32_t filesize = fsUploadFile.size();
//fsUploadFile.close();
if (_webserver->hasArg (sizeargname.c_str()) ) {
if (_webserver->arg (sizeargname.c_str()) != String(filesize)) {
_upload_status = UPLOAD_STATUS_FAILED;
ESP_FileSystem::remove (filename.c_str());
}
}
if (_upload_status == UPLOAD_STATUS_ONGOING) {
_upload_status = UPLOAD_STATUS_SUCCESSFUL;
} else { } else {
_webserver->send (500, "text/plain", "Upload error!"); filename = upload.filename;
} }
} else { //Sanity check
//we have a problem set flag UPLOAD_STATUS_CANCELLED
_upload_status=UPLOAD_STATUS_CANCELLED;
_webserver->client().stop();
if (ESP_FileSystem::exists (filename.c_str()) ) { if (ESP_FileSystem::exists (filename.c_str()) ) {
ESP_FileSystem::remove (filename.c_str()); ESP_FileSystem::remove (filename.c_str());
} }
if (fsUploadFile.isOpen() ) {
fsUploadFile.close();
}
String sizeargname = upload.filename + "S";
if (_webserver->hasArg (sizeargname.c_str()) ) {
size_t freespace = ESP_FileSystem::totalBytes() - ESP_FileSystem::usedBytes();
size_t filesize = _webserver->arg (sizeargname.c_str()).toInt();
if (freespace < filesize ) {
_upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Not enough space!");
pushError(ESP_ERROR_NOT_ENOUGH_SPACE, "Upload rejected");
}
}
if (_upload_status!=UPLOAD_STATUS_FAILED) {
//create file
fsUploadFile = ESP_FileSystem::open(filename.c_str(), ESP_FILE_WRITE);
//check If creation succeed
if (fsUploadFile) {
//if yes upload is started
_upload_status= UPLOAD_STATUS_ONGOING;
} else {
//if no set cancel flag
_upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Cannot create file!");
pushError(ESP_ERROR_FILE_CREATION, "File creation failed");
}
}
//Upload write
} else if(upload.status == UPLOAD_FILE_WRITE) {
//check if file is available and no error
if(fsUploadFile && _upload_status == UPLOAD_STATUS_ONGOING) {
//no error so write post date
if(upload.currentSize != fsUploadFile.write(upload.buf, upload.currentSize)) {
//we have a problem set flag UPLOAD_STATUS_FAILED
_upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Cannot write file!");
pushError(ESP_ERROR_FILE_WRITE, "File write failed");
}
} else {
//we have a problem set flag UPLOAD_STATUS_FAILED
_upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Cannot write file!");
pushError(ESP_ERROR_FILE_WRITE, "File write failed");
}
//Upload end
} else if(upload.status == UPLOAD_FILE_END) {
//check if file is still open
if(fsUploadFile) {
//close it
fsUploadFile.close();
//check size
String sizeargname = upload.filename + "S";
//fsUploadFile = ESP_FileSystem::open (filename, ESP_FILE_READ);
uint32_t filesize = fsUploadFile.size();
_upload_status = UPLOAD_STATUS_SUCCESSFUL;
if (_webserver->hasArg (sizeargname.c_str()) ) {
if (_webserver->arg (sizeargname.c_str()) != String(filesize)) {
_upload_status = UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Upload error!");
pushError(ESP_ERROR_SIZE, "File upload failed");
}
}
if (_upload_status == UPLOAD_STATUS_ONGOING) {
_upload_status = UPLOAD_STATUS_SUCCESSFUL;
}
} else {
//we have a problem set flag UPLOAD_STATUS_FAILED
_upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Upload error!");
pushError(ESP_ERROR_FILE_CLOSE, "File close failed");
}
//Upload cancelled
} else {
if (_upload_status == UPLOAD_STATUS_ONGOING) {
_upload_status = UPLOAD_STATUS_FAILED;
}
_webserver->send (500, "text/plain", "Upload error!"); _webserver->send (500, "text/plain", "Upload error!");
} }
//Upload cancelled }
} else {
if (_upload_status == UPLOAD_STATUS_ONGOING) { if(_upload_status == UPLOAD_STATUS_FAILED) {
_upload_status = UPLOAD_STATUS_CANCELLED; cancelUpload();
}
if(fsUploadFile) { if(fsUploadFile) {
fsUploadFile.close(); fsUploadFile.close();
} }
if (ESP_FileSystem::exists (filename.c_str()) ) { if (auth_level != LEVEL_GUEST) {
ESP_FileSystem::remove (filename.c_str()); if (ESP_FileSystem::exists (filename.c_str())) {
ESP_FileSystem::remove (filename.c_str());
}
} }
_webserver->send (500, "text/plain", "Upload error!");
} }
} }
#endif //HTTP_FEATURE && FILESYSTEM_FEATURE #endif //HTTP_FEATURE && FILESYSTEM_FEATURE

View File

@ -40,87 +40,91 @@ void HTTP_Server::WebUpdateUpload ()
ESP3DOutput output(ESP_ALL_CLIENTS); ESP3DOutput output(ESP_ALL_CLIENTS);
//only admin can update FW //only admin can update FW
if (AuthenticationService::authenticated_level() != LEVEL_ADMIN) { if (AuthenticationService::authenticated_level() != LEVEL_ADMIN) {
_upload_status = UPLOAD_STATUS_CANCELLED; _upload_status = UPLOAD_STATUS_FAILED;
_webserver->send (401, "text/plain", "Wrong authentication!"); _webserver->send (401, "text/plain", "Wrong authentication!");
return; pushError(ESP_ERROR_AUTHENTICATION, "Upload rejected");
} }
//get current file ID if (_upload_status != UPLOAD_STATUS_FAILED) {
HTTPUpload& upload = _webserver->upload(); //get current file ID
//Upload start HTTPUpload& upload = _webserver->upload();
if(upload.status == UPLOAD_FILE_START) { //Upload start
output.printMSG("Update Firmware"); if(upload.status == UPLOAD_FILE_START) {
_upload_status= UPLOAD_STATUS_ONGOING; output.printMSG("Update Firmware");
String sizeargname = upload.filename + "S"; _upload_status= UPLOAD_STATUS_ONGOING;
if (_webserver->hasArg (sizeargname.c_str()) ) { String sizeargname = upload.filename + "S";
downloadsize = _webserver->arg (sizeargname).toInt(); if (_webserver->hasArg (sizeargname.c_str()) ) {
} else { downloadsize = _webserver->arg (sizeargname).toInt();
downloadsize = 0; } else {
} downloadsize = 0;
if (downloadsize > ESP_FileSystem::max_update_size()) { }
_upload_status=UPLOAD_STATUS_CANCELLED; if (downloadsize > ESP_FileSystem::max_update_size()) {
output.printERROR("Update oversized!"); _upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Update oversized!"); _webserver->send (500, "text/plain", "Update oversized!");
return; pushError(ESP_ERROR_NOT_ENOUGH_SPACE, "Upload rejected");
} }
last_upload_update = 0; last_upload_update = 0;
if(!Update.begin(UPDATE_SIZE)) { //start with unknown = max available size if (_upload_status != UPLOAD_STATUS_FAILED) {
_upload_status=UPLOAD_STATUS_CANCELLED; if(!Update.begin(UPDATE_SIZE)) { //start with unknown = max available size
output.printERROR("Update canceled!"); _upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Update canceled!"); output.printERROR("Update rejected!",500);
return; pushError(ESP_ERROR_NOT_ENOUGH_SPACE, "Upload rejected");
} else { } else {
output.printMSG("Update 0%"); output.printMSG("Update 0%");
}
//Upload write
} else if(upload.status == UPLOAD_FILE_WRITE) {
//check if no error
if (_upload_status == UPLOAD_STATUS_ONGOING) {
//we do not know the total file size yet but we know the available space so let's use it
if (downloadsize != 0) {
if ( ((100 * upload.totalSize) / downloadsize) !=last_upload_update) {
if ( downloadsize > 0) {
last_upload_update = (100 * upload.totalSize) / downloadsize;
} else {
last_upload_update = upload.totalSize;
}
String s = "Update ";
s+= String(last_upload_update);
s+="%";
output.printMSG(s.c_str());
} }
} }
if(Update.write(upload.buf, upload.currentSize) != upload.currentSize) { //Upload write
_upload_status=UPLOAD_STATUS_CANCELLED; } else if(upload.status == UPLOAD_FILE_WRITE) {
output.printERROR("Update write failed!"); //check if no error
_webserver->send (500, "text/plain", "Update write failed!"); if (_upload_status == UPLOAD_STATUS_ONGOING) {
return; //we do not know the total file size yet but we know the available space so let's use it
if (downloadsize != 0) {
if ( ((100 * upload.totalSize) / downloadsize) !=last_upload_update) {
if ( downloadsize > 0) {
last_upload_update = (100 * upload.totalSize) / downloadsize;
} else {
last_upload_update = upload.totalSize;
}
String s = "Update ";
s+= String(last_upload_update);
s+="%";
output.printMSG(s.c_str());
}
}
if(Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
_upload_status=UPLOAD_STATUS_FAILED;
output.printERROR("Update write failed!",500);
pushError(ESP_ERROR_FILE_WRITE, "File write failed");
}
} }
} //Upload end
//Upload end
} else if(upload.status == UPLOAD_FILE_END) { } else if(upload.status == UPLOAD_FILE_END) {
if ((downloadsize!=0) && (downloadsize < upload.totalSize)) { if ((downloadsize!=0) && (downloadsize < upload.totalSize)) {
_upload_status=UPLOAD_STATUS_CANCELLED; _upload_status=UPLOAD_STATUS_FAILED;
} }
if (_upload_status == UPLOAD_STATUS_ONGOING) { if (_upload_status == UPLOAD_STATUS_ONGOING) {
if(Update.end(true)) { //true to set the size to the current progress if(Update.end(true)) { //true to set the size to the current progress
//Now Reboot //Now Reboot
output.printMSG("Update 100%"); output.printMSG("Update 100%");
_upload_status=UPLOAD_STATUS_SUCCESSFUL; _upload_status=UPLOAD_STATUS_SUCCESSFUL;
} else {
output.printERROR("Update failed!",500);
_upload_status=UPLOAD_STATUS_FAILED;
pushError(ESP_ERROR_FILE_CLOSE, "File close failed");
}
} else { } else {
output.printERROR("Update failed!"); _upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Update failed!"); output.printERROR("Update failed!", 500);
pushError(ESP_ERROR_FILE_CLOSE, "File close failed");
} }
} else { } else {
output.printERROR("Update failed!"); output.printERROR("Update failed!",500);
_webserver->send (500, "text/plain", "Update failed!"); _upload_status=UPLOAD_STATUS_FAILED;
} }
} else if(upload.status == UPLOAD_FILE_ABORTED) { }
output.printERROR("Update failed!"); if(_upload_status == UPLOAD_STATUS_FAILED) {
_webserver->send (500, "text/plain", "Update failed!"); cancelUpload();
Update.end(); Update.end();
_upload_status=UPLOAD_STATUS_CANCELLED;
} }
} }
#endif //HTTP_FEATURE && WEB_UPDATE_FEATURE #endif //HTTP_FEATURE && WEB_UPDATE_FEATURE

View File

@ -32,6 +32,7 @@
#include "../authentication/authentication_service.h" #include "../authentication/authentication_service.h"
#include "../../core/settings_esp3d.h" #include "../../core/settings_esp3d.h"
#include "../filesystem/esp_filesystem.h" #include "../filesystem/esp_filesystem.h"
#include "../websocket/websocket_server.h"
bool HTTP_Server::_started = false; bool HTTP_Server::_started = false;
uint16_t HTTP_Server::_port = 0; uint16_t HTTP_Server::_port = 0;
@ -112,6 +113,35 @@ bool HTTP_Server::StreamFSFile(const char* filename, const char * contentType)
return true; return true;
} }
void HTTP_Server::pushError(int code, const char * st)
{
if (websocket_terminal_server.started() && st) {
String s = "ERROR:" + String(code) + ":";
s+=st;
websocket_terminal_server.pushMSG(websocket_terminal_server.get_currentID(), s.c_str());
uint32_t t = millis();
while (millis() - t < 1000) {
websocket_terminal_server.handle();
Hal::wait(10);
}
}
}
void HTTP_Server::cancelUpload()
{
HTTPUpload& upload = _webserver->upload();
upload.status = UPLOAD_FILE_ABORTED;
#if defined ( ARDUINO_ARCH_ESP8266)
_webserver->client().stopAll();
#else
//errno = 128;
_webserver->client().stop();
#endif
Hal::wait(100);
}
bool HTTP_Server::begin() bool HTTP_Server::begin()
{ {
bool no_error = true; bool no_error = true;

View File

@ -59,6 +59,8 @@ public:
return _port; return _port;
} }
private: private:
static void pushError(int code, const char * st);
static void cancelUpload();
static bool _started; static bool _started;
static WEBSERVER * _webserver; static WEBSERVER * _webserver;
static uint16_t _port; static uint16_t _port;

View File

@ -113,6 +113,30 @@ bool NetConfig::isHostnameValid (const char * hostname)
return true; return true;
} }
/**
* Get IP string what ever is enabled
*/
String NetConfig::localIP()
{
static String currentIP = "";
#if defined( WIFI_FEATURE)
if (WiFi.getMode() == WIFI_STA) {
currentIP = WiFi.localIP().toString();
} else if (WiFi.getMode() == WIFI_AP) {
currentIP = WiFi.softAPIP().toString();
}
#endif //WIFI_FEATURE
#if defined (ETH_FEATURE)
if (EthConfig::started()) {
currentIP = ETH.localIP().toString();
}
#endif //ETH_FEATURE
if (currentIP.length() == 0) {
currentIP = "0.0.0.0";
}
return currentIP;
}
/** /**
* Check if IP string is valid * Check if IP string is valid
*/ */
@ -166,7 +190,7 @@ void NetConfig::onWiFiEvent(WiFiEvent_t event)
break; break;
case SYSTEM_EVENT_ETH_DISCONNECTED: { case SYSTEM_EVENT_ETH_DISCONNECTED: {
output.printMSG ("Cable disconnected"); output.printMSG ("Cable disconnected");
ESP3DGlobalOutput::SetStatus("Cable disconnected"); ESP3DGlobalOutput::SetStatus("Cable disconnected");
} }
break; break;
case SYSTEM_EVENT_ETH_GOT_IP: case SYSTEM_EVENT_ETH_GOT_IP:

View File

@ -73,6 +73,7 @@ public:
{ {
return _started; return _started;
} }
static String localIP();
private : private :
static String _hostname; static String _hostname;
static void onWiFiEvent(WiFiEvent_t event); static void onWiFiEvent(WiFiEvent_t event);

View File

@ -87,7 +87,9 @@ bool NetServices::begin()
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
if (WiFi.getMode() != WIFI_AP) { if (WiFi.getMode() != WIFI_AP) {
if(!timeserver.begin()) { if(!timeserver.begin()) {
output.printERROR("Failed contact time servers!"); if(timeserver.is_internet_time()) {
output.printERROR("Failed contact time servers!");
}
} else { } else {
String tmp = "Time set :"; String tmp = "Time set :";
tmp+=timeserver.current_time(); tmp+=timeserver.current_time();

View File

@ -30,22 +30,34 @@
#if defined (BLUETOOTH_FEATURE) #if defined (BLUETOOTH_FEATURE)
#include "../bluetooth/BT_service.h" #include "../bluetooth/BT_service.h"
#endif //BLUETOOTH_FEATURE #endif //BLUETOOTH_FEATURE
#if defined (ETH_FEATURE)
#include "../ethernet/ethconfig.h"
#endif //ETH_FEATURE
TimeServer timeserver; TimeServer timeserver;
TimeServer::TimeServer() TimeServer::TimeServer()
{ {
_started = false; _started = false;
_is_internet_time = false;
} }
TimeServer::~TimeServer() TimeServer::~TimeServer()
{ {
end(); end();
} }
bool TimeServer::is_internet_time(bool readfromsettings)
{
if (readfromsettings) {
_is_internet_time = (Settings_ESP3D::read_byte (ESP_INTERNET_TIME) == 0);
}
return _is_internet_time;
}
bool TimeServer::begin() bool TimeServer::begin()
{ {
bool res = true; bool res = true;
_started = false; end();
String s1, s2, s3; String s1, s2, s3;
int8_t t1; int8_t t1;
byte d1; byte d1;
@ -61,9 +73,7 @@ bool TimeServer::begin()
return false; return false;
} }
#endif //BLUETOOTH_FEATURE #endif //BLUETOOTH_FEATURE
#if defined (ETH_FEATURE)
#include "../ethernet/ethconfig.h"
#endif //ETH_FEATURE
#if defined (ETH_FEATURE) #if defined (ETH_FEATURE)
if (!EthConfig::started()) { if (!EthConfig::started()) {
#if defined (WIFI_FEATURE) #if defined (WIFI_FEATURE)
@ -77,6 +87,9 @@ bool TimeServer::begin()
#endif //WIFI_FEATURE #endif //WIFI_FEATURE
} }
#endif //ETH_FEATURE #endif //ETH_FEATURE
if (!is_internet_time()) {
return false;
}
s1 = Settings_ESP3D::read_string (ESP_TIME_SERVER1); s1 = Settings_ESP3D::read_string (ESP_TIME_SERVER1);
s2 = Settings_ESP3D::read_string (ESP_TIME_SERVER2); s2 = Settings_ESP3D::read_string (ESP_TIME_SERVER2);
s3 = Settings_ESP3D::read_string (ESP_TIME_SERVER3); s3 = Settings_ESP3D::read_string (ESP_TIME_SERVER3);
@ -140,6 +153,9 @@ bool TimeServer::setTime(const char* stime)
struct tm tmstruct; struct tm tmstruct;
struct timeval time_val = {0, 0}; struct timeval time_val = {0, 0};
int pos2; int pos2;
//make uniform separators
stmp.replace("#","-");
stmp.replace(":","-");
//Search Year //Search Year
int pos = stmp.indexOf("-"); int pos = stmp.indexOf("-");
if (pos == -1) { if (pos == -1) {
@ -163,7 +179,7 @@ bool TimeServer::setTime(const char* stime)
pos2=pos; pos2=pos;
tmstruct.tm_mon = substmp.toInt() - 1; tmstruct.tm_mon = substmp.toInt() - 1;
//Search day //Search day
pos = stmp.indexOf("#",pos2+1); pos = stmp.indexOf("-",pos2+1);
if (pos == -1) { if (pos == -1) {
return false; return false;
} }
@ -175,7 +191,7 @@ bool TimeServer::setTime(const char* stime)
tmstruct.tm_mday = substmp.toInt(); tmstruct.tm_mday = substmp.toInt();
//Search hour //Search hour
pos = stmp.indexOf(":", pos2+1); pos = stmp.indexOf("-", pos2+1);
if (pos == -1) { if (pos == -1) {
return false; return false;
} }
@ -188,7 +204,7 @@ bool TimeServer::setTime(const char* stime)
tmstruct.tm_hour = substmp.toInt(); tmstruct.tm_hour = substmp.toInt();
//Search min //Search min
pos = stmp.indexOf(":", pos2+1); pos = stmp.indexOf("-", pos2+1);
if (pos == -1) { if (pos == -1) {
return false; return false;
} }
@ -202,6 +218,9 @@ bool TimeServer::setTime(const char* stime)
if ((substmp.toInt() > 59) || (substmp.toInt() < 0 )) { if ((substmp.toInt() > 59) || (substmp.toInt() < 0 )) {
return false; return false;
} }
tmstruct.tm_isdst = 0; //ignore dst
//reset servers, time zone and dst
configTime (0, 0,"", "", "");
tmstruct.tm_sec = substmp.toInt(); tmstruct.tm_sec = substmp.toInt();
time_val.tv_sec = mktime (&tmstruct); time_val.tv_sec = mktime (&tmstruct);
if(settimeofday(&time_val,0) == -1) { if(settimeofday(&time_val,0) == -1) {
@ -218,10 +237,8 @@ bool TimeServer::started()
//currently not used //currently not used
void TimeServer::end() void TimeServer::end()
{ {
if(!_started) {
return;
}
_started = false; _started = false;
_is_internet_time = false;
} }
//currently not used //currently not used

View File

@ -35,8 +35,10 @@ public:
const char * current_time(); const char * current_time();
bool setTime(const char* stime); bool setTime(const char* stime);
bool started(); bool started();
bool is_internet_time(bool readfromsettings = false);
private: private:
bool _started; bool _started;
bool _is_internet_time;
}; };
extern TimeServer timeserver; extern TimeServer timeserver;