Add new embedded page

This commit is contained in:
Luc 2021-03-10 13:20:57 +01:00
parent fa61393141
commit 2876055a8c
25 changed files with 7965 additions and 5808 deletions

5
embedded/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
node_modules
.vscode
dist/*.map
dist/*.tmp

View File

@ -1,14 +0,0 @@
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 bin2c -o embedded.h -m tool.html.gz
cat header.txt > out.h
cat embedded.h >> out.h
cat footer.txt >> out.h
sed -i "s/] =/] PROGMEM =/g" out.h
cat out.h > embedded.h
cat out.h > ../esp3d/src/modules/http/embedded.h
rm -f out.h
pause

View File

@ -0,0 +1,68 @@
let path = require("path");
const fs = require("fs");
const child_process = require("child_process");
const chalk = require("chalk");
let distPath = path.normalize(__dirname + "/../dist/");
let srcPath = path.normalize(__dirname + "/../src/");
let headerPath = path.normalize(
__dirname + "/../../esp3d/src/modules/http/embedded.h"
);
console.log(chalk.yellow("Converting bin to text file"));
//Cleaning files
if (fs.existsSync(distPath + "out.tmp")) fs.rmSync(distPath + "out.tmp");
if (fs.existsSync(distPath + "embedded.h")) fs.rmSync(distPath + "embedded.h");
//Convert bin2C
child_process.execSync(
"bin2c -o " + distPath + "out.tmp" + " -m " + distPath + "index.html.gz"
);
//Check conversion
if (fs.existsSync(distPath + "out.tmp")) {
console.log(chalk.green("[ok]"));
} else {
console.log(chalk.red("[error]Conversion failed"));
console.log(
chalk.red(
"Be sure bin2c executable is in your path (https://github.com/AraHaan/bin2c)"
)
);
return;
}
//Format header file
console.log(chalk.yellow("Building header"));
fs.writeFileSync(
distPath + "embedded.h",
fs.readFileSync(srcPath + "header.txt")
);
let bin2cfile = fs.readFileSync(distPath + "out.tmp").toString();
let newfile = bin2cfile
.replace("] ", "] PROGMEM ")
.replace(/define.*dist_index_html_gz/, "define tool_html_gz")
.replace(/char.*dist_index_html_gz/, "char tool_html_gz");
fs.appendFileSync(distPath + "embedded.h", newfile);
fs.appendFileSync(
distPath + "embedded.h",
fs.readFileSync(srcPath + "footer.txt")
);
//Check format result
if (fs.existsSync(distPath + "embedded.h")) {
console.log(chalk.green("[ok]"));
} else {
console.log(chalk.red("[error]Conversion failed"));
return;
}
//Move file to src
console.log(chalk.yellow("Overwriting header in sources"));
fs.writeFileSync(headerPath, fs.readFileSync(distPath + "embedded.h"));
if (fs.existsSync(headerPath)) {
console.log(chalk.green("[ok]"));
} else {
console.log(chalk.red("[error]Overwriting failed"));
return;
}

616
embedded/config/server.js Normal file
View File

@ -0,0 +1,616 @@
const express = require("express");
const chalk = require("chalk");
let path = require("path");
const fs = require("fs");
const port = 8080;
/*
* Web Server for development
* Web Socket server for development
*/
const wscolor = chalk.cyan;
const expresscolor = chalk.green;
const commandcolor = chalk.white;
const WebSocket = require("ws");
let currentID = 0;
const app = express();
const fileUpload = require("express-fileupload");
let serverpath = path.normalize(__dirname + "/../server/public/");
let WebSocketServer = require("ws").Server,
wss = new WebSocketServer({ port: 81 });
app.use(fileUpload({ preserveExtension: true, debug: false }));
app.listen(port, () =>
console.log(expresscolor(`[express] Listening on port ${port}!`))
);
//app.use(express.urlencoded({ extended: false }));
function SendBinary(text) {
const array = new Uint8Array(text.length);
for (let i = 0; i < array.length; ++i) {
array[i] = text.charCodeAt(i);
}
wss.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(array);
}
});
}
app.post("/login", function (req, res) {
res.send("");
return;
});
app.get("/config", function (req, res) {
res.send(
"chip id: 56398\nCPU Freq: 240 Mhz<br/>" +
"CPU Temp: 58.3 C<br/>" +
"free mem: 212.36 KB<br/>" +
"SDK: v3.2.3-14-gd3e562907<br/>" +
"flash size: 4.00 MB<br/>" +
"size for update: 1.87 MB<br/>" +
"FS type: LittleFS<br/>" +
"FS usage: 104.00 KB/192.00 KB<br/>" +
"baud: 115200<br/>" +
"sleep mode: none<br/>" +
"wifi: ON<br/>" +
"hostname: esp3d<br/>" +
"HTTP port: 80<br/>" +
"Telnet port: 23<br/>" +
"WebDav port: 8383<br/>" +
"sta: ON<br/>" +
"mac: 80:7D:3A:C4:4E:DC<br/>" +
"SSID: WIFI_OFFICE_A2G<br/>" +
"signal: 100 %<br/>" +
"phy mode: 11n<br/>" +
"channel: 11<br/>" +
"ip mode: dhcp<br/>" +
"ip: 192.168.1.61<br/>" +
"gw: 192.168.1.1<br/>" +
"msk: 255.255.255.0<br/>" +
"DNS: 192.168.1.1<br/>" +
"ap: OFF<br/>" +
"mac: 80:7D:3A:C4:4E:DD<br/>" +
"serial: ON<br/>" +
"notification: OFF<br/>" +
"Target Fw: repetier<br/>" +
"FW ver: 3.0.0.a91<br/>" +
"FW arch: ESP32 "
);
return;
});
app.get("/command", function (req, res) {
console.log(commandcolor(`[server]/command params: ${req.query.cmd}`));
let url = req.query.cmd;
if (url.startsWith("[ESP800]")) {
res.json({
FWVersion: "3.0.0.a28",
FWTarget: 40,
SDConnection: "none",
Authentication: "Disabled",
WebCommunication: "Synchronous",
WebSocketIP: "localhost",
WebSocketport: "81",
Hostname: "esp3d",
WiFiMode: "STA",
WebUpdate: "Enabled",
Filesystem: "SPIFFS",
Time: "none",
Cam_ID: "4",
Cam_name: "ESP32 Cam",
});
return;
}
if (url.indexOf("ESP111") != -1) {
res.send("192.168.1.111");
return;
}
if (url.indexOf("ESP420") != -1) {
res.json({
Status: [
{ id: "chip id", value: "38078" },
{ id: "CPU Freq", value: "240 Mhz" },
{ id: "CPU Temp", value: "50.6 C" },
{ id: "free mem", value: "217.50 KB" },
{ id: "SDK", value: "v3.3.1-61-g367c3c09c" },
{ id: "flash size", value: "4.00 MB" },
{ id: "size for update", value: "1.87 MB" },
{ id: "FS type", value: "SPIFFS" },
{ id: "FS usage", value: "39.95 KB/169.38 KB" },
{ id: "baud", value: "115200" },
{ id: "sleep mode", value: "none" },
{ id: "wifi", value: "ON" },
{ id: "hostname", value: "esp3d" },
{ id: "HTTP port", value: "80" },
{ id: "Telnet port", value: "23" },
{ id: "Ftp ports", value: "21, 20, 55600" },
{ id: "sta", value: "ON" },
{ id: "mac", value: "30:AE:A4:21:BE:94" },
{ id: "SSID", value: "WIFI_OFFICE_B2G" },
{ id: "signal", value: "100 %" },
{ id: "phy mode", value: "11n" },
{ id: "channel", value: "2" },
{ id: "ip mode", value: "dhcp" },
{ id: "ip", value: "192.168.1.43" },
{ id: "gw", value: "192.168.1.1" },
{ id: "msk", value: "255.255.255.0" },
{ id: "DNS", value: "192.168.1.1" },
{ id: "ap", value: "OFF" },
{ id: "mac", value: "30:AE:A4:21:BE:95" },
{ id: "serial", value: "ON" },
{ id: "notification", value: "OFF" },
{ id: "FW ver", value: "3.0.0.a28" },
{ id: "FW arch", value: "ESP32" },
],
});
return;
}
if (url.indexOf("ESP410") != -1) {
res.json({
AP_LIST: [
{
SSID: "HP-Setup>71-M277 LaserJet",
SIGNAL: "92",
IS_PROTECTED: "0",
},
{ SSID: "WIFI_OFFICE_B2G", SIGNAL: "88", IS_PROTECTED: "1" },
{ SSID: "NETGEAR70", SIGNAL: "66", IS_PROTECTED: "1" },
{ SSID: "ZenFone6&#39;luc", SIGNAL: "48", IS_PROTECTED: "1" },
{ SSID: "Livebox-EF01", SIGNAL: "20", IS_PROTECTED: "1" },
{ SSID: "orange", SIGNAL: "20", IS_PROTECTED: "0" },
],
});
return;
}
if (url.indexOf("ESP400") != -1) {
res.json({
Settings: [
{
F: "network/network",
P: "130",
T: "S",
V: "esp3d",
H: "hostname",
S: "32",
M: "1",
},
{
F: "network/network",
P: "0",
T: "B",
V: "1",
H: "radio mode",
O: [{ none: "0" }, { sta: "1" }, { ap: "2" }],
},
{
F: "network/sta",
P: "1",
T: "S",
V: "WIFI_OFFICE_B2G",
S: "32",
H: "SSID",
M: "1",
},
{
F: "network/sta",
P: "34",
T: "S",
N: "1",
V: "********",
S: "64",
H: "pwd",
M: "8",
},
{
F: "network/sta",
P: "99",
T: "B",
V: "1",
H: "ip mode",
O: [{ dhcp: "1" }, { static: "0" }],
},
{
F: "network/sta",
P: "100",
T: "A",
V: "192.168.0.1",
H: "ip",
},
{
F: "network/sta",
P: "108",
T: "A",
V: "192.168.0.1",
H: "gw",
},
{
F: "network/sta",
P: "104",
T: "A",
V: "255.255.255.0",
H: "msk",
},
{
F: "network/ap",
P: "218",
T: "S",
V: "ESP3D",
S: "32",
H: "SSID",
M: "1",
},
{
F: "network/ap",
P: "251",
T: "S",
N: "1",
V: "********",
S: "64",
H: "pwd",
M: "8",
},
{
F: "network/ap",
P: "316",
T: "A",
V: "192.168.0.1",
H: "ip",
},
{
F: "network/ap",
P: "118",
T: "B",
V: "11",
H: "channel",
O: [
{ 1: "1" },
{ 2: "2" },
{ 3: "3" },
{ 4: "4" },
{ 5: "5" },
{ 6: "6" },
{ 7: "7" },
{ 8: "8" },
{ 9: "9" },
{ 10: "10" },
{ 11: "11" },
{ 12: "12" },
{ 13: "13" },
{ 14: "14" },
],
},
{
F: "service/http",
P: "328",
T: "B",
V: "1",
H: "enable",
O: [{ no: "0" }, { yes: "1" }],
},
{
F: "service/http",
P: "121",
T: "I",
V: "80",
H: "port",
S: "65001",
M: "1",
},
{
F: "service/telnetp",
P: "329",
T: "B",
V: "1",
H: "enable",
O: [{ no: "0" }, { yes: "1" }],
},
{
F: "service/telnetp",
P: "125",
T: "I",
V: "23",
H: "port",
S: "65001",
M: "1",
},
{
F: "service/ftp",
P: "1021",
T: "B",
V: "1",
H: "enable",
O: [{ no: "0" }, { yes: "1" }],
},
{
F: "service/ftp",
P: "1009",
T: "I",
V: "21",
H: "control port",
S: "65001",
M: "1",
},
{
F: "service/ftp",
P: "1013",
T: "I",
V: "20",
H: "active port",
S: "65001",
M: "1",
},
{
F: "service/ftp",
P: "1017",
T: "I",
V: "55600",
H: "passive port",
S: "65001",
M: "1",
},
{
F: "service/notification",
P: "1004",
T: "B",
V: "1",
H: "auto notif",
O: [{ no: "0" }, { yes: "1" }],
},
{
F: "service/notification",
P: "116",
T: "B",
V: "0",
H: "notification",
O: [{ none: "0" }, { pushover: "1" }, { email: "2" }, { line: "3" }],
},
{
F: "service/notification",
P: "332",
T: "S",
V: "********",
S: "63",
H: "t1",
M: "0",
},
{
F: "service/notification",
P: "396",
T: "S",
V: "********",
S: "63",
H: "t2",
M: "0",
},
{
F: "service/notification",
P: "855",
T: "S",
V: " ",
S: "127",
H: "ts",
M: "0",
},
{
F: "system/system",
P: "461",
T: "B",
V: "40",
H: "targetfw",
O: [
{ repetier: "50" },
{ marlin: "20" },
{ marlinkimbra: "35" },
{ smoothieware: "40" },
{ grbl: "10" },
{ unknown: "0" },
],
},
{
F: "system/system",
P: "112",
T: "I",
V: "115200",
H: "baud",
O: [
{ 9600: "9600" },
{ 19200: "19200" },
{ 38400: "38400" },
{ 57600: "57600" },
{ 74880: "74880" },
{ 115200: "115200" },
{ 230400: "230400" },
{ 250000: "250000" },
{ 500000: "500000" },
{ 921600: "921600" },
],
},
{
F: "system/system",
P: "320",
T: "I",
V: "10000",
H: "bootdelay",
S: "40000",
M: "0",
},
{
F: "system/system",
P: "129",
T: "F",
V: "255",
H: "outputmsg",
O: [{ M117: "16" }, { serial: "1" }, { telnet: "2" }],
},
],
});
return;
}
SendBinary("ok\n");
res.send("");
});
function fileSizeString(size) {
let s;
if (size < 1024) return size + " B";
if (size < 1024 * 1024) return (size / 1024).toFixed(2) + " KB";
if (size < 1024 * 1024 * 1024)
return (size / (1024 * 1024)).toFixed(2) + " MB";
if (size < 1024 * 1024 * 1024 * 1024)
return (size / (1024 * 1024 * 1024)).toFixed(2) + " GB";
return "X B";
}
function filesList(mypath) {
let res = '{"files":[';
let nb = 0;
let total = 1.31 * 1024 * 1024;
let totalused = getTotalSize(serverpath);
let currentpath = path.normalize(serverpath + mypath);
console.log("[path]" + currentpath);
fs.readdirSync(currentpath).forEach((fileelement) => {
let fullpath = path.normalize(currentpath + "/" + fileelement);
let fst = fs.statSync(fullpath);
let fsize = -1;
if (fst.isFile()) {
fsize = fileSizeString(fst.size);
}
if (nb > 0) res += ",";
res += '{"name":"' + fileelement + '","size":"' + fsize + '"}';
nb++;
});
res +=
'],"path":"' +
mypath +
'","occupation":"' +
((100 * totalused) / total).toFixed(0) +
'","status":"ok","total":"' +
fileSizeString(total) +
'","used":"' +
fileSizeString(totalused) +
'"}';
return res;
}
const getAllFiles = function (dirPath, arrayOfFiles) {
let files = fs.readdirSync(dirPath);
arrayOfFiles = arrayOfFiles || [];
files.forEach(function (file) {
if (fs.statSync(dirPath + "/" + file).isDirectory()) {
arrayOfFiles = getAllFiles(dirPath + "/" + file, arrayOfFiles);
} else {
arrayOfFiles.push(dirPath + "/" + file);
}
});
return arrayOfFiles;
};
const getTotalSize = function (directoryPath) {
const arrayOfFiles = getAllFiles(directoryPath);
let totalSize = 0;
arrayOfFiles.forEach(function (filePath) {
totalSize += fs.statSync(filePath).size;
});
return totalSize;
};
function deleteFolderRecursive(path) {
if (fs.existsSync(path) && fs.lstatSync(path).isDirectory()) {
fs.readdirSync(path).forEach(function (file, index) {
let curPath = path + "/" + file;
if (fs.lstatSync(curPath).isDirectory()) {
// recurse
deleteFolderRecursive(curPath);
} else {
// delete file
fs.unlinkSync(curPath);
}
});
console.log(`[server]Deleting directory "${path}"...`);
if (fs.existsSync(path)) fs.rmdirSync(path);
} else console.log(`[server]No directory "${path}"...`);
}
app.all("/updatefw", function (req, res) {
res.send("ok");
});
app.all("/files", function (req, res) {
let mypath = req.query.path;
let url = req.originalUrl;
let filepath = path.normalize(serverpath + mypath + "/" + req.query.filename);
if (url.indexOf("action=deletedir") != -1) {
console.log("[server]delete directory " + filepath);
deleteFolderRecursive(filepath);
fs.readdirSync(mypath);
} else if (url.indexOf("action=delete") != -1) {
fs.unlinkSync(filepath);
console.log("[server]delete file " + filepath);
}
if (url.indexOf("action=createdir") != -1) {
fs.mkdirSync(filepath);
console.log("[server]new directory " + filepath);
}
if (typeof mypath == "undefined") {
if (typeof req.body.path == "undefined") {
console.log("[server]path is not defined");
mypath = "/";
} else {
mypath = (req.body.path == "/" ? "" : req.body.path) + "/";
}
}
console.log("[server]path is " + mypath);
if (!req.files || Object.keys(req.files).length === 0) {
return res.send(filesList(mypath));
}
let myFile = req.files.myfiles;
if (typeof myFile.length == "undefined") {
let fullpath = path.normalize(serverpath + mypath + myFile.name);
console.log("[server]one file:" + fullpath);
myFile.mv(fullpath, function (err) {
if (err) return res.status(500).send(err);
res.send(filesList(mypath));
});
return;
} else {
console.log(myFile.length + " files");
for (let i = 0; i < myFile.length; i++) {
let fullpath = path.normalize(serverpath + mypath + myFile[i].name);
console.log(fullpath);
myFile[i].mv(fullpath).then(() => {
if (i == myFile.length - 1) res.send(filesList(mypath));
});
}
}
});
wss.on("connection", (socket, request) => {
console.log(wscolor("[ws] New connection"));
console.log(wscolor(`[ws] currentID:${currentID}`));
socket.send(`currentID:${currentID}`);
wss.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(`activeID:${currentID}`);
}
});
currentID++;
socket.on("message", (message) => {
console.log(wscolor("[ws] received: %s", message));
});
});
wss.on("error", (error) => {
console.log(wscolor("[ws] Error: %s", error));
});

View File

@ -0,0 +1,52 @@
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
mode: "development", // this will trigger some webpack default stuffs for dev
entry: path.resolve(__dirname, "../src/index.js"), // if not set, default path to './src/index.js'. Accepts an object with multiple key-value pairs, with key as your custom bundle filename(substituting the [name]), and value as the corresponding file path
output: {
filename: "[name].bundle.js", // [name] will take whatever the input filename is. defaults to 'main' if only a single entry value
path: path.resolve(__dirname, "../dist"), // the folder containing you final dist/build files. Default to './dist'
},
devServer: {
historyApiFallback: true, // to make our SPA works after a full reload, so that it serves 'index.html' when 404 response
open: true,
contentBase: path.resolve(__dirname, "./dist"),
inline: true,
port: 8088,
proxy: {
context: () => true,
target: "http://localhost:8080",
},
},
stats: "minimal", // default behaviour spit out way too much info. adjust to your need.
devtool: "source-map", // a sourcemap type. map to original source with line number
plugins: [
new HtmlWebpackPlugin({
template: path.join(__dirname, "../src/index.html"),
inlineSource: ".(js|css)$",
inject: true,
}),
], // automatically creates a 'index.html' for us with our <link>, <style>, <script> tags inserted! Visit https://github.com/jantimon/html-webpack-plugin for more options
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env"],
},
},
},
{
test: /\.css$/, // run the loaders below only on .css files
// this are the loaders. they interpret files, in this case css. they run from right to left sequence.
// css-loader: "interprets @import and url() like import/require() and will resolve them."
// style-loader: "Adds CSS to the DOM by injecting a <style> tag". this is fine for development.
use: ["style-loader", "css-loader"],
},
],
},
};

View File

@ -0,0 +1,90 @@
const path = require("path");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const HtmlMinimizerPlugin = require("html-minimizer-webpack-plugin");
const HtmlInlineScriptPlugin = require("html-inline-script-webpack-plugin");
const HTMLInlineCSSWebpackPlugin = require("html-inline-css-webpack-plugin")
.default;
const Compression = require("compression-webpack-plugin");
module.exports = {
mode: "production", // this trigger webpack out-of-box prod optimizations
entry: path.resolve(__dirname, "../src/index.js"),
output: {
filename: `[name].[hash].js`, // [hash] is useful for cache busting!
path: path.resolve(__dirname, "../dist"),
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
{
test: /\.js$/,
exclude: /node_modules/,
use: [
{
loader: "babel-loader",
options: {
presets: [
[
"@babel/preset-env",
{
useBuiltIns: "usage",
debug: false,
corejs: 3,
targets: {"chrome": "88"},
},
],
],
},
},
],
},
],
},
plugins: [
// always deletes the dist folder first in each build run.
new CleanWebpackPlugin(),
new MiniCssExtractPlugin({
filename: "[name].css",
chunkFilename: "[id].css",
}),
new HtmlWebpackPlugin({
template: path.join(__dirname, "../src/index.html"),
inlineSource: ".(js|css)$",
inject: true,
}),
new HtmlInlineScriptPlugin([/\.(js)$/]),
new HTMLInlineCSSWebpackPlugin(),
new Compression({
test: /\.(html)$/,
filename: "[path][base].gz",
algorithm: "gzip",
exclude: /.map$/,
deleteOriginalAssets: "keep-source-map",
}),
],
optimization: {
minimize: true,
minimizer: [
new HtmlMinimizerPlugin({
minimizerOptions: {
collapseWhitespace: true,
minifyCSS: true,
minifyJS: true,
},
minify: (data, minimizerOptions) => {
const htmlMinifier = require("html-minifier-terser");
const [[filename, input]] = Object.entries(data);
return htmlMinifier.minify(input, minimizerOptions);
},
}),
],
},
devtool: "source-map", // supposedly the ideal type without bloating bundle size
};

View File

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

View File

@ -1,125 +0,0 @@
var gulp = require('gulp'),
jshint = require('gulp-jshint'),
gulpif = require('gulp-if'),
concat = require('gulp-concat'),
uglify = require('gulp-uglify'),
cleanCSS = require('gulp-clean-css'),
removeCode = require('gulp-remove-code'),
merge = require('merge-stream'),
del = require('del'),
zip = require('gulp-zip'),
gzip = require('gulp-gzip'),
htmlmin = require('gulp-htmlmin'),
replace = require('gulp-replace'),
fs = require('fs'),
smoosher = require('gulp-smoosher');
var demoMode = false;
var testMode = false;
function clean() {
return del(['dist']);
}
function clean2() {
return del(['dist/js', 'dist/css']);
}
function lint() {
return gulp.src('www/js/**/script.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
}
function Copytest() {
return merge(
gulp.src(['www/tool.html'])
.pipe(removeCode({production: false}))
.pipe(gulp.dest('dist')),
gulp.src(['www/images/**/*.*'])
.pipe(gulp.dest('dist/images'))
)
}
function Copy() {
return merge(
gulp.src(['www/tool.html'])
.pipe(removeCode({production: true}))
.pipe(gulp.dest('dist')),
gulp.src(['www/images/**/*.*'])
.pipe(gulp.dest('dist/images'))
)
}
function concatApptest() {
return merge(
gulp.src([ 'www/js/**/*.js'])
.pipe(concat('script.js'))
.pipe(removeCode({production: false}))
.pipe(gulp.dest('./dist/js')),
gulp.src([ 'www/css/**/*.css'])
.pipe(concat('style.css'))
.pipe(gulp.dest('./dist/css/'))
)
}
function concatApp() {
return merge(
gulp.src([ 'www/js/**/*.js'])
.pipe(concat('script.js'))
.pipe(removeCode({production: true}))
.pipe(gulp.dest('./dist/js')),
gulp.src([ 'www/css/**/*.css'])
.pipe(concat('style.css'))
.pipe(gulp.dest('./dist/css/'))
)
}
function minifyApp() {
return merge(
gulp.src(['dist/js/script.js'])
.pipe(uglify({mangle: true}))
.pipe(gulp.dest('./dist/js/')),
gulp.src('dist/css/style.css')
.pipe(cleanCSS({debug: true}, function(details) {
console.log(details.name + ': ' + details.stats.originalSize);
console.log(details.name + ': ' + details.stats.minifiedSize);
}))
.pipe(gulp.dest('./dist/css/')),
gulp.src('dist/tool.html')
.pipe(htmlmin({collapseWhitespace: true, minifyCSS: true}))
.pipe(gulp.dest('dist'))
)
}
function smoosh() {
return gulp.src('dist/tool.html')
.pipe(smoosher())
.pipe(gulp.dest('dist'))
}
function compress() {
return gulp.src('dist/tool.html')
.pipe(gzip())
.pipe(gulp.dest('.'));
}
gulp.task(clean);
gulp.task(lint);
gulp.task(Copy);
gulp.task(Copytest);
gulp.task(concatApp);
gulp.task(concatApptest);
gulp.task(minifyApp);
gulp.task(smoosh);
gulp.task(clean2);
var defaultSeries = gulp.series(clean, lint, Copy, concatApp, smoosh);
var packageSeries = gulp.series(clean, lint, Copy, concatApp,minifyApp, smoosh, compress, clean2);
gulp.task('default', defaultSeries);
gulp.task('package', packageSeries);

File diff suppressed because it is too large Load Diff

View File

@ -1,30 +1,43 @@
{ {
"name": "embedded4ESP3D", "name": "base",
"description": "Embedded files for ESP3D", "version": "1.0.0",
"devDependencies": { "description": "base for webpack project",
"del": "latest", "main": "index.js",
"deprecated": "latest", "scripts": {
"fs": "latest", "test": "echo \"Error: no test specified\" && exit 1",
"gulp": "^4.0.2", "front": "webpack serve --config config/webpack.dev.js ",
"gulp-bytediff": "latest", "pack": "webpack --config config/webpack.prod.js",
"gulp-cdnizer": "latest", "convert": "npx ./config/buildheader.js",
"gulp-clean-css": "latest", "server": "nodemon config/server.js",
"gulp-concat": "latest", "dev": "concurrently \"npm run server\" \"npm run front\"",
"gulp-gzip": "latest", "build": "npm run pack && npm run convert"
"gulp-htmlmin": "latest",
"gulp-if": "latest",
"gulp-jshint": "latest",
"gulp-ng-annotate": "latest",
"gulp-remove-code": "latest",
"gulp-replace": "latest",
"gulp-smoosher": "latest",
"gulp-uglify": "latest",
"gulp-zip": "latest",
"jshint": "latest",
"merge-stream": "latest",
"lodash": "^4.17.19"
}, },
"repository": "https://github.com/luc-github/ESP3D", "author": "",
"author": "Luc LEBOSSE", "license": "ISC",
"license": "(ISC OR GPL-3.0)" "devDependencies": {
"@babel/core": "^7.12.13",
"@babel/preset-env": "^7.12.13",
"babel-loader": "^8.2.2",
"chalk": "^4.1.0",
"clean-webpack-plugin": "^3.0.0",
"compression-webpack-plugin": "^7.1.2",
"concurrently": "^5.3.0",
"core-js": "^3.8.3",
"css-loader": "^5.0.2",
"espress": "0.0.0",
"express": "^4.17.1",
"express-fileupload": "^1.2.1",
"express-ws": "^4.0.0",
"html-inline-css-webpack-plugin": "^1.10.1",
"html-inline-script-webpack-plugin": "^1.0.1",
"html-minimizer-webpack-plugin": "^2.1.0",
"html-webpack-plugin": "^5.0.0",
"mini-css-extract-plugin": "^1.3.6",
"nodemon": "^2.0.7",
"regenerator-runtime": "^0.13.7",
"style-loader": "^2.0.0",
"webpack": "^5.21.2",
"webpack-cli": "^4.5.0",
"webpack-dev-server": "^3.11.2"
}
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,28 @@
{
"lang" : "Français",
"S1" : "Chargement...",
"S2" : "Connection websocket...",
"S3" : "Apparement vous êtes connecté depuis une autre page, donc cette page est désormais déconnectée",
"S4" : "Erreur traitement lors du fichier de configuration, le fichier est incorrecte",
"S5" : "Impossible de se connecter au serveur de la carte",
"S6" : "Erreur de connection WebSocket",
"S7" : "Erreur lors du traitement du fichier de préférences, le fichier est incorrecte",
"S8" : "SVP reconnectez-moi",
"S9" : "déconnecté",
"S10" : "Connection with board is lost",
"S11" : "Aidez nous",
"S12" : "A propos d'ESP3D",
"S13" : "Tableau de bord",
"S14" : "Parmètres",
"S15" : "Donation pour ESP3D",
"S16" : "Version micrologiciel",
"S17" : "Version interface",
"S18" : "Version navigateur",
"S19" : "Inconnu",
"S20" : "Go to github",
"S21" : "Parsing data error, data are incorrect",
"S22" : "Erreur",
"S23" : "Refresh information",
"S24" : "Fermer",
"T9" : "Utilisation sytème de fichiers"
}

Binary file not shown.

116
embedded/src/index.html Normal file
View File

@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div>
<ul>
<li id="FWLink">Firmware</li>
<li id="UiLink">Interface</li>
<li id="hlpLink">Help</li>
<li id="espLink" class="hide">ESP3D</li>
<li class="menuspacer"></li>
<li id="loginLink" class="hide">Login</li>
<li id="verLink" disabled></li>
</ul>
</div>
<hr />
<div id="MSG"></div>
<div id="consolePanel" class="panel hide">
<div id="consoleHeader" class="panel-header">Terminal</div>
<div id="consoleBody" class="panel-body no-footer">
<div class="controlBar">
<input
class="formControl"
autocomplete="off"
type="text"
value=""
id="customCmdTxt"
/>
<button class="btn" id="cmdBtn">Send</button>
<div class="controlBar">
<input type="checkbox" id="monitor_enable_autoscroll" checked />
<label for="monitor_enable_autoscroll">Autoscroll</label>
</div>
</div>
<pre id="consoleContent"></pre>
</div>
</div>
<div id="fileSystem" class="panel hide">
<div id="fileSystemHeader" class="panel-header">Filesystem</div>
<div id="fileSystemBody" class="panel-body no-footer">
<div class="controlBar">
<input class="hide" type="file" value="" id="files" multiple />
<button class="btn" id="refresh">Refresh</button>
<button class="btn" id="createdir" title="Create directory">+</button>
<button class="btn" id="uploadFiles" title="upload files">+</button>
<div class="label hide" id="prgfiletext">0%</div>
<progress
class="progbar hide"
id="prgfile"
max="100"
value="50"
></progress>
</div>
<div id="filecontent" class="panel">
<div id="filecontentbody" class="panel-body no-header">
<div class="label" id="path">/</div>
<table class="table table-striped">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Size</th>
<th width="0%"></th>
<th width="100%"></th>
</tr>
</thead>
<tbody id="fileList"></tbody>
</table>
</div>
<div id="filecontentFooter" class="panel-footer"></div>
</div>
</div>
</div>
<div id="firmware" class="panel hide">
<div id="firmwareHeader" class="panel-header">Firmware update</div>
<div id="firmwareBody" class="panel-body no-footer">
<div class="controlBar">
<input class="hide" type="file" value="" accept=".bin" id="filefw" />
<button class="btn" id="uploapFW">Select File</button>
<div class="label hide" id="prgupdatetext">0%</div>
<progress
class="progbar hide"
id="prgupdate"
max="100"
value="50"
></progress>
</div>
</div>
</div>
<br />
<div id="loginpage" class="modal hide">
<div class="modal-content">
<div class="modal-header">Identification</div>
<div class="modal-body">
<div class="controlBar">
<div class="label">User:</div>
<input type="text" id="loginInput" />
</div>
<hr />
<div class="controlBar">
<div class="label">Password:</div>
<input type="password" id="passwordInput" />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn" id="loginbutton">Login</button>
</div>
</div>
</div>
</body>
</html>

774
embedded/src/index.js Normal file
View File

@ -0,0 +1,774 @@
import "./style.css";
import { initMenus } from "./menu";
let isConsoleExpanded = false;
let isAutoScroll = true;
let consoleContentList = [];
let consoleContent;
let isFileSystemExpanded = true;
let isFirmwareUpdateExpanded = false;
let consolePanel;
let fileSystem;
let firmware;
let consoleHeader;
let consoleBody;
let fileSystemHeader;
let fileSystemBody;
let filecontentFooter;
let firmwareHeader;
let firmwareBody;
let filesInput;
let fwInput;
let filesButton;
let firmwareButton;
let refreshButton;
let createDirButton;
let message;
let websocketStarted = false;
let wsSource;
let wsMsg = "";
let logOff = false;
let pageId = "";
let currentPath = "/";
const version = "3.0.0.a1";
let xmlhttpupload;
let prgfiletext;
let prgfile;
let uploadType = 0;
let restartTime;
let loginLink;
let loginModal;
window.onload = function () {
consolePanel = document.getElementById("consolePanel");
fileSystem = document.getElementById("fileSystem");
firmware = document.getElementById("firmware");
consoleHeader = document.getElementById("consoleHeader");
consoleBody = document.getElementById("consoleBody");
fileSystemHeader = document.getElementById("fileSystemHeader");
fileSystemBody = document.getElementById("fileSystemBody");
filecontentFooter = document.getElementById("filecontentFooter");
firmwareHeader = document.getElementById("firmwareHeader");
firmwareBody = document.getElementById("firmwareBody");
consoleContent = document.getElementById("consoleContent");
fwInput = document.getElementById("filefw");
filesInput = document.getElementById("files");
message = document.getElementById("MSG");
prgfiletext = document.getElementById("prgfiletext");
prgfile = document.getElementById("prgfile");
document.getElementById("cmdBtn").addEventListener("click", function () {
let input = document.getElementById("customCmdTxt");
if (input.value.trim().length == 0) return;
let url = new URL("http://" + window.location.host + "/command");
url.searchParams.append("cmd", input.value.trim());
httpGet(url, processCmdJson);
consoleContentUpdate(
"<span class='cmd'>" + input.value.trim() + "</span>\n"
);
input.value = "";
});
document
.getElementById("customCmdTxt")
.addEventListener("keyup", function (event) {
if (event.keyCode === 13) {
document.getElementById("cmdBtn").click();
}
});
consoleHeader.addEventListener("click", function () {
isConsoleExpanded = !isConsoleExpanded;
if (isConsoleExpanded) consoleBody.style.display = "block";
else consoleBody.style.display = "none";
});
loginLink = document.getElementById("loginLink");
loginModal = document.getElementById("loginpage");
loginLink.addEventListener("click", function () {
loginModal.classList.remove("hide");
});
document.getElementById("loginbutton").addEventListener("click", function () {
loginModal.classList.add("hide");
let user = document.getElementById("loginInput").value.trim();
let password = document.getElementById("passwordInput").value.trim();
let url = new URL("http://" + window.location.host + "/login");
url.searchParams.append("USER", user);
url.searchParams.append("PASSWORD", password);
url.searchParams.append("SUBMIT", "yes");
let xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status != 200) {
if (xmlhttp.status == 401) {
loginModal.classList.remove("hide");
loginLink.classList.remove("hide");
} else {
console.log(xmlhttp.status);
ErrorMSG(
"Error: board does not answered properly " + xmlhttp.status
);
}
} else {
getFWData();
}
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
});
refreshButton = document.getElementById("refresh");
refreshButton.addEventListener("click", function () {
SendFileCommand("list", "all");
});
firmwareButton = document.getElementById("uploapFW");
firmwareButton.addEventListener("click", function () {
prgupdatetext.innerHTML = "";
fwInput.click();
});
filesButton = document.getElementById("uploadFiles");
filesButton.innerHTML = fileIcon(true);
filesButton.addEventListener("click", function () {
filesInput.click();
});
fwInput.addEventListener("change", function () {
if (fwInput.value) {
if (!confirm("Confirm Firmware Update ?")) {
console.log("abort");
fwInput.value = "";
return;
}
uploadFirmware();
}
});
filesInput.addEventListener("change", function () {
console.log("upload");
if (filesInput.value) {
uploadFiles();
}
});
document
.getElementById("monitor_enable_autoscroll")
.addEventListener("click", function () {
if (document.getElementById("monitor_enable_autoscroll").checked) {
isAutoScroll = true;
autoscroll();
} else {
isAutoScroll = false;
}
});
consoleBody.style.display = "none";
fileSystemHeader.addEventListener("click", function () {
isFileSystemExpanded = !isFileSystemExpanded;
if (isFileSystemExpanded) {
fileSystemBody.style.display = "block";
fileSystemBody.scrollIntoView();
} else {
fileSystemBody.style.display = "none";
}
});
firmwareHeader.addEventListener("click", function () {
isFirmwareUpdateExpanded = !isFirmwareUpdateExpanded;
if (isFirmwareUpdateExpanded) {
firmwareBody.style.display = "block";
firmwareBody.scrollIntoView();
} else firmwareBody.style.display = "none";
});
firmwareBody.style.display = "none";
createDirButton = document.getElementById("createdir");
createDirButton.innerHTML = dirIcon(true);
createDirButton.addEventListener("click", function () {
let filename = prompt("Directory name", "");
if (filename != null && filename.trim().length > 0) {
SendFileCommand("createdir", filename.trim());
}
});
getFWData();
initMenus();
};
function padNumber(num, size) {
let s = num.toString().padStart(size, "0");
return s;
}
function getPCTime() {
let 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 isLimitedEnvironment(wifiMode) {
let sitesList = [
"clients3.google.com", //Android Captive Portal Detection
"connectivitycheck.",
//Apple iPhone, iPad with iOS 6 Captive Portal Detection
"apple.com",
".akamaitechnologies.com",
//Apple iPhone, iPad with iOS 7, 8, 9 and recent versions of OS X
"www.appleiphonecell.com",
"www.itools.info",
"www.ibook.info",
"www.airport.us",
"www.thinkdifferent.us",
".akamaiedge.net",
//Windows
".msftncsi.com",
"microsoft.com",
];
if (wifiMode != "AP") return false;
for (let i = 0; i < sitesList.length; i++) {
if (document.location.host.indexOf(sitesList[i]) != -1) return true;
}
return false;
}
function autoscroll() {
if (isAutoScroll) consoleContent.scrollTop = consoleContent.scrollHeight;
}
function consoleContentUpdate(message) {
if (message) {
consoleContentList = consoleContentList.concat(message);
consoleContentList = consoleContentList.slice(-300);
let output = "";
for (let i = 0; i < consoleContentList.length; i++) {
output += consoleContentList[i];
}
document.getElementById("consoleContent").innerHTML = output;
autoscroll();
}
}
function processCmdJson(text) {
let json;
try {
json = JSON.parse(text);
consoleContentUpdate(JSON.stringify(json, null, " ") + "\n");
} catch (e) {
consoleContentUpdate(text + "\n");
}
}
function processFWJson(text) {
let json;
try {
json = JSON.parse(text);
} catch (e) {
ErrorMSG("Error: json data are incorrect!<br/>" + text);
consoleContentUpdate(text);
return;
}
if (json.FWVersion) {
let verLink = document.getElementById("verLink");
verLink.innerHTML = "v" + json.FWVersion;
verLink.addEventListener("click", function () {
let url = new URL("http://" + window.location.host + "/config");
window.open(url, "_blank");
});
} else {
ErrorMSG(
"Error: json data are incorrect!<br/>" +
JSON.stringify(json, null, "<br/> ")
);
return;
}
document.getElementById("espLink").addEventListener("click", function () {
let url = new URL("http://" + window.location.host);
window.open(url);
});
consolePanel.classList.remove("hide");
if (json.Filesystem && json.Filesystem != "None")
fileSystem.classList.remove("hide");
if (json.WebUpdate == "Enabled") firmware.classList.remove("hide");
if (json.WiFiMode && json.WebSocketIP) {
if (isLimitedEnvironment(json.WiFiMode)) {
let address =
"http://" +
json.WebSocketIP +
(window.location.port == 80 ? "" : ":" + window.location.port);
InfoMSG(
"It seems you are in limited environment,<br> please open a browser using<BR>" +
address +
"<br>to get all features working"
);
}
}
if (json.Hostname) document.title = json.Hostname;
startSocket(json.WebSocketIP, json.WebSocketport, json.WebCommunication);
SendFileCommand("list", "all");
}
function startSocket(ip, port, sync) {
if (websocketStarted) {
wsSource.close();
}
wsSource = new WebSocket(
"ws://" + ip + ":" + port + (sync == "Asynchronous" ? "/ws" : ""),
["arduino"]
);
wsSource.binaryType = "arraybuffer";
wsSource.onopen = function (e) {
websocketStarted = true;
};
wsSource.onclose = function (e) {
websocketStarted = false;
//seems sometimes it disconnect so wait 3s and reconnect
//if it is not a log off
if (!logOff)
setTimeout(() => {
startSocket(ip, port, sync);
}, 3000);
};
wsSource.onerror = function (e) {};
wsSource.onmessage = function (e) {
let msg = "";
//bin
if (e.data instanceof ArrayBuffer) {
let bytes = new Uint8Array(e.data);
for (let i = 0; i < bytes.length; i++) {
msg += String.fromCharCode(bytes[i]);
if (bytes[i] == 10 || bytes[i] == 13) {
wsMsg += msg;
consoleContentUpdate(wsMsg);
wsMsg = "";
msg = "";
}
}
wsMsg += msg;
} else {
msg = e.data;
let tval = msg.split(":");
if (tval.length >= 2) {
if (tval[0] == "currentID") {
pageId = tval[1];
}
if (tval[0] == "activeID") {
if (pageId != tval[1]) {
logOff = true;
wsSource.close();
InfoMSG(
"<br/><br/>It seems you are connect from another location, you are now disconnected."
);
document.title = document.title + "(disconnected)";
consolePanel.classList.add("hide");
firmware.classList.add("hide");
fileSystem.classList.add("hide");
document.getElementById("verLink").classList.add("disabled");
}
}
if (tval[0] == "ERROR") {
xmlhttpupload.abort();
uploadError(tval[2], tval[1]);
}
}
}
};
}
function uploadError(msg, nb) {
let status = "Upload failed";
if (nb != 0 && typeof nb != "undefined") {
status = msg + "(" + nb + ")";
}
alert(status + "!");
if (uploadType == 1) {
let currentstatus = filecontentFooter.innerHTML;
if (currentstatus.length > 0) {
filecontentFooter.innerHTML =
"Status: " +
status +
"&nbsp&nbsp" +
currentstatus.substring(currentstatus.indexOf("|"));
} else {
filecontentFooter.innerHTML = status;
}
} else if (uploadType == 2) {
prgupdatetext.innerHTML = status;
}
//location.reload();
}
function ErrorMSG(msg) {
message.innerHTML = msg;
message.className = "text-error";
}
function InfoMSG(msg) {
message.innerHTML = msg;
message.className = "text-primary";
}
function getFWData() {
let url = new URL("http://" + window.location.host + "/command");
url.searchParams.append("cmd", "[ESP800]time=" + getPCTime());
httpGet(url, processFWJson);
}
function SendFileCommand(action, filename) {
let url = new URL("http://" + window.location.host + "/files");
url.searchParams.append("action", action);
url.searchParams.append("filename", filename);
url.searchParams.append("path", currentPath);
httpGet(url, dispatchFileStatus);
}
function trashIcon() {
return "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='red' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-trash-2'><polyline points='3 6 5 6 21 6'></polyline><path d='M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'></path><line x1='10' y1='11' x2='10' y2='17'></line><line x1='14' y1='11' x2='14' y2='17'></line></svg>";
}
function backIcon() {
return "<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' ><polyline points='10 9 15 4 20 9'></polyline><path d='M4 20h7a4 4 0 0 0 4-4V4'></path></svg>";
}
function fileIcon(plus = false) {
return (
"<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='" +
(plus ? "white" : "currentColor") +
"' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z'></path><polyline points='13 2 13 9 20 9'></polyline>" +
(plus
? "<line x1='12' y1='11' x2='12' y2='17'></line><line x1='9' y1='14' x2='15' y2='14'></line>"
: "") +
"</svg>"
);
}
function dirIcon(plus = false) {
return (
"<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='" +
(plus ? "white" : "currentColor") +
"' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z'></path>" +
(plus
? "<line x1='12' y1='11' x2='12' y2='17'></line><line x1='9' y1='14' x2='15' y2='14'></line>"
: "") +
"</svg>"
);
}
function dispatchFileStatus(jsonresponse) {
let json;
let eventslisteners = [];
let showESP3Dbutton = false;
try {
json = JSON.parse(jsonresponse);
//ugly but code is smaller
filecontentFooter.innerHTML =
"Status: " +
json.status +
"&nbsp;&nbsp;|&nbsp;&nbsp;Total space: " +
json.total +
"&nbsp;&nbsp;|&nbsp;&nbsp;Used space: " +
json.used +
"&nbsp;&nbsp;|&nbsp;&nbsp;Occupation: " +
"<meter min='0' max='100' high='90' value='" +
json.occupation +
"'></meter>&nbsp;" +
json.occupation +
"%";
json.files.sort(function (a, b) {
return compareStrings(a.name, b.name);
});
let content = "";
document.getElementById("path").innerHTML = currentPath;
if (currentPath != "/") {
let pos = currentPath.lastIndexOf("/");
let newPath;
if (pos == 0) newPath = "/";
else newPath = currentPath.substring(0, pos);
console.log("newpath:" + newPath);
content +=
"<tr ><td>" +
backIcon() +
"</td><td class='fileitem' id='updir'> Up..</td><td colspan='3'></td></tr>";
eventslisteners.push({ action: "updir", id: "updir", target: newPath });
}
for (let i1 = 0; i1 < json.files.length; i1++) {
if (String(json.files[i1].size) == "-1") {
content +=
"<tr><td>" +
dirIcon() +
"</td><td class='fileitem' id='Dir" +
i1 +
"'>" +
json.files[i1].name +
"</td><td></td><td class='fileicon' id='DirDel" +
i1 +
"'>" +
trashIcon() +
"</td><td></td></tr>";
eventslisteners.push({
action: "dir",
id: "Dir" + i1,
target: json.files[i1].name,
});
eventslisteners.push({
action: "dirdel",
id: "DirDel" + i1,
target: json.files[i1].name,
});
}
}
for (let i1 = 0; i1 < json.files.length; i1++) {
if (String(json.files[i1].size) != "-1") {
if (
currentPath == "/" &&
(json.files[i1].name == "index.html.gz" ||
json.files[i1].name == "index.html")
) {
showESP3Dbutton = true;
}
content +=
"<tr><td>" +
fileIcon() +
"</td><td class='fileitem' id='File" +
i1 +
"'>" +
json.files[i1].name +
"</td><td>" +
json.files[i1].size +
"</td><td class='fileicon' id='FileDel" +
i1 +
"'>" +
trashIcon() +
"</td><td></td></tr>";
eventslisteners.push({
action: "file",
id: "File" + i1,
target: json.files[i1].name,
});
eventslisteners.push({
action: "filedel",
id: "FileDel" + i1,
target: json.files[i1].name,
});
}
}
document.getElementById("fileList").innerHTML = content;
for (let i = 0; i < eventslisteners.length; i++) {
switch (eventslisteners[i].action) {
case "updir":
document
.getElementById(eventslisteners[i].id)
.addEventListener("click", function () {
currentPath = eventslisteners[i].target;
console.log(currentPath);
SendFileCommand("list", "all");
});
break;
case "file":
document
.getElementById(eventslisteners[i].id)
.addEventListener("click", function () {
let url = new URL(
"http://" +
window.location.host +
currentPath +
"/" +
eventslisteners[i].target
);
window.open(url, "_blank");
});
break;
case "filedel":
document
.getElementById(eventslisteners[i].id)
.addEventListener("click", function () {
if (
confirm(
"Confirm deletion of file: " + eventslisteners[i].target
)
)
SendFileCommand("delete", eventslisteners[i].target);
});
break;
case "dir":
document
.getElementById(eventslisteners[i].id)
.addEventListener("click", function () {
currentPath +=
(currentPath == "/" ? "" : "/") + eventslisteners[i].target;
console.log(currentPath);
SendFileCommand("list", "all");
});
break;
case "dirdel":
document
.getElementById(eventslisteners[i].id)
.addEventListener("click", function () {
if (
confirm(
"Confirm deletion of directory: " + eventslisteners[i].target
)
)
SendFileCommand("deletedir", eventslisteners[i].target);
});
break;
}
}
} catch (e) {
ErrorMSG("Error: json data are incorrect!<br/>" + jsonresponse);
return;
} finally {
if (showESP3Dbutton) {
document.getElementById("espLink").classList.remove("hide");
} else {
document.getElementById("espLink").classList.add("hide");
}
}
}
function httpGet(url, processfn) {
let xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
ErrorMSG("");
processfn(xmlhttp.responseText);
} else if (xmlhttp.status == 401) {
loginModal.classList.remove("hide");
loginLink.classList.remove("hide");
} else {
console.log(xmlhttp.status);
ErrorMSG("Error: board does not answered properly " + xmlhttp.status);
}
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
function compareStrings(a, b) {
// case-insensitive comparison
a = a.toLowerCase();
b = b.toLowerCase();
return a < b ? -1 : a > b ? 1 : 0;
}
function uploadFiles() {
let files = filesInput.files;
if (files.length == 0) return;
let formData = new FormData();
uploadType = 1;
filesButton.classList.add("hide");
createDirButton.classList.add("hide");
refreshButton.classList.add("hide");
prgfiletext.classList.remove("hide");
prgfile.classList.remove("hide");
prgfile.value = 0;
prgfiletext.innerHTML = "Uploading ...0%";
formData.append("path", currentPath);
let currentpath = currentPath;
if (!currentpath.endsWith("/")) currentpath += "/";
for (let i3 = 0; i3 < files.length; i3++) {
let file = files[i3];
let arg = currentpath + file.name + "S";
//append file size first to check updload is complete
formData.append(arg, file.size);
formData.append("myfiles", file, currentpath + file.name);
}
xmlhttpupload = new XMLHttpRequest();
xmlhttpupload.open("POST", "/files", true);
//progress upload event
xmlhttpupload.upload.addEventListener("progress", updateProgress, false);
//progress function
function updateProgress(oEvent) {
if (oEvent.lengthComputable) {
let percentComplete = (oEvent.loaded / oEvent.total) * 100;
prgfile.value = percentComplete;
prgfiletext.innerHTML =
"Uploading ..." + percentComplete.toFixed(0) + "%";
} else {
// Impossible because size is unknown
console.log("oops");
}
}
xmlhttpupload.onloadend = function () {
filesButton.classList.remove("hide");
createDirButton.classList.remove("hide");
refreshButton.classList.remove("hide");
prgfile.classList.add("hide");
prgfiletext.classList.add("hide");
filesInput.value = "";
if (xmlhttpupload.status === 200) {
dispatchFileStatus(xmlhttpupload.responseText);
} else if (xmlhttp.status == 401) {
loginModal.classList.remove("hide");
loginLink.classList.remove("hide");
} else uploadError("Error", xmlhttpupload.status);
};
xmlhttpupload.send(formData);
}
function uploadFirmware() {
let files = fwInput.files;
if (files.length == 0) return;
let formData = new FormData();
uploadType = 2;
firmwareButton.classList.add("hide");
prgupdatetext.classList.remove("hide");
prgupdate.classList.remove("hide");
prgupdate.value = 0;
prgupdatetext.innerHTML = "Uploading ...0%";
formData.append("path", currentPath);
let currentpath = currentPath;
if (!currentpath.endsWith("/")) currentpath += "/";
for (let i3 = 0; i3 < files.length; i3++) {
let file = files[i3];
let arg = currentpath + file.name + "S";
//append file size first to check updload is complete
formData.append(arg, file.size);
formData.append("myfiles", file, currentpath + file.name);
}
xmlhttpupload = new XMLHttpRequest();
xmlhttpupload.open("POST", "/updatefw", true);
//progress upload event
xmlhttpupload.upload.addEventListener("progress", updateProgress, false);
//progress function
function updateProgress(oEvent) {
if (oEvent.lengthComputable) {
let percentComplete = (oEvent.loaded / oEvent.total) * 100;
prgupdate.value = percentComplete;
prgupdatetext.innerHTML =
"Uploading ..." + percentComplete.toFixed(0) + "%";
} else {
// Impossible because size is unknown
console.log("oops");
}
}
xmlhttpupload.onloadend = function () {
firmwareButton.classList.remove("hide");
prgupdate.classList.add("hide");
fwInput.value = "";
if (xmlhttpupload.status === 200) {
prgupdatetext.classList.add("hide");
firmware.classList.add("hide");
consolePanel.classList.add("hide");
fileSystem.classList.add("hide");
document.getElementById("verLink").classList.add("hide");
document.getElementById("espLink").classList.add("hide");
restartTime = 40;
InfoMSG("<br/>Restarting... please wait 40s");
setInterval(function () {
restartTime--;
InfoMSG("<br/>Restarting... please wait " + restartTime + "s");
if (restartTime == 0) location.reload();
}, 1000);
} else if (xmlhttp.status == 401) {
loginModal.classList.remove("hide");
loginLink.classList.remove("hide");
} else uploadError("Error", xmlhttpupload.status);
};
xmlhttpupload.send(formData);
}

15
embedded/src/menu.js Normal file
View File

@ -0,0 +1,15 @@
function initMenus() {
document.getElementById("FWLink").addEventListener("click", function () {
window.open("https://github.com/luc-github/ESP3D/tree/3.0", "_blank");
});
document.getElementById("UiLink").addEventListener("click", function () {
window.open("https://github.com/luc-github/ESP3D-WEBUI/tree/3.0", "_blank");
});
document.getElementById("hlpLink").addEventListener("click", function () {
window.open("https://github.com/luc-github/ESP3D/wiki", "_blank");
});
}
export { initMenus };

334
embedded/src/style.css Normal file
View File

@ -0,0 +1,334 @@
* {
font-family: sans-serif;
color: #5755d9;
background-color: #eef0f3;
-webkit-user-select: none; /* Chrome all / Safari all */
-moz-user-select: none; /* Firefox all */
-ms-user-select: none; /* IE 10+ */
user-select: none;
}
body {
min-width: 360px;
}
hr {
border-top: 1px solid #5755d9;
}
.controlBar {
display: flex;
flex-wrap: wrap;
padding: 10px;
padding-left: 15px;
background-color: white;
margin-bottom: 6px;
}
.cmd {
color: #555555;
}
label {
display: block;
width: auto;
padding: 3px 12px;
color: #5755d9;
background-color: #ffffff;
cursor: pointer;
}
pre {
padding-left: 5px;
padding-right: 5px;
}
.modal {
position: fixed; /* Stay in place */
z-index: 10000; /* Sit on top */
padding-top: 100px; /* Location of the box */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0, 0, 0); /* Fallback color */
background-color: rgba(0, 0, 0, 0.4); /* Black w/ opacity */
}
/* Modal Content */
.modal-content {
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
background-color: #5755d9;
border: 1px solid #5755d9;
position: relative;
margin: auto;
padding: 0;
max-width: 450px;
}
.modal-header {
padding: 16px 16px;
color: #ffffff;
background-color: #5755d9;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-bottom: 1px solid #5755d9;
height: 2.5rem;
line-height: 2.5rem;
font-size: 1.5rem;
}
.modal-body {
padding: 10px 16px;
background-color: #ffffff;
}
.modal-footer {
padding: 16px 16px;
height: 2.5em;
background-color: #ffffff;
border-top: 1px solid #5755d9;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
display: flex;
flex-direction: row-reverse;
}
input {
display: block;
width: auto;
height: 1.5rem;
padding: 6px 12px;
line-height: 1.42857143;
border-radius: 4px;
color: #5755d9;
background-color: #ffffff;
outline: 0;
}
input {
border: 1px solid #5755d9;
}
button {
display: block;
width: auto;
height: 2.4rem;
padding: 6px 12px;
line-height: 1.42857143;
vertical-align: middle;
cursor: pointer;
border: 1px solid black;
white-space: nowrap;
border-radius: 4px;
color: #ffffff;
background-color: #5755d9;
}
::-moz-progress-bar {
background-color: #5755d9;
}
::-webkit-progress-value {
background-color: #5755d9;
}
::-webkit-progress-bar {
background-color: #f1f1f1;
}
progress,
.progbar {
margin-top: 10px;
height: 1rem;
background-color: #f1f1f1;
border: 1px solid #5755d9;
}
.label {
height: 2.4rem;
padding: 6px 12px;
line-height: 1.42857143;
vertical-align: middle;
display: inline-block;
width: auto;
color: #5755d9;
background-color: #ffffff;
overflow-wrap: anywhere;
}
.controlBar > button {
margin-right: 15px;
}
meter {
background-color: #ffffff;
}
button:active {
background-color: #0b0899;
}
ul {
display: flex;
flex-wrap: wrap;
list-style-type: none;
margin: 3px;
padding: 3px;
}
pre {
margin: 10px 10px;
min-height: 350px;
max-height: 350px;
border: 1px solid #5755d9;
overflow-y: auto;
overflow-wrap: anywhere;
}
li {
padding: 9px 14px;
margin: 0px 1rem;
border: 1px hidden;
}
.menuspacer {
flex-grow: 1;
pointer-events: none;
}
.panel {
margin: 10px 10px;
border-radius: 10px;
}
.text-primary {
color: #5755d9;
}
.text-error {
color: red;
}
.disabled {
pointer-events: none;
}
.panel-header {
border-top-left-radius: 10px;
border-top-right-radius: 10px;
background-color: #5755d9;
color: white;
height: 2rem;
line-height: 2rem;
padding: 2px 15px;
cursor: pointer;
}
.no-header {
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-top: 1px solid #5755d9;
}
.no-footer {
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border-bottom: 1px solid #5755d9;
}
.panel-footer {
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border: 1px solid #5755d9;
background-color: white;
min-height: 2rem;
line-height: 2rem;
padding: 2px 15px;
margin: 0px 0px;
}
.panel-body {
min-height: 50px;
background-color: white;
border-right: 1px solid #5755d9;
border-left: 1px solid #5755d9;
}
.no-header {
padding: 10px 10px;
}
.hide {
display: none;
}
.table {
border: 0px;
border-spacing: 0;
max-width: 100%;
}
.table th,
.table td {
white-space: nowrap;
padding: 8px;
line-height: 1.42857143;
vertical-align: top;
border-top: 1px solid #5755d9;
background-color: white;
}
svg {
background-color: white;
}
.fileicon:hover {
cursor: pointer;
background-color: #5755d9;
color: #5755d9;
}
.fileitem:hover,
li:active,
li:hover {
cursor: pointer;
background-color: #5755d9;
color: white;
text-align: center;
}
.fileitem:active {
background-color: #0b0899;
}
.fileicon:hover > svg {
cursor: pointer;
background-color: #5755d9;
color: #5755d9;
}
button > svg {
background-color: #5755d9;
text-decoration-color: #ffffff;
color: white !important;
}
button:active > svg,
.fileicon:active > svg,
.fileicon:active {
background-color: #0b0899;
}
#MSG {
text-align: center;
}
#monitor_enable_autoscroll {
margin: 0px 0px;
cursor: pointer;
}
@media screen and (max-width: 600px) {
.menuspacer {
display: none;
}
}

Binary file not shown.

View File

@ -1,105 +0,0 @@
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%; font-size:10px;}
body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff;}
table{border:0px;border-spacing:0;max-width:100%;}
td{white-space:nowrap; padding:2mm;}
th{text-align:left;}
.table>thead>tr>th,.table>tbody>tr>th,.table>thead>tr>td,.table>tbody>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd;}
.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9;}
a{position:relative;display:block;padding:10px 15px;text-decoration:none;color:#cccccc;}
.active{color:#ffffff;background-color:#000000;}
.active a,a:hover,a:focus{color:#FFFFFF;}
.panel{margin-bottom:20px;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05);}
.panel-body{padding:15px;}
.panel-heading{padding:10px 15px;color:#333333;background-color:#f5f5f5;border-color:#dddddd;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom:1px solid #dddddd;}
.form-control{display:block;width:auto;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555555;background-color:#ffffff
;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);
* -webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;
* transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6);
* box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6);}
.form-group{margin-bottom:15px;}
.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation; touch-action:manipulation;cursor:pointer;
background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;
* -webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}
.btn-primary{color:#ffffff;background-color:#337ab7;border-color:#2e6da4;}
.btn-primary:focus,.btn-primary:active,.btn-primary:hover,.btn-primary.focus,.btn-primary.active,.btn-primary.hover{color:#ffffff;background-color:#286090;border-color:#122b40;}
.btnimg {cursor:hand; border-radius:6px ;border:1px solid #FFFFFF;}
.btnimg:hover{background-color:#F0F0F0;border-color:#6c6c6c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #808080;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #808080;}
.btnroundimg {cursor:hand; border-radius:30px;}
.btnroundimg:hover{background-color:#F0F0F0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #808080;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #808080;}
.blacklink, .blacklink:active {color:#000000;}
.blacklink:hover{color:#000000;}
input[type="file"]::-webkit-file-upload-button{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation; touch-action:manipulation;cursor:pointer;
background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;
* -webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none; color: #ffffff;background-color: #5bc0de;border-color: #46b8da;}
input[type="file"]::-webkit-file-upload-button:focus{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation; touch-action:manipulation;cursor:pointer;
background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;
* -webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none; color: #ffffff;background-color: #31b0d5;border-color: #1b6d85;}
input[type="file"]::-webkit-file-upload-button:hover{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation; touch-action:manipulation;cursor:pointer;
background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;
* -webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none; color: #ffffff;background-color: #31b0d5;border-color: #269abc;}
.panel-footer{padding:10px 15px;color:#31708f;background-color:#f5f5f5;border-color:#dddddd;border-top:1px solid #dddddd;}
.panel-footer{padding:10px 15px;color:#31708f;background-color:#f5f5f5;border-color:#dddddd;border-top:1px solid #dddddd;}
.modal {
display: none; /* Hidden by default */
position: fixed; /* Stay in place */
z-index: 10000; /* Sit on top */
padding-top: 100px; /* Location of the box */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0,0,0); /* Fallback color */
background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}
/* Modal Content */
.modal-content {
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border: 2px solid #337AB7;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
position: relative;
margin: auto;
padding: 0;
background-color: #fefefe;
}
.modal-header {
padding: 2px 16px;
color: #0f0f0f;
background-color: #f2f2f2;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-bottom: 1px solid #cfcfcf;
}
.modal-body {padding: 10px 16px;}
.modal-footer {
padding: 16px 16px;
height: 4.5em;
color: #0f0f0f;
background-color: #f2f2f2;
border-top: 1px solid #cfcfcf;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
}
.hide_it {
display: none;
}
@media (min-width: 768px) {
.modal-content {
width: 580px;
}
}
@media screen and (max-width: 767px) {
.modal-content {
width: 100%;
}
}

View File

@ -1,596 +0,0 @@
var currentpath = "/";
var authentication = false;
var webupdate = false;
var filesystem = false;
var websocket_port = 0;
var websocket_IP = "";
var async_webcommunication = false;
var page_id = "";
var ws_source;
var log_off =false;
var websocket_started =false;
var esp_error_message ="";
var esp_error_code = 0;
var xmlhttpupload;
var typeupload = 0;
var wifimode = "";
var terminal_visible= false;
var terminalbody = DGEI('TERMINAL');
var wsmsg = "";
var Monitor_output = [];
function toogleConsole(){
if (terminal_visible){
terminalbody.style.display="none";
} else{
terminalbody.style.display="block";
}
terminal_visible= !terminal_visible;
}
function DGEI(s){
return document.getElementById(s);
}
function SendCustomCommand(){
if (DGEI('custom_cmd_txt').value.length >0){
Monitor_output_Update(DGEI('custom_cmd_txt').value + "\n");
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 ) {
if(xmlhttp.status == 200) {
Monitor_output_Update(xmlhttp.responseText);
}
}
};
xmlhttp.open("GET", "/command?cmd="+encodeURI(DGEI('custom_cmd_txt').value), true);
xmlhttp.send();
DGEI('custom_cmd_txt').value="";
}
}
function navbar(){
var content="<table><tr>";
var tlist = currentpath.split("/");
var path="/";
var nb = 1;
content+="<td class='btnimg' onclick=\"currentpath='/'; SendCommand('list','all');\">/</td>";
while (nb < (tlist.length-1))
{
path+=tlist[nb] + "/";
content+="<td class='btnimg' onclick=\"currentpath='"+path+"'; SendCommand('list','all');\">"+tlist[nb] +"</td><td>/</td>";
nb++;
}
content+="</tr></table>";
return content;
}
function trash_icon(){
return "<svg width='24' height='24' viewBox='0 0 128 128'>" +
"<rect x='52' y='12' rx='6' ry='6' width='25' height='7' style='fill:red;' />"+
"<rect x='52' y='16' width='25' height='2' style='fill:white;' />"+
"<rect x='30' y='18' rx='6' ry='6' width='67' height='100' style='fill:red;' />"+
"<rect x='20' y='18' rx='10' ry='10' width='87' height='14' style='fill:red;' />"+
"<rect x='20' y='29' width='87' height='3' style='fill:white;' />"+
"<rect x='40' y='43' rx='7' ry='7' width='7' height='63' style='fill:white;' />"+
"<rect x='60' y='43' rx='7' ry='7' width='7' height='63' style='fill:white;' />"+
"<rect x='80' y='43' rx='7' ry='7' width='7' height='63' style='fill:white;' /></svg>";
}
function back_icon(){
return "<svg width='24' height='24' viewBox='0 0 24 24'><path d='M7,3 L2,8 L7,13 L7,10 L17,10 L18,11 L18,15 L17,16 L10,16 L9,17 L9,19 L10,20 L20,20 L22,18 L22,8 L20,6 L7,6 z' stroke='black' fill='white' /></svg>";
}
function select_dir(directoryname){
currentpath+=directoryname + "/";
SendCommand('list','all');
}
function compareStrings(a, b) {
// case-insensitive comparison
a = a.toLowerCase();
b = b.toLowerCase();
return (a < b) ? -1 : (a > b) ? 1 : 0;
}
function dispatchfilestatus(jsonresponse)
{
var content ="";
var display_message = false;
content ="&nbsp;&nbsp;Status: "+jsonresponse.status +
"&nbsp;&nbsp;|&nbsp;&nbsp;Total space: "+jsonresponse.total+
"&nbsp;&nbsp;|&nbsp;&nbsp;Used space: "+jsonresponse.used+
"&nbsp;&nbsp;|&nbsp;&nbsp;Occupation: "+
"<meter min='0' max='100' high='90' value='"+jsonresponse.occupation +"'></meter>&nbsp;"+jsonresponse.occupation +"%";
DGEI('status').innerHTML=content;
content ="";
if (currentpath!="/")
{
var pos = currentpath.lastIndexOf("/",currentpath.length-2);
var previouspath = currentpath.slice(0,pos+1);
content +="<tr style='cursor:hand;' onclick=\"currentpath='"+previouspath+"'; SendCommand('list','all');\"><td >"+back_icon()+"</td><td colspan='4'> Up..</td></tr>";
}
jsonresponse.files.sort(function(a, b) {
return compareStrings(a.name, b.name);
});
if (currentpath=="/") {
display_message = true;
}
var display_time =false;
for (var i1=0;i1 <jsonresponse.files.length;i1++){
//first display files
if (String(jsonresponse.files[i1].size) != "-1")
{
content +="<TR>"+
"<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'/>"+
"</svg></td>"+
"<TD class='btnimg' style=\"padding:0px;\"><a href=\""+jsonresponse.path+jsonresponse.files[i1].name+"\" target=_blank><div class=\"blacklink\">"+
jsonresponse.files[i1].name;
if ((jsonresponse.files[i1].name == "index.html.gz")||(jsonresponse.files[i1].name == "index.html")){
display_message = false;
}
content +="</div></a></TD><TD>";
content +=jsonresponse.files[i1].size;
content +="</TD>";
if (jsonresponse.files[i1].hasOwnProperty('time')){
display_time = true;
content +="<TD>"+ jsonresponse.files[i1].time + "</TD>";
} else {
content +="<TD></TD>";
}
content +="<TD width='0%'><div class=\"btnimg\" onclick=\"Delete('"+jsonresponse.files[i1].name+"')\">"+
trash_icon()+"</div></TD><td></td></TR>";
}
}
//then display directories
for (var i2=0;i2 <jsonresponse.files.length;i2++){
if (String(jsonresponse.files[i2].size) == "-1")
{
content+="<TR><td><svg height='24' width='24' viewBox='0 0 24 24' ><path d='M19,11 L19,8 L18,7 L8,7 L8,5 L7,4 L2,4 L1,5 L1,22 L19,22 L20,21 L23,11 L5,11 L2,21 L1,22' stroke='black' fill='white' /></svg></td>"+
"<TD class='btnimg blacklink' style='padding:10px 15px;' onclick=\"select_dir('" + jsonresponse.files[i2].name+"');\">"+
jsonresponse.files[i2].name+"</TD><TD></TD><TD></TD>";
if (typeof jsonresponse.files[i2].hasOwnProperty('time')){
display_time = true;
}
content +="<TD width='0%'><div class=\"btnimg\" onclick=\"Deletedir('"+jsonresponse.files[i2].name+"')\">"+trash_icon()+"</div></TD><td></td></TR>";
}
}
if(display_time){
DGEI('FS_time').innerHTML = "";
} else {
DGEI('FS_time').innerHTML = "Time";
}
if (display_message) {
DGEI('MSG').innerHTML = "File index.html.gz is missing, please upload it";
} else {
DGEI('MSG').innerHTML = "<a href='/' class= 'btn btn-primary'>Go to ESP3D interface</a>";
}
DGEI('file_list').innerHTML=content;
DGEI('path').innerHTML=navbar();}
function Delete(filename){
if (confirm("Confirm deletion of file: " + filename))SendCommand("delete",filename);
}
function Deletedir(filename){
if (confirm("Confirm deletion of directory: " + filename))SendCommand("deletedir",filename);
}
function Createdir(){
var filename = prompt("Directory name", "");
if (filename != null) {
SendCommand("createdir",filename.trim());
}
}
function isLimitedEnvironment() {
var sitesList = [
"clients3.google.com", //Android Captive Portal Detection
"connectivitycheck.",
//Apple iPhone, iPad with iOS 6 Captive Portal Detection
"apple.com",
".akamaitechnologies.com",
//Apple iPhone, iPad with iOS 7, 8, 9 and recent versions of OS X
"www.appleiphonecell.com",
"www.itools.info",
"www.ibook.info",
"www.airport.us",
"www.thinkdifferent.us",
".akamaiedge.net",
//Windows
".msftncsi.com",
"microsoft.com",
];
if (wifimode != "AP")return false;
for (var i = 0; i < sitesList.length; i++) {
if (document.location.host.indexOf(sitesList[i]) != -1) return true;
}
return false;
}
function SendCommand(action,filename){
var xmlhttp = new XMLHttpRequest();
var url = "/files?action="+action;
DGEI('MSG').innerHTML = "Connecting...";
url += "&filename="+encodeURI(filename);
url += "&path="+encodeURI(currentpath);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 ) {
if(xmlhttp.status == 200) {
var jsonresponse = JSON.parse(xmlhttp.responseText);
dispatchfilestatus(jsonresponse);
} else {
if(xmlhttp.status == 401) {
RL ();
} else {
console.log(xmlhttp.status);
FWError();
}
}
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
function Sendfile(){
var files = DGEI('file-select').files;
if (files.length==0)return;
DGEI('upload-button').value = "Uploading...";
DGEI('prg').style.visibility = "visible";
var formData = new FormData();
formData.append('path', currentpath);
for (var i3 = 0; i3 < files.length; i3++) {
var file = files[i3];
var arg = currentpath + file.name + "S";
//append file size first to check updload is complete
formData.append(arg, file.size);
formData.append('myfiles[]', file, currentpath+file.name);}
xmlhttpupload = new XMLHttpRequest();
xmlhttpupload.open('POST', '/files', true);
//progress upload event
xmlhttpupload.upload.addEventListener("progress", updateProgress, false);
//progress function
function updateProgress (oEvent) {
if (oEvent.lengthComputable) {
var percentComplete = (oEvent.loaded / oEvent.total)*100;
DGEI('prg').value=percentComplete;
DGEI('upload-button').value = "Uploading ..." + percentComplete.toFixed(0)+"%" ;
} else {
// Impossible because size is unknown
}
}
typeupload = 1;
xmlhttpupload.onload = function () {
if (xmlhttpupload.status === 200) {
DGEI('upload-button').value = 'Upload';
DGEI('prg').style.visibility = "hidden";
DGEI('file-select').value="";
var jsonresponse = JSON.parse(xmlhttpupload.responseText);
dispatchfilestatus(jsonresponse);
} else uploadError();
};
xmlhttpupload.send(formData);
}
function autoscroll(){
if (DGEI('monitor_enable_autoscroll').checked == true) DGEI('cmd_content').scrollTop = DGEI('cmd_content').scrollHeight;
}
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){
//console.log("Hide all:" + msg);
log_off = true;
if(websocket_started){
ws_source.close();
}
document.title = document.title + "(disconnected)";
DGEI('MSG').innerHTML = msg;
DGEI('FILESYSTEM').style.display = "none";
DGEI('FWUPDATE').style.display = "none";
DGEI('CONSOLE').style.display = "none";
}
function FWError(){
HideAll("Failed to communicate with FW!");
}
function FWOk(){
DGEI('MSG').innerHTML = "Connected";
DGEI('CONSOLE').style.display = "block";
if (filesystem){
DGEI('FILESYSTEM').style.display = "block";
}
if (webupdate){
DGEI('FWUPDATE').style.display = "block";
}
}
function InitUI(){
var xmlhttp = new XMLHttpRequest();
var url = "/command?cmd="+encodeURI("[ESP800]"+"time=" + getPCTime());
authentication = false;
async_webcommunication = false;
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 ) {
var error = false;
if(xmlhttp.status == 200) {
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.WebSocketIP === "undefined") || (typeof jsonresponse.WebCommunication === "undefined") || (typeof jsonresponse.Filesystem === "undefined") || (typeof jsonresponse.Authentication === "undefined")) {
error = true;
} else {
DGEI('FWVERSION').innerHTML = "v"+jsonresponse.FWVersion;
if (jsonresponse.Filesystem != "None"){
filesystem = true;
//console.log(jsonresponse.Filesystem);
}
if (jsonresponse.WebUpdate != "Disabled"){
webupdate = true;
//console.log(jsonresponse.WebUpdate);
}
//
wifimode = jsonresponse.WiFiMode;
//websocket port
websocket_port = jsonresponse.WebSocketport;
//websocket IP
websocket_IP = jsonresponse.WebSocketIP;
//console.log(websocket_port);
//async communications
if (jsonresponse.WebCommunication != "Synchronous") {
async_webcommunication = true;
//console.log(jsonresponse.WebCommunication);
}
if (isLimitedEnvironment()){
DGEI('InfoMSG').innerHTML="It seems you are in limited environment,<br> please open a browser using<BR>" + websocket_IP + "<br>to get all features working";
} else {
DGEI('InfoMSG').innerHTML="";
}
FWOk();
startSocket();
document.title = jsonresponse.Hostname;
if (filesystem)SendCommand('list','all');
if (jsonresponse.Authentication != "Disabled"){
authentication = true;
//console.log(jsonresponse.Authentication);
DGEI('loginicon').style.visibility = "visible";
} else {
DGEI('loginicon').style.visibility = "hidden";
}
}
} else if (xmlhttp.status == 401){
RL();
} else {
error = true;
console.log( xmlhttp.status);
}
if (error) {
FWError();
}
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
function Monitor_output_Update(message) {
if (message) {
Monitor_output = Monitor_output.concat(message);
Monitor_output = Monitor_output.slice(-300);
var output="";
for (var i = 0; i < Monitor_output.length; i++) {
output+=Monitor_output[i];
}
DGEI("cmd_content").innerHTML = output;
autoscroll();
}
}
function startSocket(){
if (websocket_started){
ws_source.close();
}
if(async_webcommunication){
ws_source = new WebSocket('ws://'+websocket_IP + ':' + websocket_port +'/ws',['arduino']);
}
else {
//console.log("Socket port is :" + websocket_port);
ws_source = new WebSocket('ws://'+websocket_IP + ':' + websocket_port,['arduino']);
}
ws_source.binaryType = "arraybuffer";
ws_source.onopen = function(e){
console.log("WS");
websocket_started = true;
};
ws_source.onclose = function(e){
websocket_started = false;
console.log("~WS");
//seems sometimes it disconnect so wait 3s and reconnect
//if it is not a log off
if(!log_off) setTimeout(startSocket, 3000);
};
ws_source.onerror = function(e){
console.log("WS", e);
};
ws_source.onmessage = function(e){
var msg = "";
//bin
if (e.data instanceof ArrayBuffer) {
var bytes = new Uint8Array(e.data);
for (var i = 0; i < bytes.length; i++) {
msg += String.fromCharCode(bytes[i]);
if ((bytes[i] == 10) || (bytes[i] == 13)) {
wsmsg += msg;
Monitor_output_Update(wsmsg);
wsmsg = "";
msg = "";
}
}
wsmsg += msg;
} else {
msg = e.data;
var tval = msg.split(":");
if (tval.length >= 2) {
if (tval[0] == 'currentID') {
page_id = tval[1];
console.log("ID " + page_id);
}
if (tval[0] == 'activeID') {
if(page_id != tval[1]) {
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);
};
}
window.onload = function() {
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();
DGEI('upload-button').value = 'Upload';
DGEI('prg').style.visibility = "hidden";
DGEI('file-select').value="";
SendCommand('list', 'all');
} else {
location.reload();
}
}
function Uploadfile(){
if (!confirm("Confirm Firmware Update ?"))return;
var files = DGEI('fw-select').files;
if (files.length==0)return;
DGEI('ubut').style.visibility = 'hidden';
DGEI('fw-select').style.visibility = 'hidden';
DGEI('msg').style.visibility = "visible";
DGEI('msg').innerHTML="";
DGEI('MSG').innerHTML="Please wait";
DGEI('CONSOLE').style.display = "none";
DGEI('FILESYSTEM').style.display = "none";
DGEI('prgfw').style.visibility = "visible";
var formData = new FormData();
for (var i4 = 0; i4 < files.length; i4++) {
var file = files[i4];
var arg = "/" + file.name + "S";
//append file size first to check updload is complete
formData.append(arg, file.size);
formData.append('myfile[]', file, "/"+file.name);}
typeupload = 0;
xmlhttpupload = new XMLHttpRequest();
xmlhttpupload.open('POST', '/updatefw', true);
//progress upload event
xmlhttpupload.upload.addEventListener("progress", updateProgress, false);
//progress function
function updateProgress (oEvent) {
if (oEvent.lengthComputable) {
var percentComplete = (oEvent.loaded / oEvent.total)*100;
DGEI('prgfw').value=percentComplete;
DGEI('msg').innerHTML = "Uploading ..." + percentComplete.toFixed(0)+"%" ;
} else {
// Impossible because size is unknown
}
}
xmlhttpupload.onload = function () {
if (xmlhttpupload.status === 200) {
DGEI('ubut').value = 'Upload';
DGEI('msg').innerHTML="Restarting....";
DGEI('counter').style.visibility = "visible";
DGEI('ubut').style.visibility = 'hidden';
DGEI('ubut').style.width = '0px';
DGEI('fw-select').value="";
DGEI('fw-select').style.visibility = 'hidden';
DGEI('fw-select').style.width = '0px';
var jsonresponse = JSON.parse(xmlhttpupload.responseText);
if (jsonresponse.status=='1' || jsonresponse.status=='4' || jsonresponse.status=='1')uploadError();
if (jsonresponse.status=='2')alert('Update canceled!');
else if (jsonresponse.status=='3')
{
var i5 = 0;
var interval;
var x = DGEI("prgfw");
x.max=40;
interval = setInterval(function(){
i5=i5+1;
var x = DGEI("prgfw");
x.value=i5;
DGEI('counter').innerHTML=41-i5;
if (i5>40)
{
clearInterval(interval);
location.reload();
}
},1000);
}
else uploadError();
} else uploadError();
};
xmlhttpupload.send(formData);
}
function RL(){
DGEI('loginpage').style.display='block';
}
function SLR (){
DGEI('loginpage').style.display='none';
var user = DGEI('lut').value.trim();
var password = DGEI('lpt').value.trim();
var url = "/login?USER="+encodeURIComponent(user) + "&PASSWORD=" + encodeURIComponent(password) + "&SUBMIT=yes" ;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4){
if (xmlhttp.status != 200) {
if (xmlhttp.status == 401) {
RL();
} else {
FWError();
console.log(xmlhttp.status);
}
} else {
InitUI();
}
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}

View File

@ -1,166 +0,0 @@
<html>
<head>
<!-- smoosh -->
<link href="css/style.css" rel="stylesheet">
<!-- endsmoosh -->
<title>ESP3D tool page</title>
</head>
<body>
<div class="panel">
<table width="100%">
<tr>
<td>
<a class="btnimg" href="https://www.github.com/luc-github/ESP3D/tree/3.0" target="_blank">
<svg width='1em' height='1em' viewBox='0 0 1300 1200'>
<g transform='translate(50,1200) scale(1, -1)'>
<path d='M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z'></path>
</g>
</svg>
<span class="blacklink">Firmware</span>
</a>
</td>
<td>
<a class="btnimg" href="https://www.github.com/luc-github/ESP3D-WEBUI/tree/3.0" target="_blank">
<svg width='1em' height='1em' viewBox='0 0 1300 1200'>
<g transform='translate(50,1200) scale(1, -1)'>
<path d='M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z'> </path>
</g>
</svg>
<span class="blacklink">Interface</span>
</a>
</td>
<td>
<a class="btnimg" href="https://github.com/luc-github/ESP3D/wiki" target="_blank">
<svg width='1em' height='1em' viewBox='0 0 1300 1200'>
<g transform='translate(50,1200) scale(1, -1)'>
<path d='M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z'> </path>
</g>
</svg>
<span class="blacklink">Help</span></a>
</td>
<td style="width:100%;"></td>
<td onclick='RL();' id="loginicon" style='visibility:hidden'>
<a class="btnimg">
<svg width='1.3em' height='1.2em' viewBox='0 0 1300 1200'>
<g transform='translate(50,1200) scale(1, -1)'>
<path fill='black' d='M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z' />
</g>
</svg>
</a>
</td>
<td style="text-align:right;">
<a href="/config" target="_blank">
<span id="FWVERSION" class="blacklink"></span>
</a>
</td>
</tr>
</table>
</div>
<div class="panel">
<center><h2 id="MSG"></h2><h2 id="InfoMSG"></h2></center>
</div>
<div class="panel hide_it" id="CONSOLE">
<div class="panel-heading" onclick='toogleConsole()'>Console</div>
<div class="panel-body hide_it" id="TERMINAL">
<table>
<tr>
<td>
<input class="form-control" autocomplete="off" type="text" value="" id="custom_cmd_txt" placeholder="Send Command..." />
</td>
<td>
<button class="btn btn-primary" onclick="SendCustomCommand();" >Send</button>
</td>
<td>
<input type="checkbox" onclick="autoscroll()" id="monitor_enable_autoscroll" checked />
<span>Autoscroll</span>
</td>
</tr>
</table>
<div style="overflow-wrap: break-word;">
<pre id="cmd_content" style="min-height: 350px; max-height: 350px;border:1px solid black;overflow-y: auto;overflow-wrap: anywhere;"></pre>
</div>
</div>
</div>
<div class="panel hide_it" id="FILESYSTEM">
<div class="panel-heading">Flash Filesystem</div>
<div class="panel-body">
<input type="file" id="file-select" name="myfiles[]" multiple />
<input class="btn btn-primary" type="button" id="upload-button" onclick="Sendfile();" value="Upload"/>&nbsp;&nbsp;<progress style="visibility:hidden;" name='prg' id='prg' max='100'></progress>
<br><br>
<div class="panel">
<div class="panel-body">
<table>
<tr>
<td width="0%">
<input class="btn btn-primary" type="button" onclick="SendCommand('list','all');" value="Refresh"/>
</td>
<td width="0%">
<div onclick="Createdir()" class="btnimg"><svg width="40" height="40" viewBox="0 0 40 40"><rect x="5" y="10" width="30" height="20" rx="2" ry="2" fill="#31b0d5" />
<rect x="20" y="5" width="15" height="15" rx="2" ry="2" fill="#31b0d5" /><text x="15" y="25" font-size="18" font-weight="800" fill="white">+</text></svg>
</div>
</td>
<td width="100%">
<div id="path" class="info" >&nbsp;</div>
</td>
</tr>
</table>
<table class="table table-striped" style="border:1px;solid #dddddd;margin-bottom:20px;" >
<thead>
<tr>
<th width='0%'>Type</th>
<th>Name</th>
<th>Size</th>
<th id="FS_time">Time</th>
<th width='0%'></th>
<th width='100%'></th>
</tr>
</thead>
<tbody id="file_list"></tbody>
</table>
</div>
<div class="panel-footer " id="status"></div>
</div>
</div>
</div>
<div class="panel hide_it" id="FWUPDATE">
<div class="panel-heading">Firmware Update</div>
<div class="panel-body">
<table>
<tr>
<td><input type="file" id="fw-select" name="myfiles[]" /></td>
<td><input class="btn btn-primary" type="button" id="ubut" onclick="Uploadfile();" value="Update"/></td>
<td><progress style="visibility:hidden;" name='prgfw' id='prgfw' max='100'></progress></td>
<td><span id='msg' style='visibility:hidden;'>Restarting, please wait....</span><span id='counter'></span></td>
</tr>
</table>
</div>
</div>
<div id="loginpage"class="modal">
<div class="modal-content" >
<div class="modal-header">
<h3>Identification</h3>
</div>
<div class="modal-body">
<span>
<span class="modal-text" translate>User:</span>
<input class='form-control' type="text" id="lut" style="width:auto"/>
</span>
<hr>
<span>
<span class="modal-text" translate>Password:</span>
<input class='form-control' type="password" id="lpt" style="width:auto"/>
</span>
<br>
</div>
<div class="modal-footer">
<input type="button" class="btn btn-primary" onclick="SLR()" value="Submit"/>
</div>
</div>
</div>
<!-- smoosh -->
<script src="js/script.js"></script>
<!-- endsmoosh -->
</body>
</html>

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.a92" #define FW_VERSION "3.0.0.a93"
#define REPOSITORY "https://github.com/luc-github/ESP3D/tree/3.0" #define REPOSITORY "https://github.com/luc-github/ESP3D/tree/3.0"
#endif //_VERSION_ESP3D_H #endif //_VERSION_ESP3D_H

View File

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