This commit is contained in:
Stephan Mühl
2023-03-22 12:15:18 +01:00
committed by GitHub
parent 3e12414a87
commit adb5102869
203 changed files with 35010 additions and 0 deletions

View File

@@ -0,0 +1,528 @@
// WARNING: Auto-generated file. Please do not modify by hand.
// This file is an embeddable version of the gzipped index.htm file.
// To update it, please rerun the `reduce_index.sh` script located in the `extras` subfolder
// then recompile the sketch after each change to the `index.html` file.
const char edit_htm_gz[] = {
0x1f, 0x8b, 0x08, 0x08, 0x0a, 0x67, 0x14, 0x64, 0x00, 0x03, 0x65, 0x64,
0x69, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xec, 0x3b, 0x09, 0x73, 0x9b,
0x48, 0x97, 0x7f, 0x05, 0x93, 0x1d, 0x1b, 0x56, 0x08, 0x49, 0xbe, 0x23,
0x19, 0x7b, 0x7c, 0xc8, 0xb7, 0x7c, 0x9f, 0xc9, 0x66, 0xab, 0x5a, 0xd0,
0x12, 0x6d, 0x23, 0x20, 0xd0, 0x58, 0x92, 0x1d, 0xef, 0x6f, 0xdf, 0xf7,
0x1a, 0x90, 0x40, 0x42, 0x4e, 0x66, 0x77, 0x66, 0x67, 0xea, 0xab, 0x4d,
0xaa, 0x22, 0x68, 0xba, 0xdf, 0xd5, 0xef, 0xee, 0xce, 0xc6, 0xdc, 0xde,
0xf9, 0xee, 0xcd, 0xe3, 0x45, 0x53, 0xb2, 0x79, 0xcf, 0x91, 0x2e, 0x6e,
0x77, 0x4e, 0x8f, 0x76, 0x25, 0xb9, 0x5c, 0xa9, 0xdc, 0x2f, 0xed, 0x56,
0x2a, 0x7b, 0x37, 0x7b, 0xd2, 0xc3, 0xe1, 0x4d, 0xeb, 0x54, 0xaa, 0xe9,
0x55, 0xe9, 0x26, 0x20, 0x6e, 0xc8, 0x38, 0xf3, 0x5c, 0xe2, 0x54, 0x2a,
0xcd, 0x33, 0x59, 0x92, 0x6d, 0xce, 0xfd, 0x7a, 0xa5, 0xd2, 0xef, 0xf7,
0xf5, 0xfe, 0x92, 0xee, 0x05, 0xdd, 0xca, 0xcd, 0x55, 0x65, 0x80, 0xb0,
0x6a, 0xb8, 0x38, 0x79, 0x2c, 0xf3, 0xcc, 0x4a, 0xdd, 0xe2, 0x96, 0xbc,
0xb9, 0x21, 0xf0, 0x39, 0xc4, 0xed, 0x1a, 0xd4, 0xdd, 0xdc, 0xe0, 0x8c,
0x3b, 0x74, 0x73, 0x9f, 0x39, 0x54, 0xea, 0x11, 0x97, 0x74, 0x69, 0xb0,
0x51, 0x89, 0xc7, 0x36, 0x42, 0x3e, 0xc4, 0x51, 0x6a, 0x31, 0x62, 0x84,
0x66, 0x40, 0x61, 0x7a, 0xdb, 0xb3, 0x86, 0x6f, 0x1d, 0xcf, 0xe5, 0xe5,
0x90, 0xbd, 0xd2, 0x7a, 0x6d, 0xd1, 0x1f, 0x34, 0xc4, 0x6b, 0x87, 0xf4,
0x98, 0x33, 0xac, 0xdf, 0xd1, 0xc0, 0x02, 0x28, 0xda, 0x76, 0xc0, 0x88,
0xa3, 0x5d, 0x03, 0xee, 0x72, 0x48, 0x03, 0xd6, 0x79, 0xd7, 0x4d, 0x98,
0x45, 0x07, 0xbc, 0x45, 0xdd, 0xe8, 0xed, 0xb5, 0xcc, 0x5c, 0x8b, 0x0e,
0xea, 0x4b, 0xd5, 0x6a, 0xc3, 0xf7, 0x62, 0xf2, 0xea, 0xa4, 0x1d, 0x7a,
0x4e, 0xc4, 0x69, 0xc3, 0xa1, 0x1d, 0x5e, 0x5f, 0x01, 0xc0, 0x6d, 0x2f,
0xb0, 0x68, 0x50, 0xaf, 0xf9, 0x03, 0x09, 0x3e, 0x31, 0x4b, 0xfa, 0xb4,
0xbc, 0xbc, 0xdc, 0x68, 0x13, 0xf3, 0xb9, 0x1b, 0x78, 0x91, 0x6b, 0x95,
0x4d, 0xcf, 0xf1, 0x82, 0xfa, 0xa7, 0xce, 0x0a, 0xfe, 0x6d, 0x58, 0x2c,
0xf4, 0x1d, 0x32, 0xac, 0xbb, 0x9e, 0x4b, 0x61, 0xed, 0xa0, 0x1c, 0xda,
0xc4, 0xf2, 0xfa, 0xf5, 0xaa, 0x54, 0x95, 0x6a, 0x55, 0x00, 0x12, 0x74,
0xdb, 0x44, 0xa9, 0x6a, 0xf8, 0x57, 0x5f, 0x56, 0x1b, 0x19, 0x36, 0x6a,
0x29, 0x1b, 0x7d, 0xca, 0xba, 0x36, 0xaf, 0xaf, 0x55, 0xab, 0x39, 0x8a,
0xa5, 0xc8, 0x79, 0x73, 0x58, 0x08, 0xd3, 0x51, 0x24, 0x31, 0x06, 0xee,
0xf9, 0xf5, 0x6a, 0x4c, 0x6c, 0xb5, 0xd1, 0x23, 0x41, 0x97, 0xb9, 0xf0,
0xe0, 0x13, 0xcb, 0x62, 0x6e, 0xb7, 0x3e, 0xb1, 0xde, 0x61, 0x6f, 0x23,
0x46, 0x03, 0xea, 0x10, 0xce, 0x5e, 0x68, 0xa3, 0xc7, 0xdc, 0x72, 0x9f,
0x59, 0xdc, 0xae, 0xaf, 0x02, 0x79, 0x0d, 0x33, 0x0a, 0x42, 0x60, 0xc7,
0xf7, 0x18, 0xac, 0x0b, 0xf2, 0xeb, 0x43, 0x9f, 0xb8, 0x6f, 0x09, 0xbb,
0x28, 0x84, 0x94, 0x57, 0xe6, 0x3a, 0xcc, 0xa5, 0xe5, 0xb6, 0xe3, 0x99,
0xcf, 0x23, 0xdc, 0xab, 0xfe, 0x60, 0x12, 0x7b, 0xdd, 0xf6, 0x5e, 0x68,
0xf0, 0x36, 0x96, 0x9d, 0x00, 0x53, 0x3c, 0x2b, 0x87, 0x8c, 0x52, 0x0a,
0xb3, 0xc2, 0x10, 0x14, 0x89, 0xd2, 0x17, 0x46, 0xfb, 0x30, 0x4d, 0xcb,
0x0f, 0x80, 0x6c, 0x46, 0x5c, 0x8f, 0x05, 0x31, 0x21, 0xae, 0x09, 0x20,
0xcc, 0xf5, 0x23, 0xfe, 0x36, 0xbd, 0xf7, 0x9e, 0x4f, 0x4c, 0xc6, 0x87,
0x42, 0x7c, 0x99, 0xf9, 0x6f, 0x13, 0x7b, 0x55, 0xee, 0x79, 0xaf, 0xe5,
0x08, 0x34, 0x0b, 0xb4, 0xcb, 0xa1, 0x26, 0x8f, 0x77, 0x04, 0x76, 0xaf,
0xfd, 0xcc, 0xf8, 0xf4, 0x87, 0xc9, 0x81, 0x09, 0x62, 0xb2, 0xfc, 0x56,
0xab, 0x9d, 0xe9, 0x8d, 0x98, 0x9c, 0x9c, 0x48, 0x13, 0x25, 0x57, 0xb6,
0xa8, 0xe9, 0x05, 0x44, 0x70, 0x01, 0x62, 0xa5, 0x01, 0xee, 0x47, 0x11,
0xb3, 0x25, 0x87, 0xb4, 0xa9, 0x53, 0x02, 0x61, 0xa5, 0x22, 0x92, 0xf0,
0xef, 0xe2, 0xa2, 0xd8, 0xac, 0xa9, 0xe9, 0xff, 0x05, 0x13, 0xb3, 0x0a,
0x3d, 0xb9, 0x09, 0x08, 0x4c, 0x2b, 0x18, 0xab, 0xd7, 0xdb, 0xb4, 0xe3,
0x05, 0xf4, 0xed, 0x43, 0x26, 0x04, 0x8a, 0x3a, 0xc0, 0x27, 0x6d, 0x87,
0x5a, 0x31, 0x69, 0xe9, 0x0a, 0x8b, 0x76, 0x48, 0xe4, 0xf0, 0xd1, 0x56,
0xe8, 0xab, 0x85, 0x8b, 0x4d, 0x9b, 0x9a, 0xcf, 0xd4, 0x02, 0xe2, 0xb8,
0x32, 0x82, 0xa4, 0x66, 0xc9, 0x16, 0x4a, 0xf9, 0x47, 0xe9, 0xd6, 0x0a,
0xb6, 0x26, 0xa3, 0xb5, 0x51, 0xe0, 0x28, 0x16, 0xe1, 0xa4, 0xce, 0x7a,
0xe0, 0xaa, 0x2a, 0xbe, 0xdb, 0x05, 0x7f, 0x10, 0xd2, 0xd5, 0x65, 0x8d,
0xdd, 0xed, 0x9c, 0x5f, 0xf5, 0xab, 0x27, 0x07, 0x5d, 0x6f, 0x1b, 0xfe,
0x9c, 0x5d, 0xdf, 0xda, 0xcd, 0xdb, 0x2e, 0x3c, 0xed, 0xe0, 0xeb, 0x6e,
0x77, 0x77, 0xbb, 0x85, 0x0f, 0xc3, 0x95, 0x41, 0xbf, 0x87, 0x0f, 0xed,
0xda, 0x4e, 0xeb, 0xae, 0x79, 0x77, 0x68, 0x36, 0x87, 0xf7, 0xbd, 0x95,
0x95, 0xfb, 0xfb, 0xc5, 0xe6, 0xea, 0xe5, 0xad, 0xb5, 0x7d, 0xd9, 0xdc,
0x61, 0xe4, 0xa0, 0xf6, 0x44, 0x0e, 0xd6, 0x2a, 0x95, 0xca, 0xfa, 0xcb,
0xd9, 0xd3, 0xd2, 0xc9, 0x6b, 0x6b, 0x6d, 0x77, 0xd0, 0x6a, 0xf7, 0x56,
0xa2, 0x4e, 0xeb, 0xd5, 0xac, 0x3c, 0x2e, 0x5a, 0xdf, 0x07, 0xfc, 0x94,
0x1c, 0x30, 0x6f, 0x65, 0xbd, 0xfb, 0x78, 0x7f, 0xfc, 0xf4, 0x65, 0xff,
0xea, 0x6e, 0xff, 0xcb, 0xf1, 0x4d, 0xb3, 0x72, 0xfa, 0x6a, 0x96, 0x5e,
0xc2, 0xf6, 0x99, 0xf5, 0x70, 0xb7, 0xb6, 0x5c, 0xba, 0xb0, 0x5f, 0xac,
0x43, 0x27, 0x6c, 0xdf, 0x2f, 0x3e, 0xfb, 0xab, 0xdf, 0xd7, 0x5e, 0x4e,
0x5f, 0x87, 0xeb, 0x2f, 0xad, 0xe8, 0xec, 0xe6, 0xb5, 0xb3, 0xf4, 0xb9,
0x64, 0x7b, 0xab, 0xb7, 0xc3, 0xf3, 0xdb, 0xdd, 0x7d, 0xfb, 0xf1, 0xfe,
0xd6, 0x59, 0x71, 0x5f, 0xd6, 0x4a, 0x15, 0x7f, 0x95, 0x3e, 0x5f, 0xb2,
0xca, 0xc1, 0x15, 0xd2, 0xb8, 0xfd, 0x70, 0x75, 0x7d, 0xe3, 0xb4, 0xb6,
0x2f, 0xcf, 0xdb, 0x8f, 0x5f, 0x90, 0x97, 0xeb, 0xab, 0xe3, 0xab, 0xe6,
0xfe, 0xed, 0x75, 0xab, 0xc3, 0x9f, 0x3f, 0xf3, 0x61, 0x9f, 0x6d, 0x5f,
0xda, 0xde, 0xed, 0xb6, 0x7d, 0xb7, 0xdd, 0x3f, 0xf6, 0xbf, 0xef, 0x5d,
0x7d, 0xef, 0x90, 0x97, 0x97, 0xf5, 0x57, 0x27, 0x3a, 0x3b, 0x79, 0x8e,
0x82, 0xe6, 0x53, 0xf0, 0xb8, 0x54, 0xa2, 0x6b, 0xcb, 0xc7, 0xec, 0xf5,
0xd4, 0x5d, 0xbc, 0xaf, 0xf5, 0xd8, 0xf6, 0xc9, 0xc0, 0xb7, 0xcf, 0x77,
0x5a, 0xf4, 0xf6, 0xf1, 0xfb, 0x6a, 0x74, 0x58, 0xd9, 0x5e, 0xda, 0x5e,
0x5d, 0x7d, 0xf4, 0xaf, 0x76, 0xae, 0xbe, 0x1f, 0x7f, 0x21, 0xad, 0xa3,
0x75, 0xd6, 0x0f, 0xef, 0x2a, 0xbb, 0x56, 0x6b, 0x75, 0x7b, 0x71, 0xf0,
0xb4, 0xe2, 0x1e, 0xdd, 0x86, 0x27, 0xd5, 0x0a, 0xbb, 0xb9, 0xbd, 0x08,
0x0e, 0xce, 0x7a, 0xd5, 0xd6, 0xed, 0xde, 0xd1, 0x33, 0x3d, 0xa8, 0x1c,
0xaf, 0x2c, 0x47, 0xe7, 0xec, 0x39, 0x6c, 0x7f, 0xb6, 0x1f, 0xec, 0x95,
0x95, 0x0b, 0xfb, 0xe8, 0xe8, 0xa9, 0x73, 0xd2, 0xb5, 0x8e, 0x6f, 0x0e,
0xaf, 0x9b, 0xc3, 0xc5, 0xca, 0xfe, 0x5e, 0x75, 0xf5, 0xa1, 0xe7, 0x59,
0xeb, 0x67, 0xe7, 0xfd, 0x20, 0xe8, 0xef, 0xdf, 0x86, 0x97, 0xbd, 0x87,
0x2f, 0x87, 0x5f, 0x6c, 0x9b, 0x3e, 0x1f, 0xee, 0xb0, 0x9d, 0xe1, 0xe3,
0x91, 0x47, 0x8e, 0x8e, 0xb7, 0x9f, 0x2e, 0xd6, 0x6f, 0xaf, 0xef, 0xd9,
0xee, 0xf6, 0xfa, 0x89, 0xdd, 0xbc, 0x5f, 0xbf, 0x3d, 0xb8, 0x59, 0x3b,
0xb9, 0x20, 0x5f, 0x9a, 0x83, 0xf0, 0xbc, 0x7d, 0x38, 0x0c, 0x6e, 0xbb,
0x37, 0xcf, 0x4f, 0x37, 0xaf, 0xeb, 0x0e, 0xbb, 0x78, 0xe8, 0xbf, 0xf6,
0x9b, 0x3b, 0xa5, 0xf3, 0x8b, 0xfd, 0xbb, 0xc1, 0x61, 0x73, 0xfd, 0x61,
0xd1, 0x7c, 0xbe, 0xda, 0x19, 0x9e, 0x92, 0xbb, 0xa1, 0x7d, 0x77, 0x32,
0xb8, 0x58, 0x5c, 0x3b, 0x39, 0x2b, 0xb9, 0xdb, 0xfc, 0x70, 0xed, 0xea,
0x25, 0x0a, 0x16, 0xf7, 0x82, 0xd5, 0xc5, 0x1a, 0xa7, 0xcf, 0x2d, 0x1a,
0x96, 0xee, 0xd9, 0xc1, 0xfa, 0xea, 0x61, 0xb0, 0xfa, 0x74, 0xf2, 0xf8,
0x54, 0x5a, 0xbb, 0xac, 0x9d, 0x58, 0xd5, 0x0b, 0x7f, 0x70, 0xb4, 0xb2,
0x7e, 0x16, 0x5e, 0x5a, 0x67, 0x95, 0xc5, 0x95, 0x57, 0xe7, 0x72, 0xef,
0xd2, 0x3a, 0x69, 0x7f, 0xde, 0x76, 0x5b, 0xab, 0x9d, 0xc3, 0xeb, 0x83,
0xe7, 0x8b, 0xf0, 0x92, 0x1c, 0x93, 0xde, 0x91, 0x7f, 0xf9, 0xba, 0x1b,
0x0c, 0xfb, 0xf6, 0x5e, 0x8d, 0xdd, 0x2c, 0x3e, 0x3c, 0x87, 0xa7, 0xbb,
0xfd, 0xb0, 0x72, 0xf4, 0xe5, 0x65, 0xfd, 0x8b, 0xd7, 0x59, 0xe3, 0x8b,
0x2b, 0x8f, 0xce, 0xb3, 0xd8, 0xa6, 0xeb, 0xdb, 0xbb, 0xf3, 0xab, 0x93,
0x95, 0xdd, 0xc7, 0xa3, 0x23, 0x43, 0x95, 0x5c, 0xaf, 0x1c, 0x50, 0x9f,
0x12, 0xfe, 0x27, 0xe8, 0x7e, 0xc1, 0xd0, 0xc8, 0xc2, 0x0b, 0x63, 0x80,
0x1d, 0x07, 0xb0, 0x1a, 0xc4, 0x80, 0x86, 0x18, 0xce, 0x0e, 0x80, 0xd3,
0xe2, 0xcc, 0x24, 0x4e, 0x99, 0x38, 0xac, 0xeb, 0xd6, 0x7b, 0xcc, 0xb2,
0x9c, 0x42, 0xcf, 0x92, 0x31, 0xb9, 0xf2, 0xc8, 0x49, 0xd7, 0xd6, 0x21,
0x86, 0x56, 0x8b, 0x7c, 0xe7, 0xcc, 0xd9, 0xe5, 0xe5, 0xf5, 0x29, 0xf7,
0x86, 0x2b, 0x74, 0x3e, 0xe0, 0x1f, 0xac, 0x5a, 0x5d, 0x2e, 0x5e, 0xc5,
0x7a, 0xdd, 0x0f, 0x56, 0xad, 0x57, 0xa7, 0x56, 0x4d, 0xb8, 0x44, 0x0c,
0x76, 0x2e, 0xaf, 0xcb, 0x72, 0x23, 0x0e, 0xbb, 0x42, 0x28, 0x23, 0x77,
0x8c, 0xae, 0x18, 0x7d, 0x72, 0xb1, 0x98, 0x1a, 0x45, 0x88, 0xab, 0x52,
0x79, 0x69, 0xda, 0x81, 0xe7, 0x76, 0xe9, 0x17, 0x91, 0x7e, 0xe4, 0x63,
0x4b, 0x79, 0x36, 0x66, 0x10, 0x82, 0x70, 0xdf, 0x7f, 0x17, 0xd9, 0x9a,
0x14, 0x67, 0x6b, 0x12, 0x71, 0x2d, 0x49, 0x49, 0xa3, 0x22, 0x66, 0x1b,
0x16, 0x40, 0x37, 0x69, 0xd9, 0x67, 0x03, 0xea, 0x94, 0x45, 0xd4, 0xaa,
0x57, 0xd5, 0xb7, 0x7c, 0xa8, 0x4d, 0xe7, 0x13, 0x17, 0x7c, 0xac, 0x00,
0x9e, 0x0e, 0x58, 0x4f, 0xc4, 0x04, 0x56, 0xca, 0x10, 0x48, 0x7b, 0xf8,
0x1b, 0x47, 0x54, 0x2f, 0x28, 0xb7, 0xa3, 0x6e, 0x87, 0x0d, 0x80, 0xe8,
0x0e, 0x73, 0x19, 0xa7, 0x52, 0x2d, 0x7c, 0xff, 0x3d, 0x05, 0xf3, 0x4c,
0x87, 0x9d, 0x80, 0xf4, 0x68, 0x28, 0xfd, 0x22, 0x98, 0xb7, 0x4e, 0xe0,
0xf5, 0xc6, 0x19, 0xc5, 0x3b, 0xf7, 0x32, 0x2f, 0xef, 0xef, 0x9f, 0x6c,
0x4a, 0x20, 0xcc, 0x16, 0xe4, 0x0e, 0x71, 0x42, 0x16, 0x08, 0x75, 0x1f,
0x25, 0x66, 0x89, 0xfa, 0x2f, 0x82, 0x46, 0x8d, 0xf2, 0x23, 0x4c, 0x28,
0x6b, 0x42, 0xec, 0x98, 0x16, 0x16, 0x24, 0x94, 0x98, 0x61, 0x65, 0xf2,
0x9f, 0x4f, 0x28, 0x9b, 0x19, 0x08, 0x17, 0xe3, 0x44, 0x95, 0x73, 0xaf,
0x37, 0x46, 0x1a, 0x6f, 0xf4, 0x62, 0xf5, 0xb7, 0x11, 0x4a, 0x34, 0x83,
0x4f, 0xb0, 0x35, 0xc0, 0xa6, 0xf6, 0xc9, 0x0f, 0x62, 0x49, 0x7f, 0x00,
0x31, 0xe5, 0x22, 0x0f, 0x19, 0x20, 0xbe, 0x8f, 0x56, 0x4f, 0x93, 0x0d,
0xb4, 0x8e, 0x10, 0xae, 0x20, 0xc2, 0x64, 0xaa, 0x84, 0x76, 0x93, 0xd2,
0x84, 0x1c, 0xa7, 0x42, 0x11, 0x2f, 0x22, 0x92, 0x82, 0xc7, 0xc2, 0xe4,
0x05, 0x57, 0x0a, 0xe5, 0x20, 0x9c, 0x5a, 0xef, 0x9f, 0x42, 0x4e, 0x78,
0x14, 0xce, 0xa0, 0x73, 0x69, 0x44, 0xa6, 0x90, 0x62, 0x26, 0x43, 0x13,
0xb8, 0x3b, 0x61, 0x8b, 0x42, 0xe2, 0x91, 0xe0, 0xad, 0x09, 0x54, 0x09,
0x71, 0xe5, 0x84, 0x2b, 0xb4, 0x9c, 0x4f, 0x7d, 0x12, 0xb8, 0x30, 0xf6,
0x96, 0xfa, 0xa9, 0x2a, 0x48, 0x6d, 0x8a, 0x35, 0xc8, 0xb0, 0xdc, 0x2e,
0x6d, 0x8c, 0x72, 0x34, 0x30, 0x17, 0xee, 0x79, 0x0e, 0x67, 0x7e, 0x01,
0x71, 0x69, 0x75, 0xb1, 0x38, 0x92, 0xa2, 0x10, 0x2b, 0x12, 0xf0, 0xc2,
0x42, 0xd6, 0x66, 0x0e, 0xa6, 0x35, 0x36, 0x58, 0x35, 0x75, 0x8b, 0xaa,
0x89, 0x4e, 0x27, 0x83, 0xa8, 0x21, 0x92, 0xbc, 0xd8, 0x11, 0xa0, 0xd6,
0xd2, 0xa0, 0xa0, 0x2c, 0xc1, 0x79, 0xa9, 0xe0, 0x97, 0xf2, 0xb2, 0xa8,
0x66, 0x78, 0x4c, 0xd2, 0xeb, 0x11, 0xe9, 0x19, 0x6a, 0xc4, 0x23, 0xf8,
0xe2, 0x4f, 0x8e, 0x47, 0x10, 0xcc, 0x0c, 0x99, 0x97, 0x41, 0x3c, 0x2f,
0x76, 0x5e, 0xcd, 0x70, 0xa8, 0xdf, 0x18, 0x8b, 0x0f, 0xbe, 0xa7, 0x12,
0x80, 0xb7, 0x69, 0x06, 0xb3, 0x55, 0xd0, 0x8a, 0x3a, 0xce, 0xb8, 0x1b,
0xe3, 0x52, 0xb1, 0x9e, 0x0c, 0x4a, 0xfa, 0x4a, 0x28, 0x51, 0xc8, 0xaf,
0x00, 0x5e, 0xd9, 0x8b, 0xf8, 0x88, 0x3c, 0x3d, 0xb4, 0xbd, 0xbe, 0xfb,
0x16, 0x5b, 0x5c, 0x0a, 0xa1, 0x36, 0xfa, 0x5c, 0xee, 0x85, 0xdd, 0xe2,
0xf0, 0x34, 0xcb, 0x6a, 0xe3, 0x9a, 0x0f, 0xb6, 0x5e, 0x10, 0x01, 0x6e,
0xae, 0x57, 0x17, 0x4f, 0xa8, 0x88, 0x0f, 0x4a, 0x19, 0xbe, 0xa8, 0x8d,
0xcc, 0xfe, 0x8c, 0x05, 0x2c, 0xdc, 0xef, 0xef, 0x63, 0x27, 0x13, 0xfa,
0xcc, 0x75, 0x21, 0xdb, 0x47, 0xef, 0xf5, 0x56, 0xfd, 0xed, 0x6d, 0x0c,
0x2f, 0xf0, 0x40, 0x9b, 0xa9, 0x52, 0x55, 0xdf, 0x51, 0xc7, 0xa6, 0x3f,
0x2c, 0xad, 0x56, 0x2d, 0xda, 0x55, 0xdf, 0xdf, 0xf5, 0x2c, 0x8c, 0x38,
0xbf, 0x0d, 0xe8, 0xf7, 0x88, 0x05, 0x90, 0xdf, 0xfe, 0x84, 0xab, 0x51,
0x69, 0x87, 0x5c, 0x21, 0x3b, 0x1f, 0xf1, 0x25, 0xd8, 0xd2, 0x62, 0xde,
0xc6, 0xce, 0x36, 0x8b, 0x1c, 0x1c, 0xe9, 0xd8, 0xa9, 0x22, 0x3e, 0x32,
0xd6, 0xbe, 0xd5, 0xb1, 0xfa, 0xa1, 0xdd, 0xc7, 0xc3, 0x65, 0xa1, 0xf1,
0xc9, 0x46, 0x0b, 0x44, 0x3e, 0x01, 0xcb, 0xe6, 0xa3, 0xcf, 0xb0, 0x3d,
0x51, 0x28, 0x84, 0x16, 0x57, 0xc8, 0xec, 0x15, 0xf5, 0x32, 0xf9, 0x0a,
0x23, 0x0d, 0xd4, 0xd0, 0x8e, 0x03, 0x55, 0x73, 0x62, 0x1f, 0x42, 0xfd,
0x51, 0x9b, 0x20, 0x84, 0x95, 0x3f, 0xc3, 0x1f, 0x58, 0x99, 0xd4, 0xac,
0xcb, 0x63, 0x4f, 0x22, 0x02, 0xf6, 0x46, 0x45, 0x94, 0x7b, 0x9b, 0x1b,
0x10, 0x7d, 0x98, 0xcf, 0x37, 0x5f, 0x48, 0x20, 0xa1, 0xe7, 0xd4, 0x3a,
0xe1, 0x91, 0xdb, 0xf1, 0x1a, 0x9d, 0xc8, 0x35, 0x91, 0x45, 0x29, 0xa4,
0xfc, 0x34, 0x56, 0x14, 0x85, 0x6a, 0x5c, 0x7d, 0xe3, 0xf3, 0xf3, 0x10,
0x25, 0x81, 0x19, 0xaa, 0x3b, 0x5e, 0x57, 0xe1, 0xaa, 0x66, 0x79, 0x66,
0x84, 0xb1, 0x41, 0xef, 0x52, 0xde, 0x8c, 0xc3, 0xc4, 0xce, 0xf0, 0xc8,
0x52, 0xe4, 0x8c, 0x82, 0xc9, 0xaa, 0x2e, 0x24, 0x85, 0x4d, 0x12, 0x83,
0xff, 0xf8, 0x21, 0xcb, 0x1a, 0xdd, 0xfa, 0xd9, 0x42, 0x58, 0x64, 0x3a,
0x24, 0x0c, 0x4f, 0xa1, 0x3a, 0xd5, 0xc1, 0x62, 0x15, 0x59, 0x68, 0xb2,
0xac, 0xd6, 0xff, 0xd0, 0xca, 0x80, 0xf6, 0x40, 0x50, 0xa3, 0xc5, 0x63,
0x7a, 0xb1, 0x3f, 0xa2, 0x0b, 0x31, 0xe8, 0x71, 0x39, 0x65, 0xd0, 0x2d,
0xb9, 0x4f, 0x18, 0x97, 0xeb, 0x72, 0x52, 0x58, 0xc9, 0xef, 0x23, 0x41,
0x04, 0x10, 0xca, 0xb0, 0x6e, 0xba, 0x06, 0x4d, 0x56, 0xa8, 0xfa, 0xc6,
0x3a, 0x0a, 0xdd, 0xa8, 0x55, 0x17, 0x97, 0xd5, 0x80, 0xf2, 0x28, 0x70,
0x25, 0x5a, 0x92, 0xa5, 0x1d, 0x19, 0xd4, 0x3d, 0x50, 0x84, 0x34, 0x8d,
0x72, 0xad, 0xc1, 0x4b, 0x25, 0x0d, 0xe7, 0x6c, 0x28, 0xb4, 0x62, 0x88,
0xc9, 0x0d, 0xb5, 0x91, 0xce, 0x07, 0xdf, 0xb2, 0x0f, 0xfe, 0xdb, 0x52,
0x16, 0xd5, 0xd2, 0x57, 0x59, 0x3a, 0x61, 0x3b, 0xb2, 0x26, 0x4b, 0xad,
0xf8, 0xe7, 0x20, 0xfe, 0xb9, 0x11, 0x3f, 0x17, 0xf0, 0xef, 0xb7, 0xaf,
0xfc, 0x5b, 0x96, 0x9a, 0x4e, 0x40, 0x43, 0xfb, 0x5a, 0x38, 0x7d, 0x05,
0x54, 0x7d, 0x96, 0x44, 0xe2, 0xb0, 0x90, 0x93, 0xbf, 0xac, 0x24, 0xab,
0xd1, 0x39, 0xe8, 0xba, 0x2a, 0x37, 0x90, 0x5e, 0xd7, 0x70, 0x21, 0xfa,
0x3c, 0xb4, 0x4e, 0x0f, 0x39, 0xf7, 0xaf, 0xc0, 0x86, 0x68, 0xc8, 0x1b,
0xae, 0xee, 0xb9, 0x28, 0x53, 0x23, 0x45, 0x0c, 0xa8, 0x70, 0x32, 0xa8,
0x42, 0x03, 0x22, 0xd2, 0x9c, 0xe1, 0xea, 0x31, 0x82, 0x2d, 0x94, 0x2e,
0xae, 0x6c, 0x06, 0x01, 0x08, 0xc0, 0x55, 0xeb, 0x0a, 0x35, 0x94, 0x58,
0x99, 0x8c, 0xe3, 0xeb, 0xf3, 0x33, 0x1d, 0x94, 0x3b, 0xa4, 0x8a, 0x0b,
0xdb, 0x11, 0xfa, 0xa0, 0x40, 0xf4, 0x06, 0x94, 0x55, 0x55, 0x75, 0x3e,
0xf4, 0x51, 0x70, 0x65, 0x49, 0x4e, 0x54, 0x4f, 0x67, 0xe1, 0xf9, 0xf3,
0x96, 0x42, 0x4b, 0x86, 0xbc, 0xd1, 0xc3, 0xa8, 0x24, 0x31, 0xcb, 0x58,
0x48, 0x22, 0xd4, 0x82, 0x04, 0x99, 0x91, 0xb1, 0x50, 0x5d, 0x90, 0x3c,
0x9f, 0xb3, 0x5e, 0xd4, 0xc3, 0x67, 0xb0, 0x00, 0x63, 0xe1, 0x33, 0x8c,
0xd9, 0xa0, 0xdf, 0xf0, 0xb4, 0x02, 0xb3, 0xc8, 0xc0, 0x58, 0x00, 0xd7,
0xb1, 0x20, 0xbd, 0x10, 0x27, 0xa2, 0xc6, 0x82, 0x5c, 0x52, 0x6a, 0xa5,
0x16, 0xe1, 0xb6, 0x2e, 0xdc, 0xab, 0xf2, 0xf9, 0xf3, 0xbf, 0x27, 0xe8,
0xa2, 0x90, 0x5a, 0x3b, 0x43, 0x4e, 0xc3, 0x4a, 0x32, 0xc0, 0xc1, 0xc5,
0x38, 0x62, 0x44, 0x55, 0x4b, 0xf2, 0x82, 0x24, 0x1a, 0x6c, 0x02, 0x02,
0x37, 0x72, 0x4a, 0x30, 0x35, 0xbf, 0x3c, 0x09, 0x12, 0xd6, 0x4b, 0x20,
0x69, 0x2a, 0x79, 0x1d, 0x49, 0x2e, 0x7d, 0xbc, 0x58, 0x20, 0xdb, 0x94,
0x4b, 0xbc, 0x24, 0x6f, 0x54, 0x04, 0xe3, 0x9b, 0x23, 0x91, 0x44, 0x6e,
0x18, 0xf9, 0xbe, 0x17, 0x40, 0xa0, 0xc7, 0xe6, 0x5f, 0x38, 0x3f, 0x2f,
0xe4, 0x23, 0x6d, 0x60, 0xf6, 0x2a, 0xe4, 0x93, 0x44, 0xad, 0x85, 0xcd,
0xfb, 0xed, 0xab, 0xb3, 0xa3, 0xb3, 0x83, 0xf8, 0x8b, 0x30, 0x02, 0x63,
0x21, 0x89, 0x61, 0x0b, 0xa2, 0x73, 0x18, 0x0e, 0x43, 0x4e, 0x7b, 0xf3,
0x6e, 0x3b, 0xf4, 0x1b, 0x98, 0xef, 0x12, 0xe6, 0x86, 0xf1, 0x5b, 0x06,
0x4b, 0x3c, 0xd0, 0x81, 0xe9, 0x2e, 0x7a, 0xea, 0xfa, 0x46, 0x3b, 0xa8,
0x00, 0x6d, 0x33, 0xc8, 0x41, 0x8a, 0x11, 0xdf, 0x66, 0xf2, 0x23, 0xab,
0x6a, 0x5d, 0xec, 0x9f, 0x20, 0x42, 0x58, 0x98, 0xb1, 0x30, 0x1d, 0xdb,
0xa8, 0x95, 0x84, 0x89, 0xbe, 0x0d, 0x3e, 0x33, 0xd7, 0xd3, 0x6b, 0x7b,
0x8e, 0xb5, 0xb0, 0x79, 0x74, 0x76, 0x74, 0x23, 0x35, 0xaf, 0xae, 0xce,
0xaf, 0xa4, 0xb9, 0x14, 0xf4, 0x6c, 0x77, 0x53, 0xa0, 0xe9, 0x54, 0x93,
0xaf, 0x2f, 0x8e, 0xf6, 0xf7, 0xaf, 0xe5, 0x39, 0x23, 0x15, 0x38, 0xe8,
0x1b, 0x88, 0x6f, 0x26, 0x94, 0xde, 0xb3, 0xc5, 0x02, 0x00, 0x12, 0xfb,
0x85, 0x24, 0x82, 0x18, 0x72, 0x1c, 0x42, 0x80, 0xb1, 0x77, 0x0d, 0x6c,
0xc2, 0xa7, 0xae, 0x22, 0x1f, 0x34, 0x6f, 0xc0, 0x34, 0x2b, 0x09, 0x5a,
0x6d, 0xae, 0xaa, 0xc2, 0xa7, 0x10, 0x52, 0x33, 0xc5, 0x8d, 0x1c, 0x47,
0x1d, 0xdb, 0x6a, 0xde, 0x34, 0xc0, 0x75, 0x10, 0x07, 0x8a, 0x16, 0x45,
0x16, 0x9c, 0xd5, 0xa5, 0xaf, 0x72, 0x89, 0x26, 0x56, 0x54, 0x92, 0xbf,
0x49, 0xf8, 0x96, 0xb3, 0x91, 0x31, 0x20, 0x93, 0xb8, 0xe8, 0x8b, 0xcf,
0x68, 0x7f, 0x37, 0x2e, 0x54, 0xd0, 0xf2, 0x63, 0x6f, 0x32, 0x37, 0x37,
0x5b, 0x2e, 0xe4, 0x85, 0xee, 0x70, 0xf0, 0x7c, 0x7a, 0xda, 0xf9, 0xf9,
0xf1, 0x63, 0x6e, 0x0e, 0xb6, 0xbe, 0xc3, 0x82, 0x9e, 0x22, 0xef, 0xda,
0x98, 0xae, 0x85, 0x12, 0xf7, 0xa4, 0xa1, 0x17, 0x05, 0x52, 0x0a, 0x47,
0xea, 0x33, 0xc7, 0x91, 0xda, 0x10, 0xcb, 0xbc, 0x90, 0x4b, 0xac, 0x83,
0x5f, 0x25, 0x54, 0x18, 0xe6, 0x46, 0x20, 0x08, 0x54, 0x41, 0x57, 0x68,
0x33, 0x80, 0xdf, 0x63, 0xa1, 0x49, 0x02, 0x0b, 0xb0, 0x84, 0xca, 0x5c,
0x4d, 0x45, 0x59, 0x8c, 0xa9, 0x2e, 0x9e, 0x46, 0x3f, 0xf2, 0x59, 0x53,
0x14, 0x1b, 0x73, 0x74, 0xf6, 0xc6, 0x5b, 0x23, 0xb0, 0xf9, 0x15, 0x63,
0x12, 0x60, 0xc5, 0x85, 0x88, 0xad, 0xfb, 0xa0, 0x57, 0x54, 0xec, 0x41,
0x2c, 0x36, 0x74, 0x52, 0xd4, 0x10, 0xe2, 0x0f, 0x78, 0x78, 0xcf, 0xb8,
0xad, 0xc8, 0x15, 0x59, 0xdd, 0xa2, 0x75, 0xf8, 0x29, 0x51, 0x55, 0x87,
0xed, 0xcc, 0x0e, 0xeb, 0xa1, 0x03, 0x35, 0x19, 0x64, 0x64, 0xe5, 0x1a,
0xa8, 0x38, 0x68, 0x49, 0xd4, 0x0e, 0x39, 0x66, 0xe2, 0x30, 0x04, 0x01,
0x91, 0x84, 0xfc, 0x08, 0x93, 0xb9, 0xf3, 0x8e, 0x98, 0x9f, 0xdd, 0x3a,
0x30, 0x7e, 0x4e, 0x0f, 0x45, 0x39, 0x04, 0x81, 0xd4, 0xc5, 0x50, 0x8a,
0x8e, 0xd4, 0x33, 0x66, 0xb1, 0x45, 0x55, 0x8d, 0x8c, 0x3f, 0xc6, 0xeb,
0x93, 0xef, 0x8a, 0x2c, 0x4a, 0x4e, 0x8c, 0x65, 0x86, 0x42, 0x84, 0x4a,
0x1b, 0x32, 0x1a, 0xab, 0xac, 0x11, 0xbd, 0x17, 0xa1, 0xad, 0x83, 0xc5,
0xcd, 0xd5, 0xe0, 0x0d, 0xcd, 0xd7, 0x90, 0xb1, 0x0b, 0x27, 0x6b, 0x9e,
0x4e, 0x7c, 0xd0, 0x5c, 0x6b, 0xd7, 0x66, 0x8e, 0xa5, 0x90, 0x4c, 0x24,
0x2c, 0x86, 0xae, 0x6a, 0x8e, 0xa1, 0x58, 0x3a, 0xb8, 0x17, 0xd9, 0x07,
0xcf, 0x79, 0x24, 0x46, 0x35, 0x2b, 0xc1, 0x87, 0xc9, 0x06, 0xbe, 0xc5,
0x18, 0x70, 0x02, 0xbe, 0x25, 0x71, 0xf3, 0x4e, 0x78, 0x5d, 0x90, 0xc1,
0x04, 0x52, 0x6b, 0x36, 0xd2, 0x76, 0x04, 0x75, 0x86, 0x8b, 0x58, 0x43,
0x43, 0x71, 0xb2, 0xe1, 0xea, 0xd6, 0xc7, 0x10, 0x34, 0x09, 0xca, 0xf9,
0x15, 0x50, 0xcc, 0x50, 0x42, 0xc1, 0x40, 0x6c, 0xd6, 0x5a, 0x38, 0x69,
0xd7, 0xd8, 0xae, 0xc5, 0xe1, 0x0c, 0xba, 0xd6, 0xf3, 0x1e, 0x4e, 0xcd,
0x63, 0x0b, 0x7f, 0x05, 0x9b, 0x69, 0x28, 0x2c, 0x0f, 0x69, 0x5f, 0x6c,
0x4a, 0x1e, 0x14, 0x9b, 0x0d, 0x0a, 0x5d, 0x1c, 0x02, 0x0a, 0x0c, 0xc5,
0x14, 0x64, 0xc7, 0x55, 0xe8, 0x8e, 0xc0, 0x00, 0x3e, 0xc6, 0x2c, 0x26,
0x3f, 0x0f, 0xdf, 0xfc, 0x15, 0x52, 0x7b, 0x86, 0x12, 0x08, 0x0c, 0xa9,
0xad, 0x69, 0x41, 0x96, 0x72, 0xb4, 0x56, 0x1c, 0x8a, 0xd1, 0xc5, 0x0d,
0x90, 0x53, 0x48, 0x8f, 0x0d, 0x79, 0x09, 0x8a, 0x24, 0xfc, 0x32, 0xb6,
0xb3, 0x2a, 0x90, 0x95, 0xc5, 0x1f, 0xfc, 0x02, 0xfe, 0x46, 0x4f, 0x20,
0xcf, 0x58, 0xae, 0xd6, 0xcb, 0xe2, 0x4f, 0x3c, 0x05, 0x8e, 0xce, 0x46,
0xd4, 0x53, 0x35, 0x30, 0xde, 0x9f, 0xe2, 0x12, 0x98, 0x6c, 0xea, 0xf8,
0x02, 0x0d, 0xcd, 0xa2, 0xd9, 0x92, 0x27, 0x40, 0x82, 0xd1, 0x29, 0xe6,
0x4c, 0x90, 0xc9, 0xf6, 0xc4, 0x72, 0x4b, 0xdc, 0xbe, 0x99, 0x4b, 0xac,
0x92, 0xfc, 0x53, 0x2d, 0xd8, 0x13, 0x02, 0xa9, 0x94, 0x29, 0x7c, 0xed,
0x38, 0x99, 0xa2, 0xb1, 0x13, 0xe0, 0x0d, 0xc8, 0xa4, 0x0c, 0xa2, 0xa3,
0x09, 0x87, 0x3a, 0xc4, 0xdc, 0x2e, 0xb7, 0xc1, 0xbf, 0xf2, 0x74, 0xe8,
0x6b, 0xf5, 0x9b, 0x30, 0x33, 0xb0, 0x2f, 0x91, 0xce, 0x4c, 0xba, 0xab,
0x1f, 0x3f, 0x94, 0xe4, 0x0b, 0x9a, 0x5c, 0x29, 0x79, 0x56, 0xd3, 0xe9,
0xc6, 0xa4, 0xfb, 0x4b, 0x27, 0x94, 0x70, 0x36, 0x04, 0x18, 0xcd, 0x41,
0xda, 0xc0, 0xb3, 0x3d, 0xe7, 0x48, 0x2b, 0x22, 0xca, 0xd5, 0xf1, 0x2c,
0x33, 0xb6, 0x48, 0x65, 0x4c, 0x5e, 0x8a, 0x0a, 0x60, 0xb1, 0x42, 0x58,
0x71, 0x46, 0x9c, 0xd2, 0x0f, 0x2e, 0xb3, 0xa7, 0xa8, 0x0d, 0x59, 0x36,
0x0c, 0x83, 0x6f, 0x25, 0xe1, 0x70, 0x5b, 0x4a, 0xf3, 0x0d, 0xa9, 0x17,
0x41, 0xc8, 0x81, 0xd0, 0xd3, 0x85, 0xf2, 0x0c, 0xf3, 0x7d, 0x3e, 0xe1,
0x87, 0x93, 0x15, 0xfb, 0x69, 0x7e, 0x12, 0x2f, 0x80, 0xea, 0x0f, 0x82,
0x8d, 0x05, 0x81, 0x8b, 0xdb, 0x12, 0x91, 0x16, 0x2a, 0x0b, 0x12, 0x08,
0x3c, 0x20, 0x26, 0xe4, 0x52, 0x00, 0x24, 0x26, 0x7d, 0x57, 0x6c, 0xa9,
0x82, 0x5c, 0x87, 0xff, 0x0b, 0x4a, 0x85, 0x20, 0xa5, 0x42, 0x62, 0x95,
0x09, 0x6a, 0x61, 0x77, 0x78, 0x09, 0x37, 0x06, 0xf3, 0x83, 0x1c, 0x09,
0x40, 0x43, 0x50, 0x48, 0x03, 0xd7, 0xd1, 0x2c, 0x15, 0xf8, 0xde, 0x9b,
0xf1, 0x3d, 0xb1, 0x1c, 0x9c, 0x42, 0x67, 0x81, 0x80, 0xb4, 0xe3, 0xda,
0x86, 0x2c, 0xcd, 0x8c, 0x30, 0x51, 0x78, 0x9f, 0x0c, 0x46, 0x37, 0x90,
0x98, 0x42, 0x28, 0x22, 0x31, 0xcb, 0xee, 0xcc, 0x40, 0x24, 0x27, 0x9d,
0x29, 0xa0, 0x9f, 0xcf, 0x34, 0x0d, 0x8b, 0xbd, 0xc8, 0xea, 0xb8, 0x6a,
0xb4, 0x3e, 0x8c, 0xef, 0xe3, 0x68, 0xa2, 0x26, 0x1a, 0xfa, 0x41, 0x74,
0x8f, 0x5d, 0xe0, 0x74, 0x46, 0x16, 0xbb, 0xbe, 0x9f, 0x2c, 0x4b, 0x3d,
0xe7, 0x8c, 0xd5, 0xee, 0xe4, 0xb0, 0x68, 0x11, 0xe0, 0x78, 0xc6, 0xa8,
0x37, 0x58, 0xaf, 0x2b, 0x85, 0x81, 0x89, 0x25, 0x00, 0xc5, 0x82, 0x20,
0x49, 0x68, 0xa1, 0xc6, 0x28, 0x8f, 0xba, 0x3a, 0xbf, 0x35, 0xb0, 0xe6,
0x28, 0x67, 0x1b, 0x63, 0x52, 0xd2, 0x37, 0x26, 0x11, 0xf7, 0x1a, 0x52,
0xee, 0xa0, 0xad, 0xb1, 0x20, 0x41, 0x3a, 0x3d, 0xde, 0x10, 0xe7, 0x5f,
0x49, 0x5c, 0xd9, 0xa4, 0x7f, 0x9c, 0xe9, 0x2f, 0x6c, 0x6e, 0x9b, 0x54,
0x8a, 0xd1, 0x40, 0x1a, 0x19, 0x39, 0x96, 0xb0, 0x57, 0x91, 0x5f, 0x42,
0x52, 0x64, 0x49, 0xd8, 0x49, 0x96, 0xb8, 0x4d, 0x25, 0x71, 0x06, 0xea,
0x52, 0xb4, 0xe7, 0x20, 0x1e, 0xad, 0xe0, 0xb2, 0x0a, 0x31, 0xa9, 0xfe,
0x14, 0x4a, 0xba, 0xb4, 0x17, 0xe7, 0x18, 0xe0, 0x67, 0x31, 0x69, 0xc5,
0x3c, 0x44, 0x42, 0xfd, 0xa4, 0x01, 0x14, 0xb3, 0x69, 0x21, 0x02, 0x3a,
0x2b, 0xea, 0x22, 0x3e, 0xe0, 0x69, 0xae, 0x3c, 0xda, 0xb8, 0x51, 0xdb,
0x44, 0x12, 0x5b, 0xb3, 0x00, 0x65, 0x0b, 0x4c, 0xdf, 0x8c, 0xcb, 0x60,
0x5e, 0x54, 0x06, 0xf3, 0x82, 0x32, 0x78, 0xa6, 0x28, 0x33, 0x28, 0x41,
0x90, 0x48, 0x5e, 0xf2, 0x6a, 0x70, 0x9b, 0x85, 0xb9, 0xdc, 0xfe, 0x5d,
0xe3, 0xd9, 0x62, 0x02, 0x5c, 0x36, 0x8f, 0x2b, 0x88, 0x4c, 0xe6, 0xd8,
0x4b, 0x9a, 0x0d, 0x2f, 0x1e, 0xb3, 0x24, 0x74, 0xc9, 0x10, 0xf3, 0x2a,
0xca, 0x56, 0xfd, 0x3f, 0x74, 0xe5, 0xeb, 0x7f, 0xea, 0xdf, 0x4a, 0xaa,
0xba, 0xf5, 0x6f, 0x15, 0x9d, 0x0e, 0xa8, 0x09, 0x13, 0xbf, 0xd6, 0xbe,
0xa9, 0x6a, 0x08, 0x0e, 0xd0, 0xb4, 0x15, 0xec, 0x2f, 0x9c, 0x7a, 0x20,
0x96, 0x5d, 0x02, 0x85, 0xb7, 0xaa, 0xbe, 0x99, 0xf0, 0x8b, 0xd4, 0xc9,
0x75, 0xf1, 0x64, 0xf3, 0xde, 0xf8, 0xc9, 0x49, 0x1e, 0x9f, 0xc2, 0xd1,
0x03, 0x04, 0xcf, 0xf8, 0xd1, 0x4c, 0xa7, 0xa5, 0xef, 0xbe, 0x9f, 0x3e,
0x85, 0xe9, 0xf4, 0x01, 0x42, 0x48, 0x1a, 0x1b, 0xb5, 0x8c, 0xab, 0x89,
0xfe, 0x5c, 0xea, 0x7d, 0xb7, 0x9b, 0xd2, 0xe7, 0x8f, 0x9f, 0x68, 0xfa,
0xd8, 0x65, 0x9d, 0xe4, 0x89, 0x99, 0x5e, 0x21, 0x3d, 0x81, 0xe2, 0x6a,
0x5e, 0xd2, 0xc3, 0x98, 0xe9, 0xcc, 0x22, 0x47, 0xf8, 0x3a, 0xc5, 0x9d,
0xcc, 0x0d, 0x66, 0x2d, 0x70, 0x18, 0xe6, 0x34, 0x34, 0x37, 0x9d, 0x43,
0x92, 0xa5, 0x78, 0xea, 0x96, 0x8c, 0x37, 0x0d, 0x3a, 0x50, 0x3c, 0x5a,
0x10, 0x43, 0x30, 0x75, 0xf6, 0x3a, 0x12, 0xa8, 0xf2, 0x16, 0x84, 0x89,
0x49, 0xab, 0xd9, 0xbc, 0x03, 0x35, 0x1e, 0x15, 0xba, 0xbc, 0x38, 0x28,
0x6f, 0xe4, 0xfb, 0x57, 0x63, 0xed, 0x0b, 0x77, 0x86, 0xbb, 0x58, 0xef,
0x9f, 0x41, 0x50, 0x52, 0xe4, 0xcc, 0x65, 0x11, 0xd0, 0xc2, 0x34, 0x7c,
0xe7, 0xd7, 0xc6, 0x9d, 0xb1, 0x98, 0x5c, 0x17, 0xd2, 0xd7, 0x82, 0xf2,
0x72, 0x7e, 0xde, 0x01, 0x26, 0xde, 0x45, 0x54, 0x9b, 0x22, 0xb7, 0x09,
0x66, 0xf9, 0x4f, 0x23, 0x97, 0xe8, 0x68, 0xa8, 0xb7, 0x41, 0x42, 0x76,
0x04, 0x3f, 0x98, 0x4a, 0x4d, 0x13, 0x7f, 0x11, 0x47, 0xb5, 0x7f, 0x1a,
0xfd, 0x96, 0xa0, 0xfb, 0x83, 0x48, 0x8b, 0xba, 0xa6, 0x4d, 0xa9, 0x5a,
0x01, 0x83, 0x7b, 0x5e, 0x5f, 0x38, 0xad, 0x9f, 0x70, 0x98, 0x24, 0xa0,
0x7f, 0x1d, 0x9f, 0xdc, 0xf0, 0x3e, 0xa8, 0xdd, 0x13, 0x22, 0xcb, 0xe2,
0x48, 0x00, 0x03, 0x0f, 0x04, 0x5a, 0x5e, 0x92, 0xb7, 0xd2, 0x0f, 0x06,
0x0f, 0x22, 0x2a, 0xbf, 0xff, 0x19, 0x02, 0xb9, 0x12, 0xc9, 0x62, 0xa5,
0x05, 0xc4, 0xfd, 0x6d, 0xbb, 0x9e, 0xc4, 0x18, 0x1f, 0xc2, 0x9a, 0x0f,
0xb4, 0xc7, 0x24, 0x49, 0x72, 0xc9, 0x2b, 0xc9, 0x10, 0xcc, 0xa0, 0x6c,
0x50, 0x1b, 0xd8, 0x3d, 0x9a, 0x33, 0xf8, 0xfc, 0x3c, 0x9f, 0x33, 0xbc,
0xf9, 0xf9, 0xa1, 0xe2, 0x69, 0x98, 0xad, 0xfe, 0x19, 0x1a, 0x41, 0x1d,
0xca, 0xff, 0x3e, 0xde, 0xb5, 0x2e, 0xea, 0xf6, 0xd8, 0x17, 0xfb, 0x78,
0xa2, 0xa0, 0xb9, 0x53, 0x8d, 0x90, 0xa2, 0xd4, 0x32, 0xdb, 0x0b, 0x89,
0xfb, 0xf6, 0x66, 0xe0, 0x39, 0xce, 0x8d, 0xe7, 0xff, 0xf8, 0x31, 0xfa,
0x90, 0x3e, 0x24, 0x4b, 0xc7, 0x73, 0x34, 0xab, 0x70, 0x35, 0x56, 0xb4,
0x3f, 0x5d, 0x8e, 0x93, 0x34, 0xc7, 0xa0, 0x3a, 0x88, 0x0a, 0x46, 0x1f,
0x4a, 0x96, 0x16, 0x8e, 0xde, 0x1e, 0x4b, 0x04, 0x7b, 0x0c, 0x5e, 0x7c,
0xdc, 0x70, 0x26, 0x5a, 0x21, 0x59, 0xc1, 0x40, 0x19, 0x58, 0x9c, 0x32,
0xa5, 0xe3, 0x78, 0xe6, 0x64, 0x38, 0x25, 0x19, 0x8b, 0xea, 0x74, 0x8c,
0x7b, 0xbe, 0x11, 0xc6, 0x43, 0x8a, 0xbb, 0x15, 0xd4, 0x47, 0xbb, 0xf3,
0x97, 0x85, 0x2e, 0x90, 0xae, 0x32, 0xa5, 0x40, 0xb3, 0x6c, 0xd6, 0x53,
0x75, 0x13, 0xe7, 0x9c, 0x79, 0x56, 0x5c, 0x9a, 0x26, 0x37, 0x1f, 0x7e,
0xe6, 0xb4, 0xa6, 0xe3, 0x23, 0x29, 0x0c, 0x82, 0xbb, 0x20, 0x74, 0xe2,
0x87, 0x7f, 0xa3, 0x9e, 0xfe, 0x51, 0xce, 0x8d, 0xb9, 0xda, 0xfb, 0x07,
0xcd, 0xba, 0x02, 0xfb, 0x24, 0xd8, 0x0f, 0x28, 0x70, 0x50, 0xe2, 0x58,
0x66, 0xc4, 0x38, 0xf9, 0xbf, 0x66, 0xdc, 0xfe, 0x20, 0xd6, 0x0f, 0xe0,
0xdf, 0x9f, 0xc5, 0x92, 0x7f, 0xd4, 0x9e, 0x54, 0x13, 0x76, 0xfe, 0x3f,
0x74, 0xfc, 0xcb, 0x84, 0x0e, 0x55, 0x30, 0x34, 0x71, 0x82, 0x9b, 0x25,
0xde, 0x53, 0xc1, 0x8b, 0x7a, 0x9d, 0x4e, 0x48, 0xf9, 0x3d, 0x96, 0xe6,
0xd8, 0x93, 0x4d, 0x07, 0x0e, 0x45, 0x6d, 0xde, 0x80, 0x57, 0xb7, 0xe7,
0x45, 0x21, 0xf5, 0x22, 0x9e, 0xa3, 0x5e, 0x19, 0xb9, 0xf8, 0x0d, 0xe7,
0xc7, 0x8f, 0xd1, 0xcb, 0xa6, 0x53, 0x62, 0xe3, 0xd7, 0xc7, 0x8d, 0x30,
0xf3, 0xb2, 0x19, 0x96, 0x4c, 0xc8, 0xd9, 0xfe, 0x2a, 0xbe, 0x73, 0xd1,
0xd2, 0x53, 0x44, 0xac, 0x4c, 0x6a, 0x9a, 0xc9, 0xf3, 0xd8, 0x46, 0xe6,
0x9c, 0x1e, 0x4f, 0x60, 0xc4, 0xe1, 0x2c, 0x2f, 0x3e, 0x9c, 0xe5, 0x6a,
0xdd, 0xdd, 0x52, 0xa6, 0xdb, 0x82, 0x98, 0xab, 0xe5, 0xca, 0x53, 0xd0,
0xa3, 0xdc, 0xfb, 0x9c, 0x41, 0xe7, 0xe7, 0x93, 0xb3, 0xe3, 0x0b, 0xc2,
0x6d, 0x25, 0xff, 0x59, 0xd5, 0xb2, 0xdf, 0xf0, 0xfc, 0x82, 0x73, 0x0a,
0xba, 0x8a, 0x74, 0x01, 0x70, 0xb5, 0xfe, 0x0b, 0x4b, 0xd3, 0x03, 0xed,
0x0c, 0xe3, 0x76, 0x7c, 0xf1, 0x00, 0xd9, 0x64, 0x9a, 0xa9, 0x05, 0x39,
0x56, 0xab, 0x9a, 0x8c, 0x87, 0xfc, 0xd8, 0x0b, 0x48, 0xda, 0x33, 0xba,
0xae, 0x83, 0x4e, 0x2b, 0x50, 0x90, 0x22, 0xc7, 0x05, 0xd5, 0xbc, 0x9a,
0x16, 0xf3, 0x0a, 0x33, 0x92, 0x59, 0xa0, 0x25, 0x54, 0x0b, 0x0c, 0xae,
0x15, 0x1c, 0x73, 0x43, 0xf1, 0x5a, 0x24, 0x5b, 0x96, 0xc8, 0x56, 0xcd,
0xcb, 0x96, 0x41, 0x98, 0x73, 0x42, 0xfa, 0x96, 0x6d, 0x4c, 0x4f, 0x78,
0x2c, 0x53, 0x15, 0x15, 0x89, 0x11, 0x9f, 0x17, 0x25, 0x5f, 0xc4, 0x86,
0xc3, 0xb8, 0x7c, 0x7b, 0x8a, 0x65, 0xa2, 0xce, 0x49, 0x17, 0x75, 0x66,
0x7e, 0x9e, 0xe6, 0x34, 0x82, 0xab, 0xc9, 0x59, 0xbd, 0xa9, 0xe5, 0x8e,
0xd5, 0xd9, 0x84, 0x34, 0x09, 0xe6, 0x24, 0xa1, 0x17, 0x70, 0x65, 0xac,
0xe1, 0x28, 0xc4, 0xf1, 0xd5, 0x03, 0x3c, 0xc3, 0x41, 0x3c, 0xf0, 0xbb,
0x45, 0x45, 0x77, 0x19, 0x0a, 0x27, 0x93, 0x38, 0x74, 0x17, 0xdc, 0x0b,
0x68, 0x05, 0x6c, 0x10, 0x0e, 0xaa, 0xf5, 0x78, 0xee, 0xd4, 0x47, 0x1c,
0x44, 0xe7, 0xfa, 0x51, 0x22, 0xa2, 0x36, 0x66, 0xc9, 0xc0, 0x55, 0x27,
0xc2, 0xe1, 0xe8, 0xda, 0x84, 0x05, 0xf6, 0x1a, 0x5b, 0x06, 0x24, 0x5d,
0xd5, 0x86, 0xb3, 0x61, 0x35, 0x9c, 0x52, 0x29, 0xde, 0x8e, 0x30, 0x39,
0xe5, 0x32, 0x0c, 0x43, 0x09, 0x0d, 0xef, 0xab, 0xf3, 0x2d, 0xbe, 0x3f,
0xb0, 0x95, 0x65, 0xf2, 0xe7, 0x09, 0xa5, 0x48, 0x46, 0x12, 0x49, 0x78,
0xd8, 0xcc, 0xc7, 0x36, 0xad, 0x81, 0x97, 0x3f, 0xe4, 0x7a, 0xda, 0x14,
0xd7, 0x66, 0xa7, 0x58, 0xf1, 0x29, 0x00, 0x14, 0xf7, 0x1c, 0x0f, 0x04,
0x27, 0x6e, 0xa8, 0x60, 0x7b, 0x05, 0xab, 0x4e, 0xae, 0xe2, 0xd6, 0x4d,
0x7c, 0x64, 0xbd, 0xae, 0x70, 0xb7, 0x99, 0xab, 0x30, 0xe0, 0xbb, 0x37,
0xd8, 0xa6, 0x32, 0x71, 0x39, 0xc0, 0x05, 0x2a, 0xd4, 0x8d, 0x0a, 0xdb,
0x9c, 0x3c, 0x47, 0xa0, 0xc2, 0xbf, 0x15, 0xb8, 0xde, 0xac, 0xa9, 0x21,
0x4f, 0xe0, 0xf5, 0xc5, 0xc4, 0xd8, 0xe3, 0x00, 0xe1, 0x51, 0x6e, 0x3a,
0xd5, 0xb1, 0xa9, 0x0b, 0xec, 0x24, 0xbd, 0x34, 0x05, 0xc9, 0x0a, 0x21,
0xf1, 0xbc, 0x08, 0x3c, 0x9f, 0x74, 0x49, 0x6c, 0x03, 0x1a, 0x66, 0xe8,
0x08, 0x4d, 0x1c, 0xe8, 0x6a, 0xde, 0x3b, 0x64, 0xa0, 0x61, 0x7c, 0x12,
0x11, 0xea, 0x78, 0xa3, 0x4b, 0xad, 0xff, 0x71, 0xc9, 0xc7, 0xba, 0x39,
0x43, 0xea, 0x3f, 0x3b, 0x91, 0x4c, 0xb7, 0x2d, 0x3d, 0xf4, 0x14, 0xc1,
0xbe, 0xed, 0x0d, 0x0a, 0x0e, 0x37, 0x15, 0x77, 0x36, 0x19, 0x78, 0x45,
0x17, 0x0f, 0x72, 0x72, 0xcd, 0xb9, 0x09, 0x10, 0xee, 0xcc, 0x23, 0x1b,
0x92, 0xe6, 0x18, 0xf3, 0xf3, 0x76, 0x2a, 0x6c, 0xb7, 0x78, 0x57, 0xd2,
0x99, 0x5b, 0x24, 0x93, 0x2b, 0xd6, 0x15, 0x32, 0x91, 0xa5, 0x20, 0x8c,
0x3f, 0x7b, 0xc7, 0x6a, 0xf9, 0x1d, 0x53, 0x1b, 0x64, 0xe2, 0x40, 0xf3,
0x7d, 0xd4, 0x93, 0x9b, 0xed, 0xa9, 0x8a, 0x73, 0xab, 0x0f, 0xee, 0x4f,
0xcc, 0x5a, 0x62, 0xe0, 0xf5, 0x88, 0x00, 0xa2, 0xc7, 0x28, 0xec, 0x75,
0x94, 0x00, 0x23, 0xba, 0x96, 0xb8, 0xe0, 0xfc, 0xa5, 0x0a, 0xfc, 0x0f,
0x49, 0x5b, 0x16, 0x0b, 0x0c, 0xf0, 0xe9, 0xe2, 0x66, 0x45, 0x3a, 0xab,
0xe8, 0x7e, 0x45, 0x67, 0x7c, 0x6c, 0x03, 0x52, 0xf2, 0x7c, 0x45, 0x6d,
0x70, 0xdc, 0x1a, 0x30, 0xe2, 0xcc, 0xac, 0x61, 0xec, 0x01, 0x27, 0x82,
0x87, 0xc8, 0xa2, 0x32, 0xd1, 0x03, 0x3b, 0xca, 0x0b, 0xe2, 0x12, 0x4e,
0x12, 0x48, 0x78, 0xc1, 0x61, 0x1b, 0x37, 0xe2, 0x83, 0xb3, 0x5f, 0x8a,
0x32, 0x5e, 0x3a, 0x49, 0x1b, 0x39, 0x6f, 0x9c, 0xbd, 0xef, 0x05, 0xbd,
0x3d, 0xc2, 0x49, 0x23, 0xad, 0xd4, 0x94, 0xe4, 0x0c, 0x9d, 0xe3, 0x31,
0x51, 0x3a, 0x14, 0x06, 0xa6, 0x68, 0x0b, 0xe7, 0x85, 0x74, 0x71, 0x2b,
0x84, 0x84, 0x5d, 0x71, 0x79, 0x52, 0x34, 0x19, 0x8e, 0xbb, 0x28, 0x97,
0x09, 0x7e, 0x45, 0x1e, 0xf7, 0x3f, 0x8a, 0x96, 0x23, 0x3e, 0xd4, 0x4c,
0x9f, 0x7c, 0xc4, 0x05, 0x9f, 0xe0, 0x62, 0x8a, 0xe6, 0xbd, 0xe6, 0x69,
0xf3, 0xa6, 0x39, 0x8b, 0x6c, 0xc8, 0x52, 0x13, 0xcb, 0xe6, 0xb9, 0x52,
0x3a, 0x73, 0xd7, 0x1d, 0x93, 0x4e, 0x3c, 0x78, 0xad, 0xcc, 0x3e, 0xc5,
0xa0, 0xea, 0x54, 0x26, 0x8b, 0x1d, 0x77, 0xd3, 0xa1, 0x24, 0x68, 0x11,
0xe6, 0x5e, 0x10, 0x97, 0x3a, 0xbf, 0xd4, 0xc3, 0xff, 0xfb, 0x4f, 0x51,
0x2c, 0xf6, 0x92, 0x9e, 0x57, 0x4c, 0xdd, 0x6a, 0x5e, 0xd8, 0x54, 0x30,
0x0e, 0x8a, 0x03, 0x94, 0x0e, 0xde, 0xa8, 0x92, 0xf0, 0xa4, 0x04, 0xb6,
0x82, 0xc4, 0x87, 0xa0, 0xa3, 0xdb, 0x59, 0x10, 0x43, 0x00, 0xce, 0x26,
0xb6, 0xcf, 0x50, 0x10, 0x99, 0x20, 0x91, 0xf3, 0x2d, 0xd9, 0x0b, 0x9d,
0xf2, 0x76, 0x3c, 0x09, 0x75, 0x04, 0xf7, 0x1d, 0xaf, 0xae, 0xe5, 0x74,
0xe5, 0x0f, 0x1d, 0x53, 0x15, 0xf7, 0x38, 0x15, 0x3c, 0xd3, 0x98, 0xd9,
0x18, 0xc7, 0xc3, 0xb0, 0xfa, 0xb8, 0x8d, 0x4b, 0x31, 0x9c, 0xc2, 0x74,
0xdc, 0xde, 0x7a, 0x7e, 0x2b, 0x15, 0x74, 0x9a, 0xc9, 0xa1, 0xca, 0x28,
0xb3, 0xcc, 0x71, 0x06, 0xc9, 0x5b, 0x7a, 0x03, 0xcc, 0xc8, 0xde, 0x00,
0x53, 0x73, 0x2c, 0x5f, 0x8d, 0xae, 0x43, 0xe2, 0xa1, 0x71, 0xcc, 0x66,
0x6c, 0xec, 0x22, 0x99, 0x93, 0x00, 0xca, 0xcc, 0xf9, 0x59, 0xd1, 0x94,
0x6b, 0x86, 0x51, 0x70, 0x0b, 0x28, 0x03, 0xea, 0x6d, 0x7c, 0x3b, 0xf4,
0xeb, 0x37, 0xcd, 0x35, 0x68, 0xa3, 0x5c, 0xc3, 0x4b, 0x94, 0x93, 0x6b,
0xe6, 0xe7, 0x67, 0xde, 0xe7, 0x82, 0x42, 0x50, 0xe5, 0xba, 0x1f, 0x85,
0x36, 0x86, 0x28, 0xf7, 0xbf, 0x8b, 0xb9, 0xb6, 0x9e, 0xb6, 0x61, 0x28,
0xfc, 0x57, 0x20, 0x9a, 0xaa, 0x64, 0x98, 0x06, 0xa6, 0x3d, 0x6c, 0x29,
0x2e, 0x62, 0x68, 0xd2, 0xa4, 0x81, 0x98, 0x54, 0xf6, 0x84, 0x10, 0x4a,
0xd3, 0x94, 0x06, 0x52, 0x1b, 0x35, 0x61, 0xac, 0xaa, 0xf8, 0xef, 0x3b,
0x17, 0x27, 0x71, 0xdc, 0xb4, 0x88, 0xbe, 0xec, 0xa5, 0x4d, 0x6d, 0xc7,
0x97, 0xe3, 0xe3, 0x73, 0xf1, 0xf9, 0x4e, 0x3b, 0xac, 0xf8, 0x81, 0xa9,
0xc6, 0xa0, 0xb5, 0x3a, 0x85, 0xee, 0x22, 0x68, 0x38, 0xc5, 0x33, 0x66,
0xa8, 0xd5, 0x84, 0xf0, 0x65, 0xdb, 0x3c, 0x74, 0x84, 0x05, 0xb7, 0x31,
0xcb, 0xfc, 0x2f, 0x22, 0x91, 0x81, 0x4b, 0x38, 0x37, 0x57, 0x04, 0x5e,
0x8d, 0xb6, 0xc9, 0xc0, 0x66, 0x9d, 0x1c, 0x6c, 0x6f, 0x31, 0x85, 0xb3,
0x4a, 0x6a, 0xb1, 0xb6, 0x97, 0x5d, 0x20, 0x0b, 0x86, 0x57, 0xa4, 0xef,
0x5d, 0x64, 0xba, 0x9b, 0xc4, 0xdc, 0x22, 0xe5, 0xd1, 0xa9, 0xe7, 0x59,
0xd1, 0x42, 0xdd, 0xc8, 0xfe, 0x77, 0x12, 0x43, 0x18, 0xdb, 0x47, 0xa3,
0x4c, 0x4c, 0x82, 0x95, 0xe5, 0x45, 0xd6, 0xba, 0xd2, 0x03, 0xe9, 0x93,
0x29, 0x90, 0x3b, 0x5b, 0x03, 0x72, 0x03, 0x3b, 0x78, 0xa7, 0xaa, 0xe8,
0x9c, 0xb2, 0xa3, 0x89, 0x75, 0x57, 0x83, 0x31, 0x0c, 0xff, 0x38, 0x68,
0xa2, 0x8b, 0x50, 0x43, 0xb1, 0x45, 0xbb, 0x02, 0x23, 0x8c, 0x50, 0xfe,
0x10, 0xff, 0x89, 0x19, 0x7b, 0xde, 0xaa, 0x4d, 0xec, 0x18, 0x23, 0x34,
0x4b, 0xee, 0xf0, 0xa9, 0xd5, 0xa2, 0x8e, 0x39, 0x16, 0xcd, 0xe3, 0xd3,
0xec, 0xa9, 0x2b, 0x96, 0x59, 0x87, 0x30, 0x29, 0x3c, 0x09, 0x1b, 0x50,
0x6b, 0x19, 0x63, 0xfc, 0x80, 0x27, 0x11, 0x83, 0x3c, 0x8a, 0x61, 0x63,
0x29, 0x0b, 0xa3, 0x8f, 0xd3, 0x0e, 0x44, 0x5d, 0x59, 0x92, 0xa7, 0xa6,
0xc1, 0x9e, 0xb4, 0x0a, 0x15, 0x14, 0x2a, 0x06, 0xc0, 0x81, 0xc4, 0x4d,
0xed, 0xf6, 0x64, 0x1a, 0x55, 0xb3, 0x26, 0xc8, 0x08, 0x35, 0x0b, 0x99,
0x3e, 0x11, 0xff, 0xc0, 0x73, 0x42, 0x1c, 0x91, 0x4b, 0xb4, 0x64, 0x44,
0x21, 0x31, 0xb4, 0x8d, 0xfb, 0x0c, 0x24, 0x6f, 0x30, 0x14, 0x99, 0xdf,
0x66, 0xd5, 0xca, 0xf3, 0xcc, 0x8d, 0xe7, 0xd9, 0xeb, 0xb5, 0x5d, 0xcf,
0x1c, 0x98, 0x01, 0x74, 0xa5, 0x2d, 0x0b, 0x7d, 0x57, 0x38, 0xe0, 0x3a,
0x5c, 0x4f, 0xbb, 0x61, 0x9e, 0xf5, 0x01, 0xdf, 0xc6, 0x84, 0xec, 0xa4,
0x21, 0xd7, 0x5f, 0x33, 0x3a, 0x70, 0x57, 0xcd, 0x6a, 0xe0, 0xb9, 0x48,
0x20, 0x59, 0x13, 0xe8, 0xd4, 0x07, 0x2f, 0x25, 0x65, 0x2c, 0xa2, 0x9f,
0x3b, 0x1e, 0xb2, 0x31, 0x0b, 0x46, 0x94, 0xcf, 0xc6, 0xb6, 0xf3, 0x46,
0x3c, 0x6b, 0x10, 0x11, 0x61, 0x5d, 0xe5, 0x63, 0x47, 0x95, 0xd7, 0xc5,
0xca, 0x45, 0x23, 0x3a, 0x2d, 0x43, 0x2b, 0xdf, 0x26, 0x32, 0x12, 0x04,
0x62, 0x59, 0x70, 0x00, 0xb2, 0x7c, 0x73, 0xdb, 0xe6, 0x65, 0xf6, 0x35,
0xc7, 0x6d, 0x9f, 0xf8, 0xb3, 0x40, 0x5a, 0x8d, 0xd2, 0xa2, 0xa0, 0x45,
0xe0, 0x82, 0x2f, 0xc1, 0xf6, 0xf6, 0x3d, 0xe0, 0xa9, 0x70, 0x0e, 0x4f,
0x2c, 0x96, 0x89, 0x12, 0xd7, 0xb3, 0x74, 0x6e, 0x6a, 0x4a, 0x7c, 0x84,
0x2a, 0x85, 0x55, 0x1f, 0x88, 0xfa, 0x23, 0x0a, 0x77, 0xc0, 0x94, 0xe5,
0x71, 0x78, 0x24, 0xd6, 0xbb, 0xfd, 0x5d, 0xa4, 0x23, 0x3d, 0x2d, 0xaf,
0xe3, 0x31, 0x10, 0xe5, 0x28, 0xe8, 0x68, 0x01, 0x55, 0xe4, 0xbe, 0x7e,
0x32, 0xe3, 0xfd, 0xc8, 0xee, 0x67, 0x39, 0x5e, 0xba, 0x9d, 0x25, 0x98,
0x68, 0x73, 0x01, 0x5b, 0x64, 0xde, 0x84, 0xca, 0x11, 0x30, 0xef, 0xaf,
0x45, 0xa6, 0xca, 0x4b, 0x82, 0xc9, 0x10, 0xbb, 0xc1, 0xa6, 0xe8, 0xf9,
0x3c, 0x56, 0x93, 0x02, 0x1d, 0xe6, 0x73, 0x7e, 0xf6, 0x57, 0xe8, 0xbf,
0x44, 0x84, 0x54, 0xf4, 0xc4, 0x18, 0xce, 0xe9, 0xcf, 0x74, 0x19, 0xad,
0x5e, 0x32, 0x15, 0x79, 0xe7, 0xe5, 0x22, 0x3f, 0x1c, 0x79, 0x62, 0x1e,
0x27, 0xf0, 0x83, 0xdb, 0xc3, 0xef, 0x57, 0x81, 0x02, 0x2c, 0x6a, 0xfb,
0x4f, 0x15, 0xa4, 0x0a, 0x3d, 0xed, 0x2b, 0x95, 0x2f, 0xa3, 0xfd, 0xe3,
0xd7, 0xb7, 0x86, 0x84, 0x39, 0xc2, 0x60, 0x63, 0x0d, 0xcc, 0x50, 0x43,
0xa9, 0x3a, 0xe7, 0x70, 0x96, 0x97, 0x87, 0x33, 0x67, 0x1e, 0x5c, 0xd6,
0x3d, 0x17, 0x17, 0x9b, 0xc5, 0x44, 0x21, 0x5a, 0x02, 0x37, 0xf8, 0x1e,
0xbb, 0x9d, 0x9e, 0x68, 0xbd, 0xd6, 0xcd, 0x9f, 0x47, 0x01, 0xbd, 0x6d,
0xec, 0xa5, 0x96, 0xa6, 0x7b, 0x97, 0xad, 0xb6, 0x19, 0xce, 0x4d, 0x12,
0x50, 0x62, 0x10, 0x49, 0xd6, 0x12, 0x4c, 0xec, 0xc0, 0x84, 0x28, 0x7f,
0x10, 0x76, 0x87, 0x3b, 0xd1, 0x91, 0x51, 0x02, 0xaa, 0x4a, 0x0f, 0x36,
0xcf, 0x22, 0x95, 0xa0, 0xce, 0x24, 0x8d, 0xc4, 0x47, 0x3a, 0x38, 0xf0,
0x50, 0x7b, 0x4d, 0x84, 0x73, 0xf2, 0xe0, 0xe5, 0x77, 0x1e, 0xbc, 0x4c,
0xf8, 0xba, 0xa5, 0x9d, 0x03, 0xc7, 0x02, 0xc1, 0xba, 0x6f, 0xb9, 0x1e,
0xfb, 0x37, 0xe5, 0xad, 0x58, 0xa1, 0x05, 0x19, 0x29, 0xa0, 0x7a, 0x1a,
0xd4, 0x27, 0xd6, 0x31, 0x48, 0xcc, 0xa9, 0xd5, 0xb4, 0x5e, 0x03, 0xd6,
0xb3, 0x97, 0x5c, 0xef, 0x17, 0x5e, 0x55, 0x6c, 0x5c, 0x33, 0x11, 0xcb,
0x66, 0x15, 0xbb, 0x0b, 0x54, 0x1a, 0x84, 0xe2, 0xbf, 0xa7, 0xbe, 0x80,
0xe0, 0xcf, 0xb9, 0x21, 0x39, 0xee, 0xd1, 0x23, 0xf0, 0x2d, 0xf0, 0x29,
0x50, 0xe2, 0x6e, 0x4e, 0xa1, 0xc8, 0x36, 0x07, 0x62, 0x9e, 0x1a, 0xa2,
0x9a, 0x79, 0x80, 0x35, 0x26, 0x07, 0x9e, 0xc4, 0xa3, 0x82, 0xb3, 0xb3,
0xcc, 0x0b, 0xad, 0xbe, 0xe9, 0xc9, 0x92, 0x2e, 0x99, 0xaa, 0x5d, 0xd3,
0x72, 0xf5, 0x3a, 0x80, 0x73, 0x30, 0xd1, 0x2f, 0x74, 0x47, 0x88, 0xed,
0xfa, 0x33, 0xd0, 0x31, 0x20, 0x6f, 0x81, 0x43, 0x92, 0xd4, 0x0f, 0x6f,
0x4e, 0x7b, 0xb7, 0x07, 0x60, 0x5d, 0x48, 0xf8, 0x0a, 0x24, 0x3c, 0xf4,
0x6e, 0x3f, 0x06, 0xe1, 0x7d, 0x26, 0xdc, 0xcb, 0x23, 0x0d, 0xd4, 0x95,
0x48, 0x57, 0xcb, 0x35, 0xd8, 0xb7, 0x5c, 0x03, 0xcc, 0x39, 0x90, 0x2d,
0x13, 0xa7, 0xd2, 0x27, 0x42, 0x13, 0x14, 0x15, 0xbe, 0xf0, 0xbf, 0x72,
0xe0, 0x8b, 0xe4, 0x1b, 0x42, 0xb2, 0x6d, 0xdc, 0xbd, 0xc7, 0xe9, 0xc8,
0x1e, 0xe9, 0x49, 0x69, 0xa1, 0x20, 0x3d, 0x2c, 0x20, 0x13, 0x2c, 0x5d,
0xd7, 0x8f, 0x27, 0xa1, 0xc9, 0x91, 0x33, 0xb9, 0x72, 0x84, 0x05, 0x44,
0xd3, 0xb2, 0x88, 0xc2, 0x30, 0x99, 0xa8, 0x07, 0x54, 0x25, 0xfa, 0x79,
0x32, 0xcd, 0x41, 0xd3, 0xa2, 0x34, 0x09, 0xe3, 0x87, 0xf8, 0x6f, 0x98,
0x67, 0xe3, 0x02, 0x31, 0x6b, 0xe1, 0x71, 0xff, 0x73, 0xff, 0x6b, 0x85,
0x5e, 0x43, 0x40, 0x2a, 0xb0, 0xab, 0x7c, 0x2e, 0xa7, 0x87, 0x5f, 0x86,
0x6e, 0xd7, 0x94, 0x86, 0xc7, 0x8f, 0x83, 0x0d, 0xee, 0x11, 0xd0, 0xa0,
0xe5, 0x8b, 0x9c, 0xc7, 0x0a, 0x5d, 0x3e, 0x72, 0xd5, 0xcc, 0x18, 0x35,
0x92, 0xee, 0x25, 0x1d, 0x8b, 0xbd, 0x72, 0xb1, 0x64, 0x5f, 0x2e, 0x89,
0xf3, 0xbd, 0x44, 0x3f, 0x2d, 0xf1, 0x34, 0xf0, 0x18, 0x9b, 0xaf, 0x38,
0xd9, 0x30, 0x0b, 0x18, 0x8e, 0xe1, 0xd9, 0xf8, 0x3b, 0x4f, 0x70, 0x65,
0x3f, 0x2e, 0x96, 0x2a, 0xc1, 0x24, 0x83, 0xba, 0x13, 0xa4, 0x6e, 0xfb,
0x8e, 0x89, 0x5a, 0x06, 0x41, 0xb3, 0x4c, 0x0c, 0x71, 0xec, 0x55, 0x06,
0xb2, 0xc5, 0x4c, 0x43, 0xf2, 0x77, 0xc1, 0xbd, 0xe7, 0x1d, 0x1a, 0xb2,
0xdf, 0x5a, 0x15, 0xe2, 0xee, 0x38, 0x45, 0xbc, 0xef, 0x4e, 0x61, 0x95,
0x42, 0xcd, 0x7e, 0xb3, 0xfd, 0x8f, 0x2c, 0x4e, 0x43, 0xe3, 0xd6, 0x0c,
0xeb, 0xfc, 0x29, 0x2b, 0x55, 0xb1, 0x4a, 0x62, 0x3a, 0x19, 0x2f, 0xb8,
0x3d, 0x27, 0x51, 0xd9, 0xa9, 0x9e, 0x43, 0x23, 0x6d, 0x08, 0x6f, 0x48,
0xfd, 0xf2, 0x67, 0x46, 0x20, 0x16, 0xec, 0xaf, 0x0d, 0x6b, 0xe9, 0x9e,
0x10, 0xb7, 0x1e, 0xfe, 0x03, 0x0b, 0x5a, 0x75, 0x81, 0x5c, 0x4a, 0x00,
0x00
};

View File

@@ -0,0 +1,920 @@
#include "esp-fs-webserver.h"
FSWebServer::FSWebServer(fs::FS &fs, WebServerClass &server)
{
m_filesystem = &fs;
webserver = &server;
m_basePath[0] = '\0';
}
WebServerClass *FSWebServer::getRequest()
{
return webserver;
}
void FSWebServer::run()
{
webserver->handleClient();
if (m_apmode)
m_dnsServer.processNextRequest();
}
void FSWebServer::addHandler(const Uri &uri, HTTPMethod method, WebServerClass::THandlerFunction fn)
{
webserver->on(uri, method, fn);
}
void FSWebServer::addHandler(const Uri &uri, WebServerClass::THandlerFunction handler)
{
webserver->on(uri, HTTP_ANY, handler);
}
// List all files saved in the selected filesystem
bool FSWebServer::checkDir(char *dirname, uint8_t levels)
{
if (dirname[0] != '/')
dirname[0] = '/';
File root = m_filesystem->open(dirname, "r");
if (!root)
{
DebugPrintln("- failed to open directory\n");
return false;
}
if (!root.isDirectory())
{
DebugPrintln(" - not a directory\n");
return false;
}
File file = root.openNextFile();
while (file)
{
if (file.isDirectory())
{
char dir[16];
strcpy(dir, "/");
strcat(dir, file.name());
DebugPrintf("DIR : %s\n", dir);
checkDir(dir, levels - 1);
}
else
{
DebugPrintf(" FILE: %s\tSIZE: %d\n", file.name(), file.size());
}
file = root.openNextFile();
}
return true;
}
bool FSWebServer::begin(const char *path)
{
DebugPrintln("\nList the files of webserver: ");
if (path != nullptr)
strcpy(m_basePath, path);
m_fsOK = checkDir(m_basePath, 2);
#ifdef INCLUDE_EDIT_HTM
webserver->on("/status", HTTP_GET, std::bind(&FSWebServer::handleStatus, this));
webserver->on("/list", HTTP_GET, std::bind(&FSWebServer::handleFileList, this));
webserver->on("/edit", HTTP_GET, std::bind(&FSWebServer::handleGetEdit, this));
webserver->on("/edit", HTTP_PUT, std::bind(&FSWebServer::handleFileCreate, this));
webserver->on("/edit", HTTP_DELETE, std::bind(&FSWebServer::handleFileDelete, this));
#endif
webserver->onNotFound(std::bind(&FSWebServer::handleRequest, this));
webserver->on("/favicon.ico", HTTP_GET, std::bind(&FSWebServer::replyOK, this));
webserver->on("/", HTTP_GET, std::bind(&FSWebServer::handleIndex, this));
#ifdef INCLUDE_SETUP_HTM
webserver->on("/setup", HTTP_GET, std::bind(&FSWebServer::handleSetup, this));
#endif
webserver->on("/scan", HTTP_GET, std::bind(&FSWebServer::handleScanNetworks, this));
webserver->on("/connect", HTTP_POST, std::bind(&FSWebServer::doWifiConnection, this));
webserver->on("/restart", HTTP_GET, std::bind(&FSWebServer::doRestart, this));
webserver->on("/ipaddress", HTTP_GET, std::bind(&FSWebServer::getIpAddress, this));
// Captive Portal redirect
webserver->on("/redirect", HTTP_GET, std::bind(&FSWebServer::captivePortal, this));
// Windows
webserver->on("/connecttest.txt", HTTP_GET, std::bind(&FSWebServer::captivePortal, this));
// Apple
webserver->on("/hotspot-detect.html", HTTP_GET, std::bind(&FSWebServer::captivePortal, this));
// Android
webserver->on("/generate_204", HTTP_GET, std::bind(&FSWebServer::captivePortal, this));
webserver->on("/gen_204", HTTP_GET, std::bind(&FSWebServer::captivePortal, this));
// Upload file
// - first callback is called after the request has ended with all parsed arguments
// - second callback handles file upload at that location
webserver->on("/edit", HTTP_POST, std::bind(&FSWebServer::replyOK, this), std::bind(&FSWebServer::handleFileUpload, this));
// OTA update via webbrowser
m_httpUpdater.setup(webserver);
#ifdef ESP32
webserver->enableCrossOrigin(true);
#endif
webserver->setContentLength(50);
webserver->begin();
return true;
}
void FSWebServer::setCaptiveWebage(const char *url)
{
m_apWebpage = (char *)realloc(m_apWebpage, sizeof(url));
strcpy(m_apWebpage, url);
}
IPAddress FSWebServer::setAPmode(const char *ssid, const char *psk)
{
m_apmode = true;
WiFi.mode(WIFI_AP_STA);
WiFi.persistent(false);
WiFi.softAP(ssid, psk);
/* Setup the DNS server redirecting all the domains to the apIP */
m_dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
m_dnsServer.start(53, "*", WiFi.softAPIP());
return WiFi.softAPIP();
}
IPAddress FSWebServer::startWiFi(uint32_t timeout, const char *apSSID, const char *apPsw)
{
IPAddress ip;
m_timeout = timeout;
WiFi.mode(WIFI_STA);
const char *_ssid;
const char *_pass;
#if defined(ESP8266)
struct station_config conf;
wifi_station_get_config_default(&conf);
_ssid = reinterpret_cast<const char *>(conf.ssid);
_pass = reinterpret_cast<const char *>(conf.password);
#elif defined(ESP32)
wifi_config_t conf;
esp_wifi_get_config(WIFI_IF_STA, &conf);
_ssid = reinterpret_cast<const char *>(conf.sta.ssid);
_pass = reinterpret_cast<const char *>(conf.sta.password);
#endif
if (strlen(_ssid) && strlen(_pass))
{
WiFi.begin(_ssid, _pass);
Serial.print(F("Connecting to "));
Serial.println(_ssid);
uint32_t startTime = millis();
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
if (WiFi.status() == WL_CONNECTED)
{
ip = WiFi.localIP();
return ip;
}
// If no connection after a while go in Access Point mode
if (millis() - startTime > m_timeout)
break;
}
}
if (apSSID != nullptr && apPsw != nullptr)
setAPmode(apSSID, apPsw);
else
setAPmode("ESP_AP", "123456789");
WiFi.begin();
ip = WiFi.softAPIP();
Serial.print(F("\nAP mode.\nServer IP address: "));
Serial.println(ip);
Serial.println();
return ip;
}
//////////////////////////////// WiFi /////////////////////////////////////////
/**
* Redirect to captive portal if we got a request for another domain.
*/
bool FSWebServer::captivePortal()
{
IPAddress ip = webserver->client().localIP();
char serverLoc[sizeof("https:://255.255.255.255/") + sizeof(m_apWebpage) + 1];
snprintf(serverLoc, sizeof(serverLoc), "http://%d.%d.%d.%d%s", ip[0], ip[1], ip[2], ip[3], m_apWebpage);
// redirect if hostheader not server ip, prevent redirect loops
if (strcmp(serverLoc, webserver->hostHeader().c_str()))
{
webserver->sendHeader(F("Location"), serverLoc, true);
webserver->send(302, F("text/html"), ""); // Empty content inhibits Content-length header so we have to close the socket ourselves.
webserver->client().stop(); // Stop is needed because we sent no content length
return true;
}
return false;
}
void FSWebServer::handleRequest()
{
if (!m_fsOK)
{
replyToCLient(ERROR, PSTR(FS_INIT_ERROR));
return;
}
#if defined(ESP32)
String _url = WebServer::urlDecode(webserver->uri());
#elif defined(ESP8266)
String _url = ESP8266WebServer::urlDecode(webserver->uri());
#endif
// First try to find and return the requested file from the filesystem,
// and if it fails, return a 404 page with debug information
// Serial.print("urlDecode: ");
// Serial.println(_url);
if (handleFileRead(_url))
return;
else
replyToCLient(NOT_FOUND, PSTR(FILE_NOT_FOUND));
}
void FSWebServer::getIpAddress()
{
webserver->send(200, "text/json", WiFi.localIP().toString());
}
void FSWebServer::doRestart()
{
Serial.println("RESTART");
webserver->send(200, "text/json", "Going to restart ESP");
delay(500);
ESP.restart();
}
void FSWebServer::doWifiConnection()
{
String ssid, pass;
bool persistent = true;
WiFi.mode(WIFI_AP_STA);
if (webserver->hasArg("ssid"))
{
ssid = webserver->arg("ssid");
}
if (webserver->hasArg("password"))
{
pass = webserver->arg("password");
}
if (webserver->hasArg("persistent"))
{
String pers = webserver->arg("persistent");
if (pers.equals("false"))
{
persistent = false;
}
}
if (WiFi.status() == WL_CONNECTED)
{
IPAddress ip = WiFi.localIP();
String resp = "ESP is currently connected to a WiFi network.<br><br>"
"Actual connection will be closed and a new attempt will be done with <b>";
resp += ssid;
resp += "</b> WiFi network.";
webserver->send(200, "text/plain", resp);
delay(500);
Serial.println("Disconnect from current WiFi network");
WiFi.disconnect();
}
if (ssid.length() && pass.length())
{
// Try to connect to new ssid
Serial.print("\nConnecting to ");
Serial.println(ssid);
WiFi.begin(ssid.c_str(), pass.c_str());
uint32_t beginTime = millis();
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
Serial.print("*.*");
if (millis() - beginTime > m_timeout)
break;
}
// reply to client
if (WiFi.status() == WL_CONNECTED)
{
// WiFi.softAPdisconnect();
IPAddress ip = WiFi.localIP();
Serial.print("\nConnected to Wifi! IP address: ");
Serial.println(ip);
webserver->send(200, "text/plain", ip.toString());
m_apmode = false;
delay(500);
ESP.restart();
// Store current WiFi configuration in flash
if (persistent)
{
#if defined(ESP8266)
struct station_config stationConf;
wifi_station_get_config_default(&stationConf);
// Clear previuos configuration
memset(&stationConf, 0, sizeof(stationConf));
os_memcpy(&stationConf.ssid, ssid.c_str(), ssid.length());
os_memcpy(&stationConf.password, pass.c_str(), pass.length());
wifi_set_opmode(STATION_MODE);
wifi_station_set_config(&stationConf);
#elif defined(ESP32)
wifi_config_t stationConf;
esp_wifi_get_config(WIFI_IF_STA, &stationConf);
// Clear previuos configuration
memset(&stationConf, 0, sizeof(stationConf));
memcpy(&stationConf.sta.ssid, ssid.c_str(), ssid.length());
memcpy(&stationConf.sta.password, pass.c_str(), pass.length());
esp_wifi_set_config(WIFI_IF_STA, &stationConf);
#endif
}
else
{
#if defined(ESP8266)
struct station_config stationConf;
wifi_station_get_config_default(&stationConf);
// Clear previuos configuration
memset(&stationConf, 0, sizeof(stationConf));
wifi_station_set_config(&stationConf);
#elif defined(ESP32)
wifi_config_t stationConf;
esp_wifi_get_config(WIFI_IF_STA, &stationConf);
// Clear previuos configuration
memset(&stationConf, 0, sizeof(stationConf));
esp_wifi_set_config(WIFI_IF_STA, &stationConf);
#endif
}
}
else
webserver->send(500, "text/plain", "Connection error, maybe the password is wrong?");
}
webserver->send(500, "text/plain", "Wrong credentials provided");
}
void FSWebServer::setCrossOrigin()
{
webserver->sendHeader(F("Access-Control-Allow-Origin"), F("*"));
webserver->sendHeader(F("Access-Control-Max-Age"), F("600"));
webserver->sendHeader(F("Access-Control-Allow-Methods"), F("PUT,POST,GET,OPTIONS"));
webserver->sendHeader(F("Access-Control-Allow-Headers"), F("*"));
};
void FSWebServer::handleScanNetworks()
{
String jsonList = "[";
DebugPrint("Scanning WiFi networks...");
int n = WiFi.scanNetworks();
DebugPrintln(" complete.");
if (n == 0)
{
DebugPrintln("no networks found");
webserver->send(200, "text/json", "[]");
return;
}
else
{
DebugPrint(n);
DebugPrintln(" networks found:");
for (int i = 0; i < n; ++i)
{
String ssid = WiFi.SSID(i);
int rssi = WiFi.RSSI(i);
#if defined(ESP8266)
String security = WiFi.encryptionType(i) == AUTH_OPEN ? "none" : "enabled";
#elif defined(ESP32)
String security = WiFi.encryptionType(i) == WIFI_AUTH_OPEN ? "none" : "enabled";
#endif
jsonList += "{\"ssid\":\"";
jsonList += ssid;
jsonList += "\",\"strength\":\"";
jsonList += rssi;
jsonList += "\",\"security\":";
jsonList += security == "none" ? "false" : "true";
jsonList += ssid.equals(WiFi.SSID()) ? ",\"selected\": true" : "";
jsonList += i < n - 1 ? "}," : "}";
}
jsonList += "]";
}
webserver->send(200, "text/json", jsonList);
DebugPrintln(jsonList);
}
#ifdef INCLUDE_SETUP_HTM
void FSWebServer::addDropdownList(const char *label, const char **array, size_t size)
{
File file = m_filesystem->open("/config.json", "r");
int sz = file.size() * 1.33;
int docSize = max(sz, 2048);
DynamicJsonDocument doc((size_t)docSize);
if (file)
{
// If file is present, load actual configuration
DeserializationError error = deserializeJson(doc, file);
if (error)
{
DebugPrintln(F("Failed to deserialize file, may be corrupted"));
DebugPrintln(error.c_str());
file.close();
return;
}
file.close();
}
else
{
DebugPrintln(F("File not found, will be created new configuration file"));
}
numOptions++;
// If key is present in json, we don't need to create it.
if (doc.containsKey(label))
return;
JsonObject obj = doc.createNestedObject(label);
obj["selected"] = array[0]; // first element selected as default
JsonArray arr = obj.createNestedArray("values");
for (int i = 0; i < size; i++)
{
arr.add(array[i]);
}
file = m_filesystem->open("/config.json", "w");
if (serializeJsonPretty(doc, file) == 0)
{
DebugPrintln(F("Failed to write to file"));
}
file.close();
}
void FSWebServer::removeWhiteSpaces(String &str)
{
const char noChars[] = {'\n', '\r', '\t'};
int pos = -1;
// Remove non printable characters
for (int i = 0; i < sizeof(noChars); i++)
{
pos = str.indexOf(noChars[i]);
while (pos > -1)
{
str.replace(String(noChars[i]), "");
pos = str.indexOf(noChars[i]);
}
}
// Remove doubles spaces
pos = str.indexOf(" ");
while (pos > -1)
{
str.replace(" ", " ");
pos = str.indexOf(" ");
}
}
void FSWebServer::handleSetup()
{
webserver->sendHeader(PSTR("Content-Encoding"), "gzip");
webserver->send_P(200, "text/html", SETUP_HTML, SETUP_HTML_SIZE);
}
#endif
void FSWebServer::handleIndex()
{
if (m_filesystem->exists("/index.htm"))
{
handleFileRead("/index.htm");
}
else if (m_filesystem->exists("/index.html"))
{
handleFileRead("/index.html");
}
#ifdef INCLUDE_SETUP_HTM
else
{
handleSetup();
}
#endif
}
/*
Read the given file from the filesystem and stream it back to the client
*/
bool FSWebServer::handleFileRead(const String &uri)
{
String path = m_basePath;
path = uri;
DebugPrintln("handleFileRead: " + path);
if (path.endsWith("/"))
{
path += "index.htm";
}
String pathWithGz = path + ".gz";
if (m_filesystem->exists(pathWithGz) || m_filesystem->exists(path))
{
if (m_filesystem->exists(pathWithGz))
{
path += ".gz";
}
const char *contentType = getContentType(path.c_str());
File file = m_filesystem->open(path, "r");
if (webserver->streamFile(file, contentType) != file.size())
{
DebugPrintln(PSTR("Sent less data than expected!"));
// webserver->stop();
}
file.close();
return true;
}
return false;
}
/*
Handle a file upload request
*/
void FSWebServer::handleFileUpload()
{
if (webserver->uri() != "/edit")
{
return;
}
HTTPUpload &upload = webserver->upload();
if (upload.status == UPLOAD_FILE_START)
{
String filename = upload.filename;
String result;
// Make sure paths always start with "/"
if (!filename.startsWith("/"))
{
filename = "/" + filename;
}
checkForUnsupportedPath(filename, result);
if (result.length() > 0)
{
replyToCLient(ERROR, PSTR("INVALID FILENAME"));
return;
}
DebugPrintf_P(PSTR("handleFileUpload Name: %s\n"), filename.c_str());
m_uploadFile = m_filesystem->open(filename, "w");
if (!m_uploadFile)
{
replyToCLient(ERROR, PSTR("CREATE FAILED"));
return;
}
DebugPrintf_P(PSTR("Upload: START, filename: %s\n"), filename.c_str());
}
else if (upload.status == UPLOAD_FILE_WRITE)
{
if (m_uploadFile)
{
size_t bytesWritten = m_uploadFile.write(upload.buf, upload.currentSize);
if (bytesWritten != upload.currentSize)
{
replyToCLient(ERROR, PSTR("WRITE FAILED"));
return;
}
}
DebugPrintf_P(PSTR("Upload: WRITE, Bytes: %d\n"), upload.currentSize);
}
else if (upload.status == UPLOAD_FILE_END)
{
if (m_uploadFile)
{
m_uploadFile.close();
}
DebugPrintf_P(PSTR("Upload: END, Size: %d\n"), upload.totalSize);
}
}
void FSWebServer::replyOK()
{
replyToCLient(OK, "");
}
void FSWebServer::replyToCLient(int msg_type = 0, const char *msg = "")
{
webserver->sendHeader("Access-Control-Allow-Origin", "*");
switch (msg_type)
{
case OK:
webserver->send(200, FPSTR(TEXT_PLAIN), "");
break;
case CUSTOM:
webserver->send(200, FPSTR(TEXT_PLAIN), msg);
break;
case NOT_FOUND:
webserver->send(404, FPSTR(TEXT_PLAIN), msg);
break;
case BAD_REQUEST:
webserver->send(400, FPSTR(TEXT_PLAIN), msg);
break;
case ERROR:
webserver->send(500, FPSTR(TEXT_PLAIN), msg);
break;
}
}
/*
Checks filename for character combinations that are not supported by FSBrowser (alhtough valid on SPIFFS).
Returns an empty String if supported, or detail of error(s) if unsupported
*/
void FSWebServer::checkForUnsupportedPath(String &filename, String &error)
{
if (!filename.startsWith("/"))
{
error += PSTR(" !! NO_LEADING_SLASH !! ");
}
if (filename.indexOf("//") != -1)
{
error += PSTR(" !! DOUBLE_SLASH !! ");
}
if (filename.endsWith("/"))
{
error += PSTR(" ! TRAILING_SLASH ! ");
}
DebugPrintln(filename);
DebugPrintln(error);
}
const char *FSWebServer::getContentType(const char *filename)
{
if (webserver->hasArg("download"))
return PSTR("application/octet-stream");
else if (strstr(filename, ".htm"))
return PSTR("text/html");
else if (strstr(filename, ".html"))
return PSTR("text/html");
else if (strstr(filename, ".css"))
return PSTR("text/css");
else if (strstr(filename, ".sass"))
return PSTR("text/css");
else if (strstr(filename, ".js"))
return PSTR("application/javascript");
else if (strstr(filename, ".png"))
return PSTR("image/png");
else if (strstr(filename, ".svg"))
return PSTR("image/svg+xml");
else if (strstr(filename, ".gif"))
return PSTR("image/gif");
else if (strstr(filename, ".jpg"))
return PSTR("image/jpeg");
else if (strstr(filename, ".ico"))
return PSTR("image/x-icon");
else if (strstr(filename, ".xml"))
return PSTR("text/xml");
else if (strstr(filename, ".pdf"))
return PSTR("application/x-pdf");
else if (strstr(filename, ".zip"))
return PSTR("application/x-zip");
else if (strstr(filename, ".gz"))
return PSTR("application/x-gzip");
return PSTR("text/plain");
}
// edit page, in usefull in some situation, but if you need to provide only a web interface, you can disable
#ifdef INCLUDE_EDIT_HTM
/*
Return the list of files in the directory specified by the "dir" query string parameter.
Also demonstrates the use of chuncked responses.
*/
void FSWebServer::handleFileList()
{
if (!webserver->hasArg("dir"))
{
return replyToCLient(BAD_REQUEST, "DIR ARG MISSING");
}
String path = webserver->arg("dir");
DebugPrintln("handleFileList: " + path);
if (path != "/" && !m_filesystem->exists(path))
{
return replyToCLient(BAD_REQUEST, "BAD PATH");
}
File root = m_filesystem->open(path, "r");
path = String();
String output;
output.reserve(256);
output = "[";
if (root.isDirectory())
{
File file = root.openNextFile();
while (file)
{
String filename = file.name();
if (filename.lastIndexOf("/") > -1)
{
filename.remove(0, filename.lastIndexOf("/") + 1);
}
if (output != "[")
{
output += ',';
}
output += "{\"type\":\"";
output += (file.isDirectory()) ? "dir" : "file";
output += "\",\"size\":\"";
output += file.size();
output += "\",\"name\":\"";
output += filename;
output += "\"}";
file = root.openNextFile();
}
}
output += "]";
webserver->send(200, "text/json", output);
}
/*
Handle the creation/rename of a new file
Operation | req.responseText
---------------+--------------------------------------------------------------
Create file | parent of created file
Create folder | parent of created folder
Rename file | parent of source file
Move file | parent of source file, or remaining ancestor
Rename folder | parent of source folder
Move folder | parent of source folder, or remaining ancestor
*/
void FSWebServer::handleFileCreate()
{
String path = webserver->arg("path");
if (path.isEmpty())
{
replyToCLient(BAD_REQUEST, PSTR("PATH ARG MISSING"));
return;
}
if (path == "/")
{
replyToCLient(BAD_REQUEST, PSTR("BAD PATH"));
return;
}
String src = webserver->arg("src");
if (src.isEmpty())
{
// No source specified: creation
DebugPrintf_P(PSTR("handleFileCreate: %s\n"), path.c_str());
if (path.endsWith("/"))
{
// Create a folder
path.remove(path.length() - 1);
if (!m_filesystem->mkdir(path))
{
replyToCLient(ERROR, PSTR("MKDIR FAILED"));
return;
}
}
else
{
// Create a file
File file = m_filesystem->open(path, "w");
if (file)
{
file.write(0);
file.close();
}
else
{
replyToCLient(ERROR, PSTR("CREATE FAILED"));
return;
}
}
replyToCLient(CUSTOM, path.c_str());
}
else
{
// Source specified: rename
if (src == "/")
{
replyToCLient(BAD_REQUEST, PSTR("BAD SRC"));
return;
}
if (!m_filesystem->exists(src))
{
replyToCLient(BAD_REQUEST, PSTR("BSRC FILE NOT FOUND"));
return;
}
DebugPrintf_P(PSTR("handleFileCreate: %s from %s\n"), path.c_str(), src.c_str());
if (path.endsWith("/"))
{
path.remove(path.length() - 1);
}
if (src.endsWith("/"))
{
src.remove(src.length() - 1);
}
if (!m_filesystem->rename(src, path))
{
replyToCLient(ERROR, PSTR("RENAME FAILED"));
return;
}
replyOK();
}
}
/*
Handle a file deletion request
Operation | req.responseText
---------------+--------------------------------------------------------------
Delete file | parent of deleted file, or remaining ancestor
Delete folder | parent of deleted folder, or remaining ancestor
*/
void FSWebServer::handleFileDelete()
{
String path = webserver->arg(0);
if (path.isEmpty() || path == "/")
{
replyToCLient(BAD_REQUEST, PSTR("BAD PATH"));
return;
}
DebugPrintf_P(PSTR("handleFileDelete: %s\n"), path.c_str());
if (!m_filesystem->exists(path))
{
replyToCLient(NOT_FOUND, PSTR(FILE_NOT_FOUND));
return;
}
// deleteRecursive(path);
File root = m_filesystem->open(path, "r");
// If it's a plain file, delete it
if (!root.isDirectory())
{
root.close();
m_filesystem->remove(path);
replyOK();
}
else
{
m_filesystem->rmdir(path);
replyOK();
}
}
/*
This specific handler returns the edit.htm (or a gzipped version) from the /edit folder.
If the file is not present but the flag INCLUDE_FALLBACK_INDEX_HTM has been set, falls back to the version
embedded in the program code.
Otherwise, fails with a 404 page with debug information
*/
void FSWebServer::handleGetEdit()
{
#ifdef INCLUDE_EDIT_HTM
webserver->sendHeader(PSTR("Content-Encoding"), "gzip");
webserver->send_P(200, "text/html", edit_htm_gz, sizeof(edit_htm_gz));
#else
replyToCLient(NOT_FOUND, PSTR("FILE_NOT_FOUND"));
#endif
}
/*
Return the FS type, status and size info
*/
void FSWebServer::handleStatus()
{
DebugPrintln(PSTR("handleStatus"));
size_t totalBytes = 1024;
size_t usedBytes = 0;
#ifdef ESP8266
FSInfo fs_info;
m_filesystem->info(fs_info);
totalBytes = fs_info.totalBytes;
usedBytes = fs_info.usedBytes;
#elif defined(ESP32)
totalBytes = LittleFS.totalBytes();
usedBytes = LittleFS.usedBytes();
#endif
String json;
json.reserve(128);
json = "{\"type\":\"Filesystem\", \"isOk\":";
if (m_fsOK)
{
json += PSTR("\"true\", \"totalBytes\":\"");
json += totalBytes;
json += PSTR("\", \"usedBytes\":\"");
json += usedBytes;
json += "\"";
}
else
json += "\"false\"";
json += PSTR(",\"unsupportedFiles\":\"\"}");
webserver->send(200, "application/json", json);
}
#endif // INCLUDE_EDIT_HTM

View File

@@ -0,0 +1,347 @@
#ifndef esp_fs_webserver_H
#define esp_fs_webserver_H
#include <Arduino.h>
#include <memory>
#include <typeinfo>
#include <base64.h>
//#include <FS.h>
#include <LittleFS.h>
#define INCLUDE_EDIT_HTM
#ifdef INCLUDE_EDIT_HTM
#include "edit_htm.h"
#endif
#define INCLUDE_SETUP_HTM
#ifdef INCLUDE_SETUP_HTM
#define ARDUINOJSON_USE_LONG_LONG 1
#include <ArduinoJson.h>
#include "setup_htm.h"
#endif
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h> // from Arduino core, OTA update via webbrowser
using WebServerClass = ESP8266WebServer;
using UpdateServerClass = ESP8266HTTPUpdateServer;
#elif defined(ESP32)
#include <esp_wifi.h>
#include <WebServer.h>
#include <WiFi.h>
#include <ESPmDNS.h>
#include <HTTPUpdateServer.h> // from Arduino core, OTA update via webbrowser
using WebServerClass = WebServer;
using UpdateServerClass = HTTPUpdateServer;
#endif
#include <DNSServer.h>
#ifndef DEBUG_ESP_PORT
#define DBG_OUTPUT_PORT Serial
#define DEBUG_MODE_WS false
#else
#define DBG_OUTPUT_PORT DEBUG_ESP_PORT
#endif
#if DEBUG_MODE_WS
#define DebugPrint(x) DBG_OUTPUT_PORT.print(x)
#define DebugPrintln(x) DBG_OUTPUT_PORT.println(x)
#define DebugPrintf(fmt, ...) DBG_OUTPUT_PORT.printf(fmt, ##__VA_ARGS__)
#define DebugPrintf_P(fmt, ...) DBG_OUTPUT_PORT.printf_P(fmt, ##__VA_ARGS__)
#else
#define DebugPrint(x)
#define DebugPrintln(x)
#define DebugPrintf(x, ...)
#define DebugPrintf_P(x, ...)
#endif
enum
{
MSG_OK,
CUSTOM,
NOT_FOUND,
BAD_REQUEST,
ERROR
};
#define TEXT_PLAIN "text/plain"
#define FS_INIT_ERROR "FS INIT ERROR"
#define FILE_NOT_FOUND "FileNotFound"
class FSWebServer
{
// using CallbackF = std::function<void(void)>;
public:
WebServerClass *webserver;
FSWebServer(fs::FS &fs, WebServerClass &server);
bool begin(const char *path = nullptr);
void run();
void addHandler(const Uri &uri, HTTPMethod method, WebServerClass::THandlerFunction fn);
void addHandler(const Uri &uri, WebServerClass::THandlerFunction handler);
void setCaptiveWebage(const char *url);
IPAddress setAPmode(const char *ssid, const char *psk);
IPAddress startWiFi(uint32_t timeout, const char *apSSID, const char *apPsw);
WebServerClass *getRequest();
#ifdef INCLUDE_SETUP_HTM
#define MIN_F -3.4028235E+38
#define MAX_F 3.4028235E+38
inline bool clearOptions()
{
File file = m_filesystem->open("/config.json", "r");
if (file)
{
file.close();
m_filesystem->remove("/config.json");
return true;
}
return false;
}
inline void addOptionBox(const char *boxTitle)
{
addOption("param-box", boxTitle, false);
}
inline void addHTML(const char *html, const char *id)
{
String elementId = "raw-html-";
elementId += id;
String trimmed = html;
removeWhiteSpaces(trimmed);
addOption(elementId.c_str(), trimmed.c_str(), false);
}
inline void addCSS(const char *css)
{
String trimmed = css;
removeWhiteSpaces(trimmed);
addOption("raw-css", trimmed.c_str(), false);
}
inline void addJavascript(const char *script)
{
// String trimmed = script;
// removeWhiteSpaces(trimmed);
addOption("raw-javascript", script, true);
}
void addDropdownList(const char *label, const char **array, size_t size);
// Only for backward-compatibility
template <typename T>
inline void addOption(fs::FS &fs, const char *label, T val, bool hidden = false)
{
addOption(label, val, hidden);
}
// Add custom option to config webpage (float values)
template <typename T>
inline void addOption(const char *label, T val, double d_min, double d_max, double step)
{
addOption(label, val, false, d_min, d_max, step);
}
// Add custom option to config webpage (type of parameter will be deduced from variable itself)
template <typename T>
inline void addOption(const char *label, T val, bool hidden = false,
double d_min = MIN_F, double d_max = MAX_F, double step = 1.0)
{
File file = m_filesystem->open("/config.json", "r");
int sz = file.size() * 1.33;
int docSize = max(sz, 2048);
DynamicJsonDocument doc((size_t)docSize);
if (file)
{
// If file is present, load actual configuration
DeserializationError error = deserializeJson(doc, file);
if (error)
{
DebugPrintln(F("Failed to deserialize file, may be corrupted"));
DebugPrintln(error.c_str());
file.close();
return;
}
file.close();
}
else
{
DebugPrintln(F("File not found, will be created new configuration file"));
}
numOptions++;
String key = label;
if (hidden)
key += "-hidden";
// Univoque key name
if (key.equals("param-box"))
{
key += numOptions;
}
if (key.equals("raw-javascript"))
{
key += numOptions;
}
// If key is present in json, we don't need to create it.
if (doc.containsKey(key.c_str()))
return;
// if min, max, step != from default, treat this as object in order to set other properties
if (d_min != MIN_F || d_max != MAX_F || step != 1.0)
{
JsonObject obj = doc.createNestedObject(key);
obj["value"] = static_cast<T>(val);
obj["min"] = d_min;
obj["max"] = d_max;
obj["step"] = step;
}
else
{
doc[key] = static_cast<T>(val);
}
file = m_filesystem->open("/config.json", "w");
if (serializeJsonPretty(doc, file) == 0)
{
DebugPrintln(F("Failed to write to file"));
}
file.close();
}
// Get current value for a specific custom option (true on success)
template <typename T>
bool getOptionValue(const char *label, T &var)
{
File file = m_filesystem->open("/config.json", "r");
DynamicJsonDocument doc(file.size() * 1.33);
if (file)
{
DeserializationError error = deserializeJson(doc, file);
if (error)
{
DebugPrintln(F("Failed to deserialize file, may be corrupted"));
DebugPrintln(error.c_str());
file.close();
return false;
}
file.close();
}
else
return false;
if (doc[label]["value"])
var = doc[label]["value"].as<T>();
else if (doc[label]["selected"])
var = doc[label]["selected"].as<T>();
else
var = doc[label].as<T>();
return true;
}
template <typename T>
bool saveOptionValue(const char *label, T val)
{
// Öffne die Datei im Lesemodus, um den Inhalt des Dokuments beizubehalten
File file = m_filesystem->open("/config.json", "r");
DynamicJsonDocument doc(file.size()* 1.33);
if (file)
{
// Deserialisiere das JSON-Dokument aus der Datei
DeserializationError error = deserializeJson(doc, file);
if (error)
{
DebugPrintln(F("Failed to deserialize file, may be corrupted"));
DebugPrintln(error.c_str());
file.close();
return false;
}
file.close();
}
// Füge den Schlüssel mit dem neuen Wert hinzu, falls er nicht vorhanden ist
if (!doc.containsKey(label))
{
doc[label] = val;
}
else
{
// Ändere den Wert mit dem Schlüssel "label"
JsonVariant option = doc[label];
option.set(val);
}
// Öffne die Datei im Schreibmodus und speichere das geänderte Dokument
file = m_filesystem->open("/config.json", "w");
if (!file)
return false;
serializeJsonPretty(doc, file);
file.close();
return true;
}
#endif
private:
char m_basePath[16];
UpdateServerClass m_httpUpdater;
DNSServer m_dnsServer;
fs::FS *m_filesystem;
File m_uploadFile;
bool m_fsOK = false;
bool m_apmode = false;
char *m_apWebpage = (char *)"/setup";
uint32_t m_timeout = 10000;
// Default handler for all URIs not defined above, use it to read files from filesystem
bool checkDir(char *dirname, uint8_t levels);
void doWifiConnection();
void doRestart();
void replyOK();
void getIpAddress();
void handleRequest();
#ifdef INCLUDE_SETUP_HTM
void removeWhiteSpaces(String &str);
void handleSetup();
uint8_t numOptions = 0;
#endif
void handleIndex();
bool handleFileRead(const String &path);
void handleFileUpload();
void replyToCLient(int msg_type, const char *msg);
void checkForUnsupportedPath(String &filename, String &error);
void setCrossOrigin();
void handleScanNetworks();
const char *getContentType(const char *filename);
bool captivePortal();
// edit page, in usefull in some situation, but if you need to provide only a web interface, you can disable
#ifdef INCLUDE_EDIT_HTM
void handleGetEdit();
void handleFileCreate();
void handleFileDelete();
void handleStatus();
void handleFileList();
#endif
};
#endif

View File

@@ -0,0 +1,163 @@
#define VAR_NAME(name) #name
#include <ArduinoJson.h>
#include <FS.h>
#ifndef linked_list_H
#define linked_list_H
#if DEBUG_MODE
#define DebugPrint(x) DBG_OUTPUT_PORT.print(x)
#define DebugPrintln(x) DBG_OUTPUT_PORT.println(x)
#define DebugPrintf(fmt, ...) DBG_OUTPUT_PORT.printf(fmt, ##__VA_ARGS__)
#define DebugPrintf_P(fmt, ...) DBG_OUTPUT_PORT.printf_P(fmt, ##__VA_ARGS__)
#else
#define DebugPrint(x)
#define DebugPrintln(x)
#define DebugPrintf(x, ...)
#define DebugPrintf_P(x, ...)
#endif
enum { CHAR, UCHAR, CHAR_PT, BOOL, INT, LONG, UINT, ULONG, FLOAT, DOUBLE, STRING};
////////////////////////////////////////////////////////////////
struct VarNode
{
uint8_t type;
void* var;
const char* key;
VarNode* next = nullptr;
};
////////////////////////////////////////////////////////////////
class VariableList
{
private:
VarNode* first = nullptr;
VarNode* last = nullptr;
public:
VariableList(){;}
template <class T>
void addItem(T& var, const char* key)
{
VarNode* node = new VarNode();
node->var = &var;
// node->key = VAR_NAME(var);
node->key = key;
node->type = TypeOf(var);
if (first == nullptr) {
first = node;
last = node;
return;
}
last->next = node;
last = node;
}
VarNode* getNode(const char* key)
{
VarNode* current = first;
while ( current != nullptr )
{
if (strcmp(current->key, key) == 0) {
return current;
}
current = current->next;
}
return nullptr;
}
bool saveValues(fs::FS *fs, const char* filename) {
File file = fs->open("/config.json", "w");
int sz = file.size() * 1.33;
int docSize = max(sz, 2048);
DynamicJsonDocument root((size_t)docSize);
if (!file)
{
DebugPrintln(F("File not found, will be created new configuration file"));
return false;
}
VarNode* current = first;
while ( current != nullptr )
{
switch (current->type) {
case BOOL: root[current->key] = *(bool*)current->var; break;
case CHAR: root[current->key] = *(signed char*)current->var; break;
case INT: root[current->key] = *(int*)current->var; break;
case LONG: root[current->key] = *(long*)current->var; break;
case UCHAR: root[current->key] = *(unsigned char*)current->var; break;
case UINT: root[current->key] = *(unsigned int*)current->var; break;
case ULONG: root[current->key] = *(unsigned long*)current->var; break;
case CHAR_PT: root[current->key] = (unsigned char*)current->var; break;
case FLOAT: root[current->key] = *(float*)current->var; break;
case DOUBLE: root[current->key] = *(double*)current->var; break;
case STRING: root[current->key] = *(String*)current->var; break;
}
current = current->next;
}
serializeJson(root, file);
file.close();
return true;
}
bool loadValues(fs::FS *fs, const char* filename) {
File file = fs->open("/config.json", "r");
DynamicJsonDocument doc(file.size() * 1.33);
if (file)
{
DeserializationError error = deserializeJson(doc, file);
if (error)
{
DebugPrintln(F("Failed to deserialize file, may be corrupted"));
DebugPrintln(error.c_str());
file.close();
return false;
}
file.close();
}
else
return false;
VarNode* current = first;
while ( current != nullptr )
{
switch (current->type) {
case BOOL: *(bool*)current->var = doc[current->key]; break;
case CHAR: *(signed char*)current->var = doc[current->key]; break;
case INT: *(int*)current->var = doc[current->key]; break;
case LONG: *(long*)current->var = doc[current->key]; break;
case UCHAR: *(unsigned char*)current->var = doc[current->key]; break;
case UINT: *(unsigned int*)current->var = doc[current->key]; break;
case ULONG: *(unsigned long*)current->var = doc[current->key]; break;
case CHAR_PT: strcpy((char*)current->var, doc[current->key]); break;
case FLOAT: *(float*)current->var = doc[current->key]; break;
case DOUBLE: *(double*)current->var = doc[current->key]; break;
case STRING: *(String*)current->var = doc[current->key].as<String>(); break;
}
current = current->next;
}
return true;
}
virtual inline uint8_t TypeOf(const bool&) { return BOOL; }
virtual inline uint8_t TypeOf(const char&) { return CHAR; }
virtual inline uint8_t TypeOf(const char*) { return CHAR_PT; }
virtual inline uint8_t TypeOf(const double&) { return DOUBLE; }
virtual inline uint8_t TypeOf(const float&) { return FLOAT; }
virtual inline uint8_t TypeOf(const int&) { return INT; }
virtual inline uint8_t TypeOf(const unsigned int&) { return UINT; }
virtual inline uint8_t TypeOf(const unsigned long&) { return ULONG; }
virtual inline uint8_t TypeOf(const unsigned char&) { return UCHAR; }
virtual inline uint8_t TypeOf(const String&) { return STRING; }
};
#endif

110
lib/webserver/src/setup.htm Normal file
View File

@@ -0,0 +1,110 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>SmartPusher</title>
<meta content="width=device-width, initial-scale=1" name=viewport />
<link href=style.css rel=stylesheet type=text/css />
</head>
<body class=body>
<main id=main-box>
<header class="ctn header">
<div class=title>
<label for="logo-file" class="svg-button">
<div id=svg-logo title='Click to upload your logo file'></div>
</label>
<h1 id=name-logo class=heading>SmartPusher</h1>
</div>
<div class=topnav id=top-nav>
<span id="nav-link">
<a id=set-wifi class="a-link active" data-box="wifi-box">WiFi Setup</a>
</span>
<a id=about target=_blank rel=noopener href=https://github.com/Blueforcer/SmartPusher/wiki>About</a>
<a class="a-link icon" id=hum-btn>
<div class=svg style=margin:-2px>
<svg id=svg-menu fill=currentColor viewBox="0 0 20 18"></svg>
</div>
</a>
</div>
</header>
<div id=wifi-box class="ctn opt-box">
<h2 class=heading-2>Connect to WiFi</h2>
<div id=wifi-table class=hide>
<table class=table>
<tbody id=wifi-list></tbody>
</table>
<br>
</div>
<div class=wifi-connect>
<form class=form>
<div class=tf-wrapper>
<label for=ssid class=input-label>SSID</label>
<input type=text placeholder="Enter your WiFI SSID name" id="ssid" />
</div>
<div class=tf-wrapper>
<label for=password class=input-label>Password</label>
<div class=show-hide-wrap id=show-hide-password>
<a class="show-hide w--current" id=show-pass>
<div class=svg><svg class=svg-e id=svg-eye viewBox="0 0 24 24"></svg></div>
</a>
<a class="show-hide" id=hide-pass>
<div class=svg><svg class=svg-e id=svg-no-eye viewBox="0 0 24 24"></svg></div>
</a>
</div>
<input type=password placeholder="Enter your WiFi password"
id=password autocomplete=current-password data-ms-member="password" />
</div>
</form>
</div>
<div class="btn-bar ">
<label class="toggle lbl-wifi">
<hr>
<span class=toggle-label>Store WiFi credentials</span>
<input id=persistent type=checkbox class="t-check" checked>
<div class=toggle-switch></div>
</label>
<a id=scan-wifi class="btn">
<div class=svg><svg id=svg-scan fill=currentColor viewBox="0 0 24 24"></svg></div>
<span>Scan WiFi networks</span>
</a>
<a id=connect-wifi class="btn">
<div class=svg><svg id=svg-connect fill=currentColor viewBox="0 0 24 24"></svg></div>
<span>Connect to <span id=ssid-name>SSID</span>
</a>
</div>
</div>
<div id=btn-box class="btn-bar hide">
<label class="toggle">
<hr>
</label>
<a id=restart class="btn">
<div class=svg><svg id=svg-restart fill=currentColor viewBox="0 0 24 24"></svg></div>
<span>Restart ESP</span>
</a>
<a id=save-params class="btn">
<div class=svg><svg id=svg-save fill=currentColor viewBox="0 0 24 24"></svg></div>
<span>Save configuration</span>
</a>
</div>
</main>
<div class="loader hide" id=loader>Loading...</div>
<details id=modal-message>
<summary></summary>
<div class=d-modal>
<a onclick=closeModalMessage()>
<div class=d-modal-close>
<svg id=close-modal width=14 height=14 viewBox="0 0 14 14" fill=none></svg>
</div>
</a>
<div class=d-modal-title><h2 id=message-title></h2></div>
<div class=d-modal-content><p id=message-body></p></div>
<div class=btn-bar>
<a id=ok-modal class="btn hide" onclick=closeModalMessage(true)><span>OK</span></a>
<a id=close-modal class="btn" onclick=closeModalMessage(false)><span>Close</span></a>
</div>
</div>
</details>
<script src=app.js></script>
</body>
</html>

View File

@@ -0,0 +1,526 @@
#define SETUP_HTML_SIZE 8365
const char SETUP_HTML[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xed, 0x7d, 0xe9, 0x77, 0xdb, 0x46,
0x96, 0xef, 0xf7, 0x39, 0xa7, 0xff, 0x07, 0x84, 0x59, 0x2c, 0x8e, 0x01, 0x08, 0x0b, 0x09, 0x70,
0x31, 0x95, 0x76, 0x2b, 0xce, 0x71, 0xde, 0x93, 0x13, 0x9f, 0x76, 0xda, 0x3d, 0xd3, 0x39, 0x3e,
0xd3, 0x10, 0x59, 0x14, 0xd1, 0x06, 0x09, 0x0e, 0x00, 0x49, 0x96, 0xd9, 0xfc, 0xdf, 0xdf, 0xef,
0xde, 0xaa, 0xc2, 0x46, 0x90, 0x52, 0x7a, 0x92, 0xf7, 0x69, 0x62, 0x1b, 0x4b, 0x2d, 0xb7, 0xee,
0x7e, 0x6f, 0x2d, 0x60, 0x5e, 0x7c, 0xf1, 0xdd, 0x4f, 0x97, 0x3f, 0xff, 0xe7, 0xdb, 0x57, 0xc6,
0xaa, 0x58, 0x27, 0x17, 0x7f, 0xf8, 0xb7, 0x17, 0xea, 0x4e, 0x4f, 0x22, 0x5a, 0xe0, 0xc9, 0xc0,
0x7f, 0x2f, 0xd6, 0xa2, 0x88, 0x8c, 0xf9, 0x2a, 0xca, 0x72, 0x51, 0xcc, 0x6e, 0x8b, 0xa5, 0x35,
0x32, 0xce, 0x75, 0x5d, 0x11, 0x17, 0x89, 0xb8, 0x78, 0xf9, 0xd7, 0x9f, 0xff, 0xfc, 0xc3, 0x7f,
0x18, 0x57, 0xf1, 0xcd, 0xaa, 0x78, 0x71, 0x2e, 0xcb, 0x1a, 0x9d, 0xd3, 0x4d, 0x21, 0x36, 0xc5,
0xac, 0x77, 0x1f, 0x2f, 0x8a, 0xd5, 0x6c, 0x21, 0xee, 0xe2, 0xb9, 0xb0, 0xf8, 0xc5, 0x34, 0xe2,
0x4d, 0x5c, 0xc4, 0x51, 0x62, 0xe5, 0xf3, 0x28, 0x11, 0x33, 0xb7, 0x67, 0x6c, 0xa2, 0xb5, 0x98,
0xdd, 0xc5, 0xe2, 0x7e, 0x9b, 0x66, 0x45, 0x35, 0x54, 0x5e, 0x3c, 0x00, 0xac, 0x1d, 0x6f, 0xb6,
0xc0, 0x21, 0x4e, 0xc4, 0x6e, 0x25, 0x68, 0xbc, 0x89, 0xeb, 0x6c, 0x3f, 0x4d, 0xd3, 0x6d, 0x34,
0x8f, 0x8b, 0x87, 0x89, 0x33, 0x4d, 0xef, 0x44, 0xb6, 0x4c, 0xd2, 0xfb, 0xc9, 0x2a, 0x5e, 0x2c,
0xc4, 0x66, 0xba, 0x4d, 0x73, 0xc0, 0x4f, 0x37, 0x93, 0xe8, 0x3a, 0x4f, 0x93, 0xdb, 0x42, 0x4c,
0x79, 0x5c, 0xd9, 0xed, 0xb3, 0x15, 0x6f, 0x16, 0xe2, 0xd3, 0xc4, 0x72, 0xf7, 0x76, 0x92, 0x46,
0x0b, 0x91, 0x99, 0xea, 0x3e, 0x89, 0x96, 0x45, 0xed, 0xed, 0x5a, 0x2c, 0xd3, 0x4c, 0xec, 0xac,
0x7b, 0x71, 0xfd, 0x31, 0x2e, 0xac, 0x68, 0x13, 0xaf, 0x23, 0x82, 0x6a, 0x01, 0x93, 0xc4, 0x5a,
0xa7, 0x0b, 0x31, 0xb9, 0x4e, 0x8b, 0xd5, 0xf4, 0x68, 0xc5, 0x41, 0xcf, 0x09, 0x41, 0x0e, 0x0d,
0xd7, 0x1e, 0xe5, 0x86, 0x88, 0x72, 0x01, 0x4c, 0xac, 0xf4, 0xb6, 0x00, 0x3b, 0x96, 0xc4, 0x11,
0x31, 0x7d, 0x7a, 0xcb, 0xeb, 0x34, 0x03, 0x8e, 0x56, 0x16, 0x2d, 0xe2, 0xdb, 0x7c, 0x32, 0x74,
0xbe, 0x9e, 0x2a, 0xd6, 0x78, 0x62, 0xad, 0xa8, 0xc5, 0x93, 0xa6, 0xb0, 0x83, 0x88, 0x85, 0x48,
0xa2, 0x87, 0x89, 0x65, 0xbb, 0x41, 0x3e, 0xed, 0x2e, 0x9d, 0xa7, 0x49, 0x9a, 0x4d, 0xbe, 0xf4,
0x7d, 0x7f, 0xba, 0x84, 0x30, 0xad, 0x3c, 0xfe, 0x2c, 0x24, 0x0b, 0xd7, 0x51, 0x76, 0x03, 0x84,
0x12, 0xb1, 0x2c, 0x26, 0xd1, 0x6d, 0x91, 0xea, 0x82, 0x8c, 0x31, 0xe0, 0x92, 0x52, 0x04, 0x19,
0x20, 0x16, 0xf1, 0x9d, 0x98, 0x16, 0xe2, 0x53, 0xc1, 0xac, 0xdf, 0x14, 0x13, 0x6b, 0x8c, 0xff,
0x80, 0xa8, 0x46, 0xab, 0xc8, 0xa2, 0x4d, 0x0e, 0x6e, 0xaf, 0x27, 0xfc, 0x84, 0x1e, 0xe2, 0x6f,
0x67, 0x4e, 0x7f, 0x6a, 0xad, 0xf3, 0xa3, 0x75, 0xc7, 0xca, 0xb5, 0x7c, 0x31, 0xc2, 0xfe, 0xa4,
0x60, 0x95, 0x86, 0x4e, 0x7a, 0xbd, 0x0e, 0x85, 0x29, 0xd2, 0xed, 0xc4, 0xd9, 0x3f, 0xaa, 0x0a,
0x9a, 0x5f, 0xbe, 0xd7, 0xc5, 0x45, 0x2a, 0x65, 0x26, 0x59, 0x03, 0x7b, 0x58, 0x49, 0x43, 0xa2,
0xb3, 0xe3, 0x1a, 0x59, 0xf1, 0x47, 0x0d, 0xf9, 0xa3, 0x78, 0x58, 0x66, 0xb0, 0x85, 0xdc, 0x60,
0x05, 0xd8, 0x39, 0x5f, 0x9b, 0x23, 0xfc, 0x2b, 0xd2, 0xdd, 0x75, 0xfa, 0xc9, 0xca, 0x57, 0xd1,
0x02, 0x5a, 0xee, 0x18, 0x1e, 0xf5, 0x32, 0x1c, 0xc3, 0x72, 0x6d, 0x1f, 0xdd, 0x07, 0xce, 0xd7,
0xdd, 0xf5, 0xce, 0x7e, 0xff, 0xc7, 0xdf, 0x1e, 0x64, 0x91, 0x4d, 0x56, 0x64, 0x72, 0x3b, 0xe8,
0x7b, 0x41, 0xdc, 0x61, 0xb9, 0x6f, 0x44, 0x9e, 0x9f, 0x8d, 0x86, 0x5f, 0xf7, 0xf7, 0xf6, 0x82,
0x8c, 0x20, 0x4a, 0x76, 0xd7, 0xd1, 0xfc, 0xe3, 0x4d, 0x96, 0xde, 0x6e, 0x16, 0x96, 0x54, 0xa6,
0x15, 0xc4, 0x74, 0xe6, 0x98, 0x18, 0xde, 0x75, 0x70, 0xb1, 0xc7, 0xc3, 0xbe, 0xd2, 0xe4, 0x89,
0xbb, 0xfd, 0x64, 0x80, 0xf7, 0xf1, 0xc2, 0x20, 0x8d, 0xc3, 0x7f, 0x41, 0x5b, 0xc9, 0x59, 0xf5,
0x1a, 0x38, 0xf9, 0xe8, 0x33, 0xc2, 0xbf, 0xec, 0xe6, 0x9a, 0xc1, 0xe2, 0x8f, 0xed, 0x0d, 0xfa,
0xd3, 0x65, 0x22, 0x3e, 0x59, 0x8b, 0x38, 0x13, 0x73, 0x16, 0x2a, 0xc6, 0xbe, 0x5d, 0x6f, 0xa4,
0x24, 0xc8, 0x52, 0xd6, 0xd1, 0x27, 0x4b, 0x59, 0xcb, 0xc0, 0xb9, 0x5b, 0xf1, 0xbb, 0x34, 0x99,
0x31, 0x6a, 0x59, 0x4f, 0xa3, 0x24, 0xbe, 0x81, 0x11, 0xa2, 0x07, 0x6b, 0xc2, 0x80, 0xca, 0x0f,
0xf5, 0xed, 0xcc, 0x02, 0x38, 0x93, 0x2e, 0x7d, 0x6d, 0x73, 0x60, 0x52, 0x53, 0x03, 0x15, 0x2f,
0x4c, 0xfd, 0x60, 0xcd, 0x93, 0x34, 0x17, 0xbb, 0x45, 0x9c, 0x6f, 0x49, 0x49, 0x08, 0xd5, 0x43,
0xf5, 0xdb, 0xb7, 0x5a, 0x33, 0x3a, 0x16, 0xec, 0x7e, 0x9d, 0x4f, 0xe6, 0xd0, 0x59, 0x91, 0x69,
0xeb, 0x74, 0x5d, 0x77, 0xe4, 0x85, 0xd3, 0xf9, 0x6d, 0x96, 0xe3, 0x75, 0x9b, 0xc6, 0x5c, 0xa9,
0xa9, 0x23, 0x99, 0x4d, 0xff, 0x71, 0x9b, 0x17, 0xf1, 0xf2, 0xc1, 0xd2, 0xfa, 0xae, 0x00, 0x48,
0x63, 0x75, 0xa4, 0xa6, 0x2b, 0xf4, 0x95, 0x9a, 0xea, 0xc1, 0xd9, 0xab, 0xef, 0x9a, 0x23, 0x6d,
0xa3, 0xc5, 0x22, 0xde, 0xdc, 0x4c, 0x5c, 0xd6, 0x07, 0xf2, 0x36, 0x87, 0xa6, 0x2e, 0x81, 0xc1,
0xb7, 0xcf, 0xcf, 0x48, 0xce, 0x86, 0x65, 0x30, 0xe0, 0x7e, 0x8d, 0x2c, 0x89, 0xcb, 0x4e, 0x49,
0x98, 0x70, 0xa8, 0x29, 0x80, 0x70, 0xe8, 0x4f, 0xe5, 0xd6, 0xa5, 0x47, 0x51, 0x03, 0xb3, 0x5b,
0x43, 0x87, 0x4d, 0x74, 0x77, 0xa8, 0x60, 0xec, 0xad, 0x5a, 0xbe, 0x11, 0x5a, 0x03, 0x28, 0x51,
0x31, 0x61, 0x8a, 0x4b, 0x3f, 0x09, 0xc5, 0x31, 0x0f, 0x22, 0x87, 0xc4, 0x7c, 0x09, 0x4b, 0x54,
0x18, 0xea, 0xa1, 0x8c, 0x48, 0xf3, 0x61, 0xe9, 0xd1, 0x9f, 0xa9, 0x16, 0xe0, 0x75, 0x92, 0xce,
0x3f, 0xaa, 0x01, 0x58, 0x5f, 0x6a, 0xbe, 0x32, 0xc0, 0xd0, 0x1a, 0x6d, 0xa0, 0x61, 0xb0, 0x06,
0xd7, 0xf4, 0x4b, 0x49, 0x82, 0x4b, 0x16, 0x62, 0x9e, 0x66, 0xd2, 0xf7, 0x6f, 0xd2, 0x8d, 0xa8,
0xc6, 0x55, 0xb6, 0x76, 0x48, 0xea, 0x62, 0xb1, 0xd0, 0x5a, 0xe0, 0x38, 0x4e, 0xd5, 0xc1, 0x8e,
0xe6, 0x24, 0x85, 0x8e, 0x1e, 0xc3, 0x60, 0xee, 0x8c, 0x1c, 0xdd, 0x69, 0xb9, 0x5c, 0x96, 0x9d,
0xec, 0x18, 0xf4, 0x96, 0x4a, 0xc9, 0x08, 0xfc, 0xbb, 0xb4, 0xff, 0xf8, 0x33, 0x61, 0xaf, 0x58,
0x8a, 0x12, 0x72, 0x62, 0x37, 0xe9, 0x4e, 0x07, 0x54, 0xe7, 0x6b, 0x14, 0x5c, 0x27, 0xb0, 0x9f,
0x65, 0xbc, 0xd3, 0xb4, 0x3a, 0x75, 0x22, 0x99, 0xeb, 0x7b, 0x4a, 0x33, 0x76, 0xcc, 0x9a, 0x65,
0xb4, 0x8e, 0x93, 0x87, 0x49, 0x0e, 0x1b, 0xb2, 0x72, 0x91, 0xc5, 0xcb, 0xfd, 0x02, 0xf9, 0x42,
0x9c, 0xe4, 0x26, 0x25, 0x20, 0x70, 0xd3, 0xeb, 0x28, 0xde, 0x98, 0xf9, 0xed, 0x1a, 0x41, 0xe5,
0x61, 0xd7, 0x60, 0x33, 0xd0, 0x8d, 0xae, 0xa1, 0x91, 0x0a, 0x1b, 0xd0, 0x91, 0x44, 0xdb, 0x5c,
0x4c, 0xf4, 0x83, 0x96, 0x7c, 0x4e, 0x99, 0x01, 0xe3, 0x21, 0x03, 0x93, 0x54, 0xa0, 0xd2, 0xc4,
0xf7, 0xd1, 0x21, 0x6f, 0xd8, 0xa6, 0xb7, 0x51, 0x46, 0x22, 0x8f, 0x26, 0x92, 0x83, 0xa6, 0xe6,
0x3d, 0x22, 0x6f, 0x12, 0x6f, 0x04, 0x02, 0xc2, 0xb5, 0xa4, 0xe1, 0x5e, 0xea, 0x50, 0x08, 0xb6,
0xaf, 0xdc, 0x5d, 0x25, 0x71, 0x1f, 0x4a, 0xb5, 0x5f, 0x79, 0xb5, 0x12, 0x6f, 0x40, 0x25, 0x59,
0xc5, 0x9a, 0xbd, 0xcc, 0x66, 0xac, 0x24, 0xba, 0x16, 0x1d, 0x1e, 0x92, 0xa4, 0xd2, 0xe1, 0x12,
0x17, 0xf3, 0xc5, 0x5c, 0x0c, 0x5b, 0x9a, 0x1d, 0xb0, 0x3f, 0x2c, 0x8a, 0x74, 0x3d, 0xb1, 0x42,
0x3c, 0x6b, 0x65, 0x70, 0x87, 0xde, 0xd8, 0x2f, 0x15, 0x34, 0xde, 0x10, 0xee, 0x96, 0xd2, 0xd3,
0x4a, 0x39, 0x7d, 0x9b, 0x2d, 0xa3, 0x46, 0xce, 0xd0, 0x71, 0xa4, 0x93, 0x04, 0x15, 0x53, 0xee,
0xa4, 0xd3, 0xad, 0xb0, 0x0a, 0xfa, 0x6a, 0x40, 0x47, 0x2b, 0xb6, 0xcc, 0x02, 0x6a, 0x9a, 0xae,
0xb2, 0x00, 0xea, 0x72, 0xe8, 0x19, 0xb4, 0x6b, 0xf4, 0xf6, 0xcc, 0x85, 0x49, 0x19, 0x51, 0x21,
0x20, 0xca, 0x9e, 0xcc, 0xee, 0x62, 0x2d, 0x90, 0x23, 0xb5, 0xcb, 0x74, 0x7e, 0x9b, 0x1f, 0xab,
0x94, 0x22, 0xd4, 0xc5, 0xb5, 0xf8, 0x11, 0x6f, 0x90, 0xdc, 0x52, 0x44, 0xc3, 0x1f, 0x1f, 0x96,
0x69, 0x10, 0xef, 0xbf, 0x88, 0xd7, 0x94, 0x82, 0x46, 0x50, 0x03, 0x86, 0xf7, 0x4b, 0xf1, 0xb0,
0x15, 0xb3, 0xf9, 0x4a, 0xcc, 0x3f, 0xa2, 0xeb, 0x87, 0x6e, 0x9b, 0x98, 0x56, 0xd2, 0xad, 0x75,
0xda, 0xdc, 0xae, 0xaf, 0x45, 0xf6, 0xc1, 0xac, 0x15, 0x6d, 0xa3, 0x3c, 0xbf, 0x47, 0xb7, 0x46,
0x21, 0xd9, 0xca, 0x07, 0x33, 0x17, 0x09, 0xc2, 0xd5, 0xee, 0x50, 0xf4, 0xf3, 0xf9, 0xbc, 0x53,
0xee, 0xb5, 0x38, 0x48, 0xad, 0x3d, 0xfc, 0x73, 0x64, 0x24, 0xf4, 0x3c, 0xc7, 0xe4, 0x7f, 0x3e,
0xe2, 0x21, 0x22, 0x6c, 0xcb, 0x23, 0x95, 0xa1, 0xaf, 0x26, 0x33, 0x16, 0xa2, 0x57, 0x2f, 0x61,
0x97, 0xcc, 0xfe, 0x8a, 0x2c, 0x43, 0x8a, 0xb1, 0xb2, 0xbb, 0x34, 0x33, 0x6c, 0x4f, 0xa6, 0xa6,
0x66, 0x85, 0x4a, 0x59, 0x36, 0xad, 0xb9, 0x07, 0x29, 0x96, 0x09, 0x74, 0x71, 0x2e, 0x56, 0x69,
0x42, 0xd9, 0xa8, 0x76, 0x47, 0x82, 0xfe, 0xa8, 0x06, 0xca, 0xcb, 0xd5, 0x46, 0x98, 0xd4, 0xc3,
0xfa, 0xa8, 0x7f, 0x48, 0xf2, 0xa0, 0x83, 0x64, 0x6f, 0x8c, 0xac, 0xa2, 0xaf, 0x60, 0x4a, 0xbd,
0x90, 0x9c, 0x95, 0x2f, 0xcd, 0x01, 0xbe, 0xf4, 0x47, 0xe3, 0x91, 0x98, 0x4f, 0x2b, 0xfb, 0xb6,
0xe7, 0xc5, 0x46, 0x67, 0x8b, 0xf4, 0xd8, 0x4e, 0x15, 0x8d, 0x5e, 0x69, 0x57, 0xec, 0x8a, 0xa6,
0x37, 0x59, 0xcc, 0xa6, 0x8b, 0x04, 0xc3, 0x12, 0x9b, 0xc5, 0xc4, 0x6b, 0x94, 0xe4, 0x45, 0x94,
0xc1, 0x7c, 0x64, 0x59, 0x96, 0xde, 0xd7, 0x9b, 0xd0, 0xab, 0xaa, 0xe7, 0x61, 0xcd, 0x6a, 0xec,
0xdd, 0x3c, 0x11, 0x51, 0xc6, 0x93, 0x08, 0xae, 0x52, 0xf1, 0x5f, 0x63, 0x41, 0xee, 0x4d, 0x58,
0x11, 0xbb, 0x8d, 0x69, 0x47, 0x6a, 0xf0, 0x68, 0xda, 0x35, 0xfa, 0x5d, 0xb2, 0xae, 0x76, 0x44,
0x6c, 0xe4, 0x60, 0xa0, 0x56, 0x16, 0xdd, 0x67, 0xd1, 0x76, 0x42, 0x97, 0x63, 0x79, 0x89, 0x72,
0xd9, 0x34, 0xae, 0xa1, 0x26, 0x17, 0x65, 0x7a, 0x56, 0xd7, 0x59, 0xd9, 0x82, 0x4a, 0xf6, 0xcb,
0x34, 0x25, 0xae, 0xd5, 0xf4, 0xdc, 0x2b, 0x1d, 0x96, 0xd4, 0xf3, 0x83, 0xa0, 0xbb, 0xff, 0x32,
0xba, 0x86, 0xd8, 0xb5, 0x2a, 0x2e, 0x7c, 0xfa, 0xb3, 0xb7, 0xaf, 0xd3, 0xc5, 0x43, 0xc3, 0x29,
0x27, 0xf1, 0xb6, 0x6e, 0xe8, 0x87, 0xfe, 0x5a, 0x2c, 0x96, 0xce, 0xb2, 0x9d, 0x73, 0xb8, 0xa7,
0x6d, 0x4b, 0x7a, 0x48, 0x2a, 0x42, 0x44, 0xe3, 0x1c, 0xab, 0x43, 0x8a, 0x8d, 0x0c, 0x91, 0x2e,
0xd0, 0xa3, 0x6e, 0x96, 0xed, 0x6d, 0x8a, 0x9c, 0x04, 0xd8, 0x6b, 0x84, 0xa7, 0x81, 0xe3, 0x74,
0x10, 0x6e, 0x53, 0x0e, 0x6b, 0xd6, 0xba, 0x3c, 0x0d, 0x4f, 0xea, 0xb5, 0x2b, 0x1d, 0x3a, 0x14,
0xb7, 0x88, 0xe7, 0xe0, 0x17, 0xf4, 0xf6, 0xfa, 0x16, 0x11, 0x61, 0xd3, 0x95, 0x8b, 0x49, 0xeb,
0x52, 0xaa, 0xe6, 0x74, 0xe4, 0x65, 0xb5, 0x98, 0xd7, 0xca, 0x60, 0x5b, 0xd1, 0x8b, 0x99, 0x70,
0x4c, 0x61, 0x10, 0x95, 0x54, 0xfa, 0x8a, 0x34, 0xbd, 0xa1, 0x1d, 0xee, 0x90, 0x50, 0x07, 0x92,
0xd2, 0xbd, 0x28, 0x54, 0x1f, 0x99, 0xbd, 0xa0, 0xb9, 0x75, 0x1d, 0x65, 0xbb, 0xba, 0x21, 0xdf,
0x40, 0x69, 0x29, 0x46, 0x54, 0xa6, 0x4b, 0x25, 0xcc, 0xac, 0x27, 0xda, 0x66, 0x5e, 0x64, 0xa2,
0x98, 0xaf, 0x0e, 0xc5, 0x7a, 0xc2, 0x22, 0x64, 0xc2, 0xaa, 0x02, 0x2f, 0x39, 0xe4, 0xba, 0x74,
0xb4, 0xfe, 0x2c, 0x19, 0xc0, 0x16, 0x04, 0xd5, 0x87, 0x63, 0xc8, 0xec, 0x5e, 0xca, 0x11, 0x6b,
0x21, 0xf0, 0xa0, 0x8c, 0xb1, 0x29, 0x0b, 0x31, 0xeb, 0xa6, 0x82, 0x7a, 0xc3, 0x0a, 0xdd, 0x83,
0x79, 0x55, 0x33, 0x31, 0x60, 0xd3, 0x3b, 0x36, 0x25, 0x90, 0xf9, 0x62, 0xbe, 0x02, 0xff, 0x90,
0x70, 0x77, 0xa5, 0xa8, 0xa4, 0x0a, 0xcd, 0x31, 0xdb, 0x19, 0x4b, 0xe5, 0x0e, 0x5a, 0xd0, 0x98,
0x0f, 0x3b, 0x85, 0x06, 0x7b, 0x8e, 0x96, 0x4e, 0x55, 0xeb, 0x15, 0x87, 0xf3, 0x7d, 0xa5, 0xea,
0x5f, 0x97, 0xd3, 0x3d, 0x9d, 0xa9, 0x0c, 0x30, 0xc2, 0xdd, 0x4d, 0x73, 0xbe, 0xd6, 0x58, 0xee,
0x60, 0x5b, 0x57, 0xb3, 0x3f, 0x96, 0x08, 0x9a, 0x5b, 0x62, 0x57, 0x93, 0x1a, 0x2b, 0xa1, 0xb2,
0xb7, 0x5d, 0x7d, 0xed, 0xa4, 0xbe, 0x98, 0x52, 0x01, 0x43, 0x5b, 0x50, 0x63, 0x56, 0x84, 0xd9,
0xf7, 0x96, 0x05, 0x52, 0x28, 0x37, 0x6d, 0xa6, 0xe8, 0xc8, 0xde, 0x6f, 0x6e, 0x68, 0x86, 0x76,
0xd2, 0x76, 0xa4, 0x3f, 0xe6, 0x01, 0xcb, 0x84, 0x98, 0x72, 0x1e, 0x29, 0xa9, 0x6a, 0x7a, 0xd2,
0x90, 0x91, 0x84, 0x6c, 0xe5, 0xf7, 0x31, 0x94, 0xb6, 0x26, 0xa7, 0x49, 0x47, 0x3e, 0xc2, 0x59,
0x45, 0xe7, 0xa0, 0x2a, 0xd5, 0xf0, 0xbb, 0x75, 0xa2, 0x9e, 0x59, 0x94, 0x03, 0x20, 0x87, 0x18,
0xe6, 0x53, 0xd8, 0x27, 0xfc, 0x0b, 0x26, 0x8a, 0xd2, 0x75, 0xad, 0x31, 0x3b, 0x4b, 0xb4, 0x12,
0x0d, 0x47, 0xac, 0xf7, 0x75, 0x04, 0x75, 0xc8, 0x6e, 0x16, 0x1e, 0xac, 0xf3, 0xb4, 0x7b, 0xa9,
0x06, 0x35, 0xea, 0x08, 0xf7, 0x28, 0xb3, 0x6e, 0x88, 0x32, 0xf4, 0x39, 0x73, 0x47, 0xce, 0x42,
0xdc, 0x98, 0xa4, 0x96, 0x86, 0x63, 0x7e, 0x29, 0x84, 0xe8, 0x77, 0x2c, 0xbd, 0x35, 0xc2, 0x23,
0xb3, 0xb6, 0x1d, 0x1e, 0x87, 0xed, 0xf0, 0xa8, 0x67, 0xa1, 0x03, 0x4a, 0xb5, 0x79, 0x21, 0x68,
0xdb, 0xb1, 0x0e, 0x20, 0xb5, 0xb1, 0x99, 0x84, 0x51, 0x6b, 0xc9, 0x24, 0xa5, 0x74, 0x83, 0x8a,
0x1d, 0xd2, 0xb3, 0x19, 0xff, 0x53, 0x32, 0x71, 0xeb, 0x3f, 0x4e, 0xd4, 0x10, 0xbe, 0x12, 0xf3,
0x64, 0x4a, 0x8d, 0x27, 0x7c, 0x15, 0x8b, 0xe7, 0x27, 0xf4, 0x46, 0x4e, 0x3e, 0x1f, 0xeb, 0xa2,
0x91, 0x65, 0x9e, 0xf8, 0xd2, 0xc3, 0xc9, 0x0e, 0xbb, 0x43, 0xee, 0xdc, 0xc5, 0x79, 0x7c, 0x1d,
0x27, 0xb4, 0x08, 0x2c, 0xe7, 0xef, 0xa5, 0x80, 0xe5, 0xec, 0xaa, 0x6e, 0x6b, 0xc3, 0x6e, 0x15,
0x24, 0xa7, 0x8a, 0x41, 0xfe, 0xb8, 0x16, 0x8b, 0x38, 0x32, 0xf2, 0x79, 0x26, 0xc4, 0xc6, 0x88,
0xa0, 0x86, 0x67, 0xb5, 0xb4, 0x63, 0x0c, 0xd2, 0xfb, 0x3b, 0xce, 0xc4, 0xda, 0x41, 0xc1, 0x3d,
0x08, 0x0a, 0xca, 0xa8, 0x75, 0xe7, 0x90, 0x16, 0x1a, 0xea, 0x39, 0xcc, 0xf0, 0xeb, 0x69, 0x7a,
0xfd, 0x0f, 0xb8, 0x50, 0x6b, 0x19, 0x23, 0x86, 0x41, 0x39, 0x31, 0xdf, 0xad, 0x16, 0x22, 0x98,
0x26, 0xe8, 0xfa, 0x01, 0xae, 0x2a, 0x49, 0xa4, 0x89, 0x36, 0x05, 0x88, 0x0d, 0xcd, 0x16, 0x9e,
0x14, 0xba, 0x4f, 0x13, 0x17, 0x06, 0x21, 0x13, 0x77, 0x1c, 0xae, 0x7b, 0x08, 0xd7, 0x7d, 0x1c,
0x6e, 0xe0, 0x8c, 0x18, 0xae, 0x8e, 0xa6, 0x27, 0x63, 0x87, 0x8e, 0x6d, 0xe5, 0xc2, 0x4e, 0x33,
0xa6, 0x54, 0xce, 0xa9, 0x8c, 0x57, 0xb4, 0xd2, 0x1e, 0xdd, 0x45, 0x71, 0x42, 0x59, 0x78, 0x6d,
0x91, 0xa6, 0xbe, 0xdc, 0x52, 0x87, 0x68, 0x44, 0x70, 0x99, 0xc5, 0x99, 0x5a, 0x1b, 0xe9, 0x1f,
0xf8, 0x51, 0xb5, 0x74, 0xd2, 0x58, 0x06, 0xa9, 0x2f, 0xed, 0xc8, 0x55, 0x8c, 0x47, 0x17, 0x65,
0xaa, 0x4c, 0x7b, 0x14, 0x7e, 0x6d, 0x3a, 0x7d, 0x9d, 0xe1, 0x0c, 0x23, 0xfa, 0xa3, 0xfb, 0xdb,
0x99, 0xc8, 0xb7, 0x29, 0x0c, 0xfa, 0x4e, 0xec, 0x3a, 0xe4, 0x7c, 0xd0, 0x48, 0x2d, 0xcf, 0x1c,
0x8b, 0x5a, 0x8e, 0x5e, 0xad, 0x3e, 0xec, 0x18, 0x75, 0x12, 0x43, 0x44, 0xb7, 0xd7, 0x39, 0x65,
0xd4, 0xb1, 0x8a, 0x78, 0xf3, 0xd0, 0x64, 0xce, 0x69, 0x31, 0x0f, 0xc2, 0x31, 0x89, 0xb9, 0xb9,
0x0a, 0xc2, 0x7c, 0xe7, 0x54, 0xba, 0xa9, 0xa0, 0x87, 0xfa, 0x59, 0x8b, 0x8c, 0xc8, 0x44, 0x6b,
0xda, 0xe0, 0x96, 0x49, 0xe7, 0xd1, 0x54, 0xd5, 0x69, 0x01, 0x93, 0xb3, 0xb7, 0x5d, 0x33, 0x3f,
0xa8, 0xa6, 0xe6, 0x86, 0x54, 0xda, 0x17, 0xe7, 0x72, 0x53, 0xe9, 0x0f, 0xff, 0xf6, 0xe2, 0x5c,
0xed, 0x78, 0xe1, 0x91, 0x90, 0x35, 0xe6, 0x09, 0xa6, 0xe7, 0x33, 0x7a, 0x2c, 0x77, 0xb2, 0x60,
0x9a, 0x46, 0xbc, 0x98, 0xd1, 0x9d, 0xf2, 0x26, 0x55, 0xce, 0x75, 0x72, 0xb5, 0x4a, 0x75, 0xea,
0x61, 0x64, 0x43, 0x96, 0xf4, 0x6a, 0x8d, 0xb8, 0xe1, 0x22, 0xbe, 0x53, 0xad, 0xea, 0xbb, 0x64,
0x8d, 0x26, 0xec, 0xae, 0x0c, 0x50, 0x3b, 0xeb, 0xd1, 0xea, 0x1a, 0xa9, 0xb7, 0xe8, 0x69, 0xd0,
0x94, 0x4f, 0xc8, 0xc4, 0xb5, 0x0d, 0xba, 0x31, 0x04, 0xd0, 0xa4, 0x96, 0xd4, 0xdf, 0xe0, 0x81,
0x66, 0xcf, 0x2e, 0x93, 0x78, 0xfe, 0xd1, 0x28, 0x52, 0xe3, 0x76, 0x4b, 0x6b, 0xff, 0xc6, 0x43,
0x7a, 0x9b, 0x19, 0xdc, 0x80, 0x06, 0x78, 0x76, 0xf1, 0xe2, 0x1c, 0x1d, 0xbb, 0xf0, 0x39, 0x67,
0x84, 0xba, 0x6a, 0x56, 0x2e, 0x0d, 0x44, 0xdb, 0x75, 0x72, 0x24, 0x89, 0xa3, 0x92, 0x50, 0x6b,
0x53, 0x70, 0xe5, 0x1e, 0x87, 0x00, 0xeb, 0xc9, 0xa1, 0xca, 0xad, 0xfe, 0x1d, 0x7d, 0xba, 0x70,
0xac, 0xb3, 0x54, 0x1a, 0x24, 0x20, 0xe2, 0xc9, 0xc2, 0x63, 0xd7, 0x90, 0x48, 0xca, 0x59, 0x8c,
0x3d, 0xd4, 0x5b, 0x88, 0x7d, 0x1f, 0x8f, 0x32, 0x32, 0x62, 0x36, 0x8a, 0x82, 0xd7, 0x33, 0xb5,
0x00, 0x22, 0xee, 0x63, 0x48, 0xd7, 0xd1, 0x33, 0x16, 0x51, 0x11, 0x91, 0x32, 0xd0, 0xd6, 0x26,
0x7c, 0x26, 0x9e, 0x7a, 0x17, 0x7f, 0x8d, 0xbf, 0x8f, 0x8d, 0x77, 0xa2, 0xb8, 0xdd, 0xbe, 0x38,
0x8f, 0x3a, 0x39, 0x4a, 0x38, 0x74, 0x55, 0xf0, 0x88, 0x3c, 0x17, 0x35, 0x90, 0xad, 0xdf, 0x88,
0x62, 0xf6, 0x5f, 0xd7, 0x49, 0x84, 0xe1, 0xe0, 0x0f, 0x66, 0x9b, 0x34, 0xdd, 0x8a, 0x0d, 0xb4,
0x6c, 0x95, 0x89, 0xe5, 0xcc, 0x3e, 0x87, 0x21, 0x16, 0x17, 0xdf, 0x43, 0x76, 0xf9, 0x91, 0x61,
0x7e, 0x15, 0xb4, 0xdb, 0x2d, 0x48, 0x11, 0x17, 0x7f, 0xe1, 0xdb, 0x51, 0x80, 0x4d, 0x26, 0x90,
0x23, 0xea, 0xd1, 0x20, 0xab, 0xdb, 0xb5, 0x05, 0xdf, 0x7e, 0x4a, 0x23, 0x65, 0x4f, 0x28, 0xa5,
0xc1, 0x26, 0x37, 0x53, 0xb9, 0xa7, 0x05, 0xab, 0x3f, 0xd2, 0x4d, 0x4a, 0x0b, 0x1d, 0x94, 0x32,
0xaf, 0xc5, 0xe6, 0x96, 0x74, 0x35, 0x99, 0xa9, 0xfc, 0xf7, 0x92, 0x97, 0x9e, 0x68, 0xa3, 0xf8,
0x4f, 0x24, 0x00, 0x4a, 0x4b, 0x3c, 0x58, 0xf6, 0xa8, 0x07, 0xd5, 0x41, 0x87, 0x63, 0xd8, 0x1c,
0xd5, 0xf3, 0x36, 0xcd, 0xed, 0x96, 0xd2, 0x47, 0x88, 0xac, 0x5e, 0xa4, 0x8c, 0x4d, 0x0b, 0xbf,
0xee, 0x01, 0xd2, 0x6d, 0x21, 0xf5, 0xa1, 0x05, 0x75, 0xe5, 0x35, 0x15, 0xdd, 0xf2, 0x2e, 0x2e,
0x65, 0xa8, 0x25, 0xeb, 0x24, 0xe5, 0xc1, 0x40, 0x5e, 0x97, 0x96, 0xeb, 0x81, 0x78, 0xb5, 0x49,
0x03, 0x81, 0xa3, 0xee, 0xa2, 0xa6, 0xde, 0x86, 0x9f, 0x8f, 0xb1, 0xa3, 0x60, 0x77, 0xa7, 0x41,
0x27, 0x71, 0x5e, 0x80, 0x7d, 0x45, 0xcd, 0xf1, 0x35, 0x59, 0x72, 0x0c, 0xd6, 0x8b, 0xeb, 0xec,
0xd7, 0x19, 0x6b, 0x3d, 0xc7, 0xe8, 0x82, 0x47, 0xee, 0x5e, 0x35, 0xa5, 0xc7, 0xc7, 0x75, 0xab,
0x9a, 0xfc, 0x9e, 0x52, 0xa8, 0xca, 0xbb, 0xe6, 0x79, 0xbc, 0x50, 0x5d, 0x6b, 0xab, 0xf0, 0x17,
0xef, 0xde, 0xfd, 0xf0, 0xdd, 0x71, 0x9f, 0x57, 0xc2, 0xe1, 0x2e, 0x46, 0xb9, 0x66, 0x6b, 0xd4,
0x96, 0x34, 0x67, 0xbd, 0x57, 0x34, 0xf5, 0x92, 0x1e, 0x16, 0xf2, 0xfc, 0xc1, 0x20, 0x98, 0x7c,
0xac, 0x81, 0xad, 0xa5, 0x47, 0x23, 0xf7, 0xca, 0x83, 0x0d, 0x87, 0x3c, 0xee, 0x56, 0xd0, 0xff,
0x21, 0xb9, 0x7a, 0xb9, 0xb9, 0x83, 0xe4, 0xb7, 0xaa, 0xea, 0x09, 0x64, 0xd7, 0x4c, 0xb9, 0x31,
0xd5, 0x66, 0x23, 0x2d, 0x4b, 0xf4, 0x58, 0x27, 0x20, 0x31, 0xb4, 0xd2, 0xa1, 0x94, 0x5d, 0x8d,
0x6a, 0x7a, 0xdb, 0x2b, 0x61, 0x12, 0xb8, 0x47, 0x40, 0xb5, 0x91, 0x83, 0xf9, 0xb3, 0xef, 0x28,
0x5f, 0x2d, 0xa1, 0xfd, 0x88, 0x78, 0x10, 0x2d, 0xa7, 0x31, 0xc0, 0x5f, 0xed, 0x34, 0x4e, 0x71,
0xbf, 0x1c, 0xa8, 0xd3, 0x3d, 0x3e, 0x42, 0x99, 0x74, 0x94, 0x9a, 0x3b, 0xbf, 0x1d, 0x39, 0x9b,
0xf4, 0x77, 0xa7, 0xe8, 0x31, 0x08, 0x75, 0x63, 0x28, 0xd5, 0xec, 0x84, 0x41, 0xc4, 0x86, 0x6e,
0xc5, 0x4c, 0xd1, 0x2f, 0xa7, 0x51, 0xa4, 0xb5, 0x9a, 0x79, 0xba, 0xde, 0x26, 0xa2, 0x10, 0x3a,
0x02, 0x94, 0x8a, 0x26, 0xe3, 0xf0, 0x3a, 0x47, 0x90, 0xa0, 0x7d, 0x96, 0x59, 0xaf, 0x1a, 0xe0,
0xd7, 0x9a, 0xd9, 0x8b, 0xf3, 0x0e, 0x77, 0xf3, 0x88, 0x2f, 0xeb, 0xa9, 0x89, 0x8d, 0xd1, 0x95,
0x4b, 0x28, 0x1b, 0x54, 0x2d, 0xe5, 0x9c, 0xd4, 0xd0, 0xdb, 0xa4, 0x47, 0x93, 0x8f, 0xd5, 0x31,
0xb3, 0x96, 0x09, 0x8c, 0x4e, 0x78, 0xaa, 0x09, 0xee, 0xc5, 0xbb, 0x02, 0x73, 0x65, 0xc9, 0x5e,
0x64, 0xe7, 0x74, 0xb4, 0x26, 0x8e, 0x92, 0xfc, 0x68, 0xb2, 0xc1, 0xb0, 0xa4, 0xe0, 0x48, 0x06,
0x94, 0x82, 0xe5, 0xb4, 0x34, 0x62, 0x34, 0x36, 0xb9, 0x4a, 0xb4, 0xe5, 0xbc, 0x1b, 0x79, 0xa8,
0x9c, 0xa9, 0x3f, 0xc1, 0x3f, 0xd5, 0x67, 0xf2, 0xff, 0x4a, 0x76, 0x29, 0xd3, 0xaf, 0x79, 0xb4,
0x69, 0xe4, 0x5f, 0xe0, 0xf4, 0xc9, 0xcc, 0xb7, 0x65, 0x30, 0xca, 0x48, 0x08, 0xcc, 0xa3, 0xb9,
0xc3, 0x53, 0x8d, 0x86, 0x25, 0x70, 0xf1, 0x8e, 0x40, 0x32, 0xb7, 0x37, 0xa2, 0x80, 0xaa, 0x7d,
0x3c, 0xce, 0xea, 0x53, 0xf9, 0x99, 0x8a, 0x80, 0xbf, 0x01, 0x8d, 0x0a, 0xd2, 0x6f, 0x4c, 0x66,
0x2d, 0x35, 0x29, 0x53, 0x67, 0x8a, 0x5f, 0x16, 0x85, 0x33, 0x15, 0x2c, 0x9f, 0x4c, 0xf6, 0x61,
0x46, 0xd5, 0x7a, 0x57, 0x59, 0x0e, 0x9b, 0x53, 0xa5, 0x7c, 0xda, 0xba, 0xd8, 0x8d, 0xb6, 0x41,
0x76, 0x58, 0x57, 0xa7, 0x15, 0x1e, 0x18, 0x54, 0xb7, 0xea, 0x49, 0xa9, 0x60, 0xd6, 0x4c, 0xcb,
0xe5, 0x8f, 0x08, 0xe4, 0x84, 0x30, 0x34, 0x80, 0xdf, 0x42, 0x18, 0x52, 0x10, 0x7f, 0x56, 0x10,
0x5f, 0xbd, 0x7b, 0xdb, 0xc9, 0xf1, 0x0e, 0x6e, 0x4b, 0x0b, 0x8a, 0xee, 0x28, 0xe4, 0x64, 0xd1,
0x3a, 0xff, 0xd7, 0xc9, 0x21, 0x20, 0xbf, 0x21, 0x2d, 0xef, 0x08, 0x1c, 0xf4, 0x75, 0x19, 0xdf,
0xdc, 0xca, 0x73, 0x2e, 0x4f, 0x20, 0xa9, 0x0e, 0xf2, 0xc5, 0x39, 0xcd, 0xc2, 0xf5, 0x4b, 0xcd,
0x11, 0xcb, 0x43, 0x75, 0x46, 0x19, 0x70, 0xe5, 0xfb, 0xc5, 0x55, 0xca, 0xa9, 0xb6, 0x6d, 0xdb,
0x0d, 0x28, 0xea, 0xb0, 0x09, 0xcf, 0xea, 0xf9, 0x28, 0xd2, 0x5a, 0xe4, 0x79, 0x74, 0x53, 0xcf,
0x6f, 0x5f, 0xa8, 0xc3, 0x27, 0x44, 0x97, 0x7a, 0x6a, 0xe9, 0xab, 0x1c, 0x59, 0x1d, 0x66, 0x3a,
0x14, 0x41, 0xba, 0x99, 0xd3, 0xcc, 0x7b, 0xc6, 0x87, 0xb7, 0xde, 0x50, 0x9b, 0x37, 0x72, 0x90,
0xb3, 0xfe, 0x69, 0x19, 0x34, 0x4e, 0x7d, 0x1d, 0xb5, 0x51, 0x29, 0x23, 0x6e, 0x23, 0xdb, 0x1b,
0xf2, 0x8c, 0xad, 0x3b, 0x30, 0xe4, 0xb2, 0x32, 0x3d, 0x35, 0xe4, 0x84, 0x77, 0x77, 0xd0, 0x93,
0xd2, 0xa4, 0x45, 0x9d, 0xa3, 0xb3, 0xa5, 0xce, 0xa0, 0x77, 0xa8, 0x65, 0x87, 0x18, 0x1f, 0x5d,
0xda, 0xc0, 0xd4, 0x87, 0x58, 0x2d, 0xe9, 0x57, 0xcd, 0xba, 0x26, 0x3b, 0xa7, 0xa3, 0x6d, 0xeb,
0xdc, 0x58, 0xd7, 0x40, 0xdb, 0xfa, 0x38, 0x3c, 0x97, 0x79, 0x71, 0xbe, 0xfd, 0x75, 0xa3, 0x28,
0xa7, 0x73, 0xd4, 0x71, 0xa7, 0x1f, 0x15, 0xbf, 0x2b, 0xa3, 0x52, 0x6a, 0x77, 0x5c, 0xe2, 0x45,
0x76, 0x2b, 0xfa, 0x17, 0xd2, 0x06, 0x7e, 0xfa, 0xbf, 0x4a, 0xe7, 0x4f, 0x46, 0x87, 0x9a, 0x5c,
0x6b, 0xc6, 0x7b, 0x62, 0x88, 0x25, 0x62, 0x7e, 0x39, 0xc6, 0x25, 0x55, 0x1f, 0x1d, 0xe6, 0x94,
0x37, 0xc6, 0xb3, 0xb4, 0x8d, 0xf2, 0xf4, 0xf5, 0x3c, 0x8b, 0xb7, 0xc5, 0x05, 0x34, 0xe5, 0x2a,
0xbd, 0x49, 0x67, 0xcf, 0x58, 0xf3, 0xa4, 0xaa, 0x05, 0x74, 0xf6, 0x42, 0x29, 0x1b, 0x3f, 0x37,
0xdd, 0xc2, 0x08, 0x7f, 0xe1, 0x16, 0xb6, 0x51, 0xb1, 0x32, 0x30, 0xf9, 0x79, 0xe3, 0x7a, 0xf6,
0xd8, 0x0b, 0x0c, 0x77, 0x6c, 0xfb, 0xde, 0x20, 0x0a, 0xed, 0xc0, 0xa0, 0x7f, 0xbc, 0xad, 0x60,
0xa1, 0x6a, 0xe4, 0x5b, 0x81, 0x1d, 0x0e, 0x07, 0x28, 0x1d, 0xa8, 0x8b, 0xac, 0xf3, 0xed, 0x91,
0x37, 0xb2, 0x5c, 0x7b, 0x38, 0x1c, 0xd8, 0xc1, 0x38, 0xa4, 0x7f, 0x72, 0x2b, 0xc2, 0xb2, 0x03,
0x27, 0xb0, 0xec, 0xd0, 0x77, 0xed, 0x20, 0x1c, 0xd0, 0x3f, 0x59, 0x6e, 0xd8, 0xe1, 0xc0, 0x47,
0xa5, 0x1b, 0x1a, 0x23, 0x7b, 0xac, 0x2e, 0xb2, 0x66, 0x64, 0x8c, 0xed, 0x91, 0x33, 0x04, 0x78,
0xc0, 0x54, 0x57, 0x05, 0xcb, 0x1b, 0x8f, 0x0c, 0x0c, 0x32, 0xf0, 0x12, 0x17, 0xc8, 0x8c, 0xed,
0x61, 0x10, 0xb9, 0xae, 0xed, 0xf8, 0x63, 0x43, 0xdd, 0xd4, 0x06, 0x88, 0x1d, 0xba, 0x03, 0x00,
0x1f, 0xba, 0x06, 0x08, 0x72, 0x87, 0x63, 0x7d, 0x93, 0xd5, 0xb6, 0xe7, 0x86, 0xa0, 0xc6, 0x1f,
0xf8, 0x2f, 0x51, 0x3e, 0x0c, 0x0d, 0x79, 0x95, 0x95, 0x21, 0x6a, 0x3d, 0x23, 0xb0, 0xdd, 0xd0,
0x8d, 0x86, 0xf6, 0xd0, 0x37, 0xf8, 0xa2, 0x38, 0x80, 0xeb, 0xc0, 0xf6, 0x41, 0xbf, 0xbc, 0x6a,
0xbe, 0xb8, 0xe0, 0x98, 0xed, 0xfb, 0x21, 0x8a, 0xbd, 0x70, 0xa0, 0xae, 0x1a, 0x95, 0xb1, 0x33,
0x06, 0xb8, 0xd1, 0x30, 0x20, 0xb2, 0xc6, 0xfa, 0xaa, 0x6b, 0x1d, 0x30, 0xc5, 0x1d, 0x0f, 0xd1,
0xc7, 0x71, 0x5d, 0x75, 0x95, 0x6c, 0xf0, 0x19, 0xa2, 0x6f, 0x8f, 0x31, 0x10, 0xae, 0xc1, 0x50,
0x5d, 0x35, 0x5b, 0xe1, 0xd1, 0x31, 0x30, 0x18, 0xe1, 0x87, 0xae, 0x3d, 0x1a, 0x45, 0xae, 0x63,
0xbb, 0x23, 0xcf, 0x50, 0x37, 0x09, 0xdf, 0xb3, 0x9d, 0x61, 0x08, 0x42, 0x3d, 0x90, 0x35, 0x54,
0x17, 0xc5, 0x03, 0x48, 0x11, 0x98, 0x07, 0xde, 0x68, 0x4d, 0xe8, 0x0f, 0x20, 0xa1, 0x97, 0xae,
0x0f, 0x74, 0x7c, 0x43, 0xdd, 0x94, 0x98, 0x1c, 0xc7, 0x25, 0x98, 0x10, 0x3d, 0xb1, 0x69, 0x4c,
0x23, 0xc8, 0x9b, 0xc6, 0x92, 0x2a, 0xd0, 0x3b, 0x4c, 0x48, 0xa2, 0x24, 0xf8, 0x08, 0x0d, 0x9c,
0x80, 0xb9, 0x4a, 0x37, 0x47, 0xd3, 0x1a, 0xda, 0xee, 0xc0, 0x35, 0xba, 0x2a, 0x55, 0x95, 0x93,
0x68, 0xdd, 0x21, 0x10, 0x63, 0x6e, 0x54, 0xea, 0x11, 0x34, 0xd2, 0x0f, 0x30, 0x5c, 0xe8, 0x05,
0x6f, 0x10, 0xcd, 0x08, 0xa5, 0x31, 0x50, 0xe6, 0x9b, 0x7a, 0xd3, 0xd0, 0xd0, 0x6b, 0x00, 0x59,
0x27, 0xd0, 0x47, 0x17, 0x28, 0x81, 0x05, 0xd0, 0x9c, 0xa1, 0x07, 0x24, 0xbd, 0xc8, 0x85, 0xa2,
0x41, 0xbe, 0xea, 0x26, 0x69, 0x80, 0xee, 0x0c, 0x47, 0x23, 0xbe, 0x85, 0x41, 0x42, 0xba, 0x8a,
0xf6, 0x81, 0x3f, 0x77, 0x2c, 0xdb, 0x0f, 0x02, 0xe0, 0x39, 0x26, 0x05, 0xf6, 0xf8, 0x81, 0x41,
0xae, 0x71, 0xf3, 0x82, 0x31, 0x54, 0xc3, 0x0d, 0x86, 0x2f, 0x81, 0x3d, 0x34, 0x44, 0x5e, 0xb5,
0x0e, 0x8d, 0x5c, 0x52, 0x54, 0x2f, 0x24, 0xf5, 0x74, 0x5d, 0x56, 0x4f, 0xba, 0x69, 0x85, 0x19,
0x90, 0xd2, 0xd9, 0x61, 0x78, 0x07, 0xab, 0xf0, 0x87, 0xc4, 0xf8, 0x31, 0x35, 0x92, 0x37, 0x85,
0xd4, 0x18, 0x43, 0x8c, 0x08, 0xd1, 0x61, 0xb8, 0xa2, 0x66, 0x03, 0x82, 0x15, 0xba, 0xbe, 0xa1,
0x6e, 0xa5, 0xaa, 0x87, 0x2e, 0x41, 0x1c, 0x04, 0x6f, 0x42, 0xd8, 0x2e, 0xe1, 0x31, 0x1a, 0xa1,
0x2d, 0xd8, 0x08, 0x20, 0x7c, 0x65, 0x70, 0x16, 0x3d, 0x5b, 0xf5, 0x62, 0x5d, 0xc9, 0xd5, 0x78,
0x96, 0x05, 0x34, 0x29, 0x93, 0x41, 0xe7, 0xd9, 0x14, 0x4e, 0x3c, 0x2f, 0x0c, 0x3c, 0xbf, 0x11,
0x9b, 0x5b, 0xb8, 0x95, 0xd2, 0x4d, 0xf8, 0x66, 0xf0, 0xda, 0x73, 0xdf, 0x8f, 0x5e, 0xfb, 0xef,
0x03, 0xbc, 0xb8, 0x2e, 0xbd, 0xb9, 0x3e, 0x5e, 0x5d, 0x97, 0xde, 0xb9, 0xd6, 0xa5, 0x6a, 0x37,
0xf8, 0x5b, 0xef, 0xfc, 0xe2, 0x99, 0xc9, 0xbe, 0x09, 0x4e, 0x51, 0xfa, 0x26, 0xe5, 0x90, 0x7a,
0x6e, 0xb0, 0x2d, 0x7a, 0x4d, 0x97, 0x34, 0x84, 0x58, 0xf0, 0xaf, 0xe6, 0x94, 0xd6, 0x24, 0x78,
0x14, 0xad, 0x2c, 0x6f, 0x34, 0x9a, 0x5b, 0x5e, 0x00, 0xf6, 0xf9, 0xae, 0x07, 0x4b, 0xb0, 0x06,
0x23, 0xcb, 0x83, 0xd4, 0x3c, 0x98, 0xf2, 0x88, 0x5e, 0x06, 0xa3, 0x3b, 0xcb, 0xf3, 0x06, 0x90,
0x1c, 0xb5, 0x0a, 0x83, 0x61, 0xe0, 0x19, 0xd4, 0x60, 0x10, 0x8c, 0xc2, 0x21, 0x6a, 0x0d, 0x6e,
0xb3, 0x22, 0x38, 0x35, 0x30, 0x28, 0x35, 0x4a, 0x30, 0x06, 0xb7, 0xba, 0x63, 0x28, 0x46, 0x09,
0xc5, 0x2a, 0xa1, 0x48, 0x10, 0xb8, 0x7e, 0x5e, 0x13, 0x3e, 0x12, 0xa7, 0x11, 0x04, 0xce, 0x08,
0xb9, 0xe4, 0x30, 0xdd, 0x20, 0x1c, 0x13, 0xaf, 0xe1, 0x15, 0x02, 0x05, 0x08, 0x0d, 0x7c, 0xcf,
0xf1, 0x5d, 0xaa, 0x25, 0x20, 0x5c, 0x87, 0xbf, 0x8c, 0x8a, 0xee, 0x8d, 0x77, 0x4b, 0xf7, 0xa6,
0x67, 0xf4, 0x56, 0xd4, 0xe8, 0xee, 0x96, 0xec, 0x6e, 0x71, 0x25, 0xfe, 0x7e, 0x5e, 0x83, 0x65,
0xe0, 0x6f, 0x8d, 0x57, 0x0e, 0xfc, 0x02, 0xfa, 0x94, 0x5d, 0x18, 0x29, 0xab, 0x86, 0x14, 0x83,
0x1d, 0x39, 0x80, 0x3a, 0x24, 0x67, 0x3f, 0x0e, 0x40, 0x04, 0x59, 0x49, 0x88, 0xc6, 0x9e, 0x35,
0x0e, 0xe4, 0xdf, 0x1c, 0xff, 0x8c, 0x7a, 0xb1, 0x31, 0x0e, 0xee, 0xa8, 0x97, 0x51, 0xc7, 0xa5,
0x86, 0x2a, 0xae, 0xf9, 0xd1, 0x91, 0x42, 0xc7, 0x1e, 0x8e, 0x7d, 0xd0, 0x0d, 0x6f, 0x34, 0x70,
0x02, 0x0f, 0x14, 0xc0, 0xa9, 0xbb, 0x14, 0x32, 0xbc, 0x51, 0x4e, 0xcf, 0xba, 0xc2, 0x50, 0x15,
0x8f, 0x8d, 0x55, 0x52, 0x2e, 0x55, 0x95, 0xf4, 0xeb, 0x2f, 0x9b, 0xe4, 0x7f, 0x35, 0xec, 0xf7,
0xd7, 0xb0, 0x91, 0xf3, 0x64, 0x05, 0xfb, 0xf5, 0x62, 0xff, 0xb5, 0xfa, 0xf5, 0x3b, 0x68, 0x71,
0x87, 0x66, 0xd1, 0x72, 0x42, 0xdd, 0xfd, 0x51, 0x00, 0xf1, 0x2e, 0xc7, 0x32, 0x44, 0x01, 0x14,
0x47, 0x35, 0x44, 0xb3, 0x00, 0xb9, 0x12, 0x9c, 0xf8, 0xe8, 0x6a, 0x60, 0x73, 0x38, 0x19, 0x5c,
0x22, 0xf0, 0xbb, 0x1c, 0xf1, 0x71, 0xf1, 0x0d, 0xca, 0x43, 0x8c, 0xf1, 0x3b, 0x0a, 0x77, 0x63,
0x59, 0x4a, 0x5e, 0x9e, 0x5b, 0x5e, 0xc1, 0xd1, 0x23, 0x69, 0x00, 0x58, 0x3c, 0x04, 0x81, 0x21,
0x63, 0xd4, 0x70, 0xa4, 0x1f, 0xb8, 0x06, 0xcc, 0xf2, 0xb9, 0x00, 0x4a, 0xc3, 0x71, 0x98, 0x52,
0x35, 0xce, 0x4f, 0xf0, 0x1c, 0xa2, 0xc1, 0x00, 0x1a, 0xa7, 0xcb, 0x7d, 0xbe, 0x7a, 0xf2, 0xef,
0x1b, 0x0f, 0x68, 0x5c, 0x79, 0x1e, 0xf0, 0x02, 0x92, 0x97, 0x18, 0x36, 0x1c, 0x53, 0x12, 0x33,
0x20, 0x58, 0xc8, 0xb5, 0x18, 0xac, 0xff, 0x0e, 0x99, 0x8b, 0xab, 0x8a, 0x6d, 0x4a, 0x82, 0x82,
0x2b, 0x20, 0x7d, 0x89, 0x11, 0x48, 0xab, 0x88, 0x52, 0x68, 0x3b, 0x03, 0x0d, 0xde, 0x31, 0x52,
0x5c, 0x4a, 0xa0, 0x99, 0x25, 0xc3, 0x4b, 0xc4, 0x61, 0x64, 0x28, 0xee, 0x10, 0xc4, 0x0d, 0x08,
0x33, 0x60, 0x33, 0xb2, 0x79, 0x0c, 0xef, 0x8a, 0x5b, 0xe2, 0x4a, 0xd0, 0x3d, 0x28, 0xc6, 0xe0,
0x92, 0x92, 0x32, 0x9f, 0x58, 0xc0, 0x7c, 0x21, 0x56, 0x78, 0x9a, 0xdc, 0x4b, 0x97, 0x23, 0x19,
0x05, 0x7a, 0x74, 0x08, 0x18, 0x4b, 0xf0, 0xc2, 0x27, 0xa0, 0xce, 0x88, 0x7a, 0x06, 0x4c, 0xba,
0xc3, 0xa4, 0xfb, 0x54, 0xce, 0x5d, 0x87, 0x6f, 0x28, 0xf0, 0x0e, 0x08, 0xc0, 0x90, 0x48, 0xa4,
0x47, 0x9e, 0x54, 0x01, 0x83, 0x31, 0x3f, 0x00, 0xf8, 0x3b, 0x59, 0x07, 0x6e, 0xa0, 0x6e, 0xc4,
0x77, 0xe2, 0x48, 0x20, 0x1f, 0xc9, 0x50, 0x19, 0x57, 0x18, 0x26, 0x5d, 0x43, 0x17, 0xe8, 0xbe,
0xf6, 0x1c, 0x6a, 0x32, 0x64, 0xd4, 0x03, 0x97, 0xc0, 0x8c, 0x98, 0x72, 0xea, 0xef, 0x5e, 0x02,
0x7c, 0x20, 0x5f, 0x89, 0x57, 0x68, 0x48, 0xe9, 0x04, 0x3f, 0xf2, 0x70, 0x5c, 0x4b, 0xca, 0x85,
0xd2, 0x80, 0x05, 0x3c, 0xe6, 0x57, 0xca, 0xb2, 0x19, 0xb5, 0x11, 0x3d, 0x87, 0x21, 0x3d, 0x87,
0xfe, 0x95, 0x2b, 0xc3, 0xfe, 0x6b, 0xcf, 0x7b, 0x4f, 0xf8, 0x5f, 0x61, 0xc8, 0x11, 0x53, 0x1e,
0x84, 0x97, 0x78, 0x46, 0x86, 0x88, 0xe2, 0x31, 0x8f, 0x23, 0x9f, 0x99, 0x0c, 0xba, 0xff, 0x8d,
0xa2, 0x37, 0xab, 0xac, 0x5a, 0x1a, 0x6a, 0x69, 0x6d, 0x70, 0xa9, 0x44, 0x58, 0x8a, 0x14, 0xf2,
0xbd, 0x52, 0xb2, 0xbe, 0xac, 0xa4, 0x1f, 0x12, 0x78, 0xa5, 0x13, 0x35, 0x5d, 0xd1, 0xfa, 0x73,
0x45, 0x22, 0xbf, 0xac, 0x34, 0x00, 0xa8, 0xc1, 0xad, 0x49, 0xc5, 0x78, 0x03, 0x1a, 0x46, 0x03,
0x52, 0xbf, 0x81, 0x4b, 0x1a, 0x4b, 0x98, 0x41, 0x15, 0x43, 0x4e, 0x90, 0x86, 0xf4, 0xec, 0xf2,
0x33, 0xa5, 0x2a, 0x78, 0xbe, 0x2a, 0x2d, 0xe0, 0xb2, 0x6e, 0x16, 0xc8, 0x47, 0xb5, 0xb5, 0x54,
0x26, 0xa4, 0xad, 0xea, 0x4a, 0xdb, 0xd9, 0x65, 0x65, 0x7a, 0xda, 0x18, 0xa5, 0x69, 0xa2, 0x32,
0x94, 0xa6, 0x33, 0xa4, 0x39, 0x8a, 0xcb, 0x92, 0xae, 0xf0, 0x7a, 0xba, 0xb6, 0xc2, 0x75, 0x0c,
0x88, 0xcf, 0x01, 0x68, 0x61, 0x55, 0xa5, 0x0c, 0x96, 0x1f, 0x3c, 0xf5, 0xc0, 0xe5, 0x21, 0xab,
0xa3, 0xcf, 0x63, 0x05, 0x6c, 0xa4, 0x94, 0xd5, 0x33, 0x4c, 0x9f, 0x90, 0xa1, 0x51, 0x78, 0x96,
0xe0, 0xb1, 0x94, 0xb5, 0xae, 0x7a, 0x04, 0xe0, 0x8a, 0xf6, 0x45, 0x03, 0xca, 0x96, 0x70, 0x65,
0x4d, 0x7b, 0xef, 0x79, 0x57, 0x5c, 0x55, 0x89, 0x93, 0x16, 0x65, 0x1a, 0xb2, 0x1c, 0x9a, 0xe3,
0xd7, 0xc3, 0xf7, 0xc3, 0xd7, 0xa4, 0xf1, 0x9e, 0xe9, 0x8e, 0x5f, 0xfa, 0x26, 0xa7, 0x84, 0x26,
0x78, 0x85, 0xfc, 0xab, 0xf6, 0x4a, 0xd5, 0x7e, 0xfd, 0x7d, 0x78, 0x58, 0x0f, 0xfb, 0x0d, 0x4d,
0xff, 0xf5, 0xf0, 0x12, 0x4c, 0x1d, 0xa3, 0x06, 0xb5, 0x30, 0x4a, 0xdf, 0x1c, 0xbe, 0x07, 0x64,
0xcf, 0xe4, 0x44, 0xd9, 0x44, 0xe4, 0x34, 0x3d, 0xf7, 0x75, 0xa3, 0xc4, 0x73, 0xd1, 0xf9, 0x7d,
0x78, 0x45, 0xdd, 0x2b, 0x6c, 0xd5, 0x72, 0x58, 0x53, 0xf9, 0xcc, 0x01, 0xf9, 0x27, 0xd7, 0x64,
0x16, 0xe1, 0x46, 0xc2, 0x04, 0xdf, 0xcc, 0xc0, 0xf6, 0x49, 0xab, 0x43, 0x93, 0xa4, 0xc0, 0x0f,
0x52, 0xa3, 0xa9, 0x8e, 0x2e, 0x64, 0xc9, 0x23, 0x93, 0x8c, 0x8f, 0x38, 0xec, 0x9b, 0x68, 0xc2,
0xb3, 0x9c, 0x31, 0x95, 0x41, 0x79, 0xa1, 0x10, 0xd4, 0x8e, 0x04, 0x01, 0xb0, 0x2e, 0xab, 0xc4,
0x80, 0x6a, 0x43, 0x29, 0x74, 0x90, 0x87, 0x0b, 0x6b, 0xab, 0x49, 0x19, 0xb6, 0x21, 0x9f, 0x1c,
0x6a, 0x47, 0xb5, 0xa1, 0x1d, 0xd2, 0x10, 0xae, 0xa9, 0xb4, 0x6a, 0x68, 0x92, 0x9c, 0x4c, 0x48,
0x04, 0xea, 0x71, 0x15, 0x9a, 0x30, 0x3b, 0x68, 0x83, 0x89, 0x97, 0xf7, 0x83, 0x37, 0x40, 0x56,
0x22, 0xe5, 0x13, 0x9e, 0x34, 0x25, 0xa3, 0xec, 0x97, 0x26, 0x02, 0x80, 0x33, 0x26, 0xc5, 0x24,
0x32, 0xc8, 0x63, 0xa2, 0xd8, 0x26, 0x3b, 0x1b, 0x13, 0x39, 0x64, 0x51, 0x23, 0x89, 0xc7, 0x88,
0x7a, 0xc0, 0xcc, 0x69, 0xc6, 0x4b, 0xa0, 0x48, 0xb7, 0x99, 0xd0, 0xc1, 0x15, 0x53, 0x34, 0xb8,
0x24, 0x62, 0xc9, 0xae, 0x88, 0x96, 0x81, 0xa1, 0x47, 0xac, 0xb8, 0xfb, 0xea, 0x41, 0xb4, 0xcd,
0xda, 0x1e, 0xce, 0xa1, 0x59, 0x34, 0xab, 0x84, 0xfb, 0x22, 0xaf, 0x89, 0x90, 0x4b, 0x93, 0xbc,
0x21, 0x66, 0x32, 0x2e, 0x4f, 0x9c, 0xc9, 0xa3, 0x0f, 0x82, 0x04, 0xfa, 0x4c, 0x93, 0x28, 0x27,
0x98, 0x63, 0xde, 0x48, 0xd3, 0x01, 0xe8, 0x19, 0x26, 0x0f, 0x63, 0x8b, 0x15, 0x13, 0x0c, 0x1c,
0xd1, 0x17, 0xb0, 0x10, 0x08, 0x4d, 0x5e, 0x08, 0x09, 0xf4, 0xc6, 0xb4, 0x96, 0xf4, 0x15, 0x21,
0x9f, 0x0b, 0x79, 0xfe, 0x02, 0xfd, 0xc7, 0x9c, 0x3f, 0x40, 0xdb, 0x30, 0xf1, 0xc8, 0xa2, 0xe9,
0x32, 0x87, 0xc7, 0xc4, 0x78, 0x60, 0x7e, 0xa0, 0x47, 0xa4, 0x99, 0xd7, 0xe0, 0xf3, 0x1b, 0x8f,
0xbc, 0x28, 0xa0, 0x07, 0x73, 0x4c, 0xa9, 0xc6, 0x34, 0xb2, 0x4d, 0x73, 0x76, 0xdb, 0xf1, 0x78,
0x0a, 0x33, 0x70, 0x69, 0x3e, 0x4f, 0x53, 0xa2, 0x71, 0x78, 0xc9, 0x28, 0x86, 0x6a, 0x5a, 0x49,
0x86, 0x4d, 0xe1, 0x8d, 0x27, 0x67, 0x06, 0x4d, 0xe1, 0xc8, 0x92, 0xe0, 0x0b, 0xd0, 0x58, 0x45,
0x8d, 0xb9, 0x2b, 0x67, 0xb5, 0x34, 0x57, 0x04, 0x58, 0xf2, 0x54, 0x20, 0x78, 0xe4, 0x25, 0x14,
0x12, 0xa9, 0x8b, 0x37, 0x97, 0x63, 0xf2, 0x78, 0xf2, 0x4e, 0x93, 0x4d, 0x43, 0xa1, 0x21, 0xf9,
0x40, 0x98, 0x58, 0x54, 0x81, 0xd8, 0x0d, 0x8b, 0x2e, 0x71, 0xb5, 0x54, 0xb5, 0xaf, 0x1e, 0x10,
0x77, 0x9d, 0xcf, 0x6f, 0x64, 0x0c, 0x1e, 0xce, 0x2d, 0xc9, 0x75, 0x6b, 0x68, 0x11, 0xd7, 0x71,
0xa3, 0x0c, 0x0d, 0x58, 0x13, 0x1f, 0x81, 0x96, 0x64, 0xac, 0x3b, 0x48, 0x5c, 0x5e, 0x65, 0xc0,
0x05, 0x30, 0x1d, 0xe6, 0x32, 0x88, 0xc4, 0xc4, 0x9d, 0x6f, 0xbc, 0xf4, 0xe0, 0xb2, 0x07, 0x21,
0x27, 0xeb, 0xf3, 0x1f, 0xdb, 0x63, 0x0c, 0x47, 0xdc, 0x9e, 0x26, 0xb0, 0x0e, 0x8c, 0x0c, 0xa8,
0x91, 0xf5, 0xcc, 0x69, 0x69, 0x03, 0xa1, 0x83, 0xbe, 0x00, 0x86, 0x92, 0xf3, 0x10, 0xf6, 0xf0,
0xf3, 0x9a, 0x39, 0x80, 0x0a, 0x1f, 0x0d, 0xdc, 0x21, 0x21, 0x4b, 0x12, 0x1b, 0x5a, 0x4a, 0xc0,
0x01, 0x4f, 0xf8, 0x07, 0x89, 0x27, 0xd7, 0x0e, 0x82, 0xc1, 0xe7, 0x52, 0xa5, 0x7e, 0x4c, 0x5b,
0x4a, 0x05, 0xeb, 0x5e, 0x79, 0x83, 0x3b, 0x6f, 0xf0, 0xda, 0x79, 0xef, 0x7c, 0x56, 0x0b, 0x92,
0x3d, 0x5a, 0x91, 0xac, 0xe7, 0x82, 0xc4, 0x07, 0x8a, 0xb5, 0xb4, 0xf0, 0xa1, 0xa4, 0x13, 0x72,
0x74, 0x84, 0x64, 0xe6, 0xb4, 0x28, 0x40, 0xc2, 0x18, 0x1b, 0x24, 0x4e, 0x98, 0x22, 0xa5, 0xa6,
0xc3, 0x1c, 0x9a, 0x13, 0x42, 0x75, 0x48, 0xb1, 0x28, 0xf9, 0x1a, 0x92, 0x56, 0x85, 0xbe, 0x45,
0x0d, 0x2d, 0xca, 0xee, 0x80, 0x37, 0x97, 0x4b, 0x26, 0x87, 0x1d, 0x2c, 0xce, 0xe5, 0x83, 0x41,
0xdc, 0xae, 0xd4, 0xdd, 0x92, 0x0f, 0x54, 0x86, 0x0c, 0xce, 0x1a, 0x11, 0xdc, 0x80, 0x3a, 0xfa,
0xcc, 0x56, 0xdc, 0xfc, 0xbc, 0xc6, 0x5f, 0xdf, 0x92, 0x2f, 0x96, 0x7c, 0xb0, 0xe8, 0xc1, 0xff,
0xac, 0xa7, 0xaa, 0x97, 0xe5, 0xd2, 0x9d, 0x66, 0x0a, 0x9f, 0x63, 0xcc, 0x6e, 0x13, 0x31, 0xeb,
0x89, 0x3b, 0xb1, 0x49, 0x17, 0x0b, 0x3a, 0xf6, 0x15, 0x6f, 0xdb, 0x65, 0xcc, 0x15, 0x38, 0x07,
0x27, 0xa4, 0x49, 0x35, 0xdd, 0x5c, 0x72, 0x7b, 0xce, 0x38, 0x64, 0xf1, 0xba, 0xc1, 0x90, 0x23,
0x35, 0xbf, 0xc3, 0xa5, 0x8c, 0xfc, 0x01, 0x85, 0x43, 0xd5, 0x01, 0x9e, 0x6d, 0xec, 0x8d, 0xc6,
0x1c, 0x32, 0xd0, 0x34, 0x30, 0x2c, 0x87, 0x5b, 0xfa, 0xae, 0x0c, 0x73, 0x68, 0xdd, 0x2a, 0x42,
0xfb, 0x71, 0xd9, 0xed, 0x2a, 0xa4, 0xb8, 0x3e, 0x1a, 0x86, 0x14, 0xd2, 0x79, 0xe8, 0x1a, 0x44,
0x35, 0x76, 0xad, 0x7b, 0x39, 0x7c, 0xa3, 0x4c, 0xb6, 0xaf, 0x3a, 0x3e, 0xd2, 0x41, 0xc3, 0x2d,
0x3b, 0xaa, 0x91, 0xaf, 0x14, 0x26, 0x46, 0x78, 0x55, 0x55, 0x49, 0x7c, 0x2f, 0x1f, 0xa1, 0x4a,
0xd1, 0x5e, 0x75, 0x93, 0xdc, 0xb9, 0xac, 0xd8, 0x75, 0x84, 0x9f, 0x9a, 0x68, 0xd5, 0xe1, 0x8a,
0x7c, 0xec, 0xc0, 0x1d, 0xc8, 0xac, 0x93, 0x39, 0xa5, 0x41, 0xe9, 0x61, 0xcb, 0x9e, 0x6a, 0xcc,
0xda, 0xbb, 0x94, 0xa0, 0x6e, 0x7f, 0xac, 0x9d, 0x86, 0xa3, 0xdb, 0xcb, 0x71, 0xae, 0xd4, 0xb8,
0x20, 0xbe, 0xa5, 0x0b, 0x7f, 0xd3, 0xa6, 0x74, 0x9d, 0x44, 0xb4, 0x63, 0x0b, 0x7d, 0x9b, 0xde,
0x45, 0x19, 0x9d, 0x47, 0x8a, 0xd3, 0x4d, 0x3e, 0xdb, 0xed, 0xcd, 0xaf, 0x66, 0xcb, 0xdb, 0x0d,
0x9f, 0xbd, 0x3d, 0x13, 0xfd, 0x5d, 0x26, 0x8a, 0xdb, 0x6c, 0x63, 0x2c, 0xd2, 0xf9, 0xed, 0x5a,
0x6c, 0x0a, 0xfb, 0x46, 0x14, 0xaf, 0x12, 0x41, 0x8f, 0x7f, 0x7a, 0xf8, 0x61, 0x81, 0x16, 0xfb,
0xa9, 0x6e, 0x6e, 0xd0, 0x71, 0x86, 0xd7, 0xf1, 0x42, 0xe8, 0x23, 0x23, 0x67, 0xfd, 0x1d, 0xc1,
0x16, 0xb3, 0xaf, 0xce, 0xaa, 0x3d, 0xf7, 0xfe, 0x94, 0xce, 0x96, 0x35, 0x96, 0xa5, 0x7b, 0x2a,
0x5e, 0x7f, 0xd1, 0x33, 0x7b, 0x74, 0x54, 0xe8, 0xd5, 0xbb, 0xb7, 0x86, 0xda, 0x23, 0x13, 0x0b,
0xdb, 0x78, 0x9b, 0xd0, 0x97, 0x82, 0xc6, 0x7d, 0x14, 0x17, 0x46, 0x64, 0x24, 0x71, 0x51, 0x24,
0x82, 0x4f, 0x97, 0x16, 0x2b, 0xb1, 0xa1, 0xf3, 0x6a, 0x74, 0x62, 0xb1, 0x58, 0xc5, 0xb9, 0xb1,
0x05, 0x34, 0x9b, 0x20, 0xf4, 0xfa, 0x66, 0x35, 0xe2, 0x6c, 0x36, 0x13, 0x36, 0x6d, 0x5c, 0x7f,
0x7b, 0x26, 0xef, 0xb3, 0x1e, 0x9d, 0xca, 0xe9, 0x99, 0x40, 0xab, 0x3c, 0x42, 0xd2, 0xeb, 0xdb,
0xbc, 0x86, 0x7e, 0x15, 0xe7, 0x85, 0x9d, 0x89, 0x75, 0x7a, 0x07, 0xbc, 0x6a, 0xe7, 0x4d, 0xfa,
0xd4, 0xba, 0x3c, 0xa1, 0xd1, 0x68, 0x1d, 0x2d, 0x16, 0xcd, 0xa6, 0xfd, 0x49, 0x39, 0x50, 0x89,
0xc4, 0xf1, 0xc1, 0x0e, 0xba, 0x1f, 0x1f, 0xa9, 0x0b, 0xaf, 0xfe, 0xbe, 0xe4, 0x3f, 0x64, 0x43,
0x7b, 0xce, 0xd4, 0x14, 0xac, 0x07, 0x14, 0xb9, 0xc1, 0xd5, 0x09, 0x82, 0x77, 0x23, 0xfa, 0x53,
0x29, 0x9f, 0x8d, 0xb8, 0x37, 0xfe, 0xf2, 0xe7, 0xab, 0xb3, 0xbf, 0xaf, 0x8a, 0x62, 0x3b, 0x39,
0x3f, 0xff, 0x6a, 0x77, 0x1f, 0x6f, 0x16, 0xe9, 0xbd, 0x9d, 0xa4, 0x73, 0xde, 0x81, 0xb3, 0x57,
0x69, 0x5e, 0xd0, 0xa6, 0xee, 0xfe, 0x9c, 0x76, 0xcb, 0xff, 0xde, 0x9f, 0x2e, 0xe9, 0x1b, 0x25,
0x88, 0xdf, 0x26, 0x21, 0x9c, 0x9d, 0x89, 0xd9, 0x85, 0xb0, 0xff, 0x91, 0x43, 0x67, 0xfa, 0xfd,
0x5a, 0xd9, 0x8e, 0x8e, 0x8c, 0xfd, 0x35, 0x5e, 0xc6, 0x3f, 0xaa, 0x6d, 0x70, 0xf4, 0x30, 0xbb,
0x11, 0x63, 0x36, 0x48, 0xac, 0xf6, 0x75, 0xa2, 0xe4, 0x47, 0x99, 0x04, 0x83, 0xd4, 0xb1, 0xc8,
0x1e, 0x88, 0x30, 0x59, 0x68, 0xf5, 0x9e, 0x83, 0xcf, 0x7c, 0x7a, 0xd1, 0x96, 0x5f, 0x64, 0xff,
0x98, 0x2e, 0x84, 0x1d, 0x2f, 0x00, 0x57, 0x9e, 0x44, 0x98, 0x7d, 0xe1, 0xec, 0x41, 0x01, 0x30,
0x2d, 0x88, 0x21, 0x65, 0xeb, 0x56, 0x13, 0x82, 0x48, 0xc7, 0xae, 0xfa, 0xf6, 0x5d, 0x94, 0xdc,
0x8a, 0x19, 0x29, 0x93, 0x3d, 0x17, 0x49, 0x92, 0xff, 0xe2, 0x7e, 0xb0, 0x63, 0xcc, 0x64, 0xb2,
0xd7, 0x3f, 0xbf, 0xb9, 0x32, 0x55, 0x3b, 0xde, 0xde, 0x46, 0xe3, 0xb2, 0xe2, 0x54, 0x87, 0x4a,
0xf1, 0x6d, 0xfe, 0xb0, 0xf4, 0xac, 0x46, 0x5b, 0x07, 0x77, 0x76, 0x72, 0xcd, 0xb3, 0x98, 0x95,
0x16, 0xf7, 0xdf, 0xb7, 0x22, 0x7b, 0x78, 0xc7, 0x04, 0xa7, 0xd9, 0x59, 0xef, 0xcb, 0xf2, 0x28,
0x1e, 0xc4, 0x57, 0xd4, 0x70, 0xe8, 0xf5, 0x4c, 0x41, 0xe7, 0xa0, 0x5f, 0x45, 0x20, 0x17, 0xdc,
0x37, 0xf3, 0x3e, 0x04, 0x40, 0x02, 0x8e, 0x2a, 0x60, 0xf3, 0x4c, 0x44, 0x85, 0x50, 0x16, 0x7c,
0xd6, 0x2b, 0x20, 0x03, 0x73, 0xa3, 0xce, 0xa7, 0xf6, 0x9e, 0xe7, 0xd3, 0xc8, 0xa6, 0x43, 0xbb,
0x66, 0x44, 0xe2, 0x78, 0x85, 0x98, 0x52, 0x5c, 0xf1, 0xc1, 0x0f, 0x81, 0x81, 0x79, 0x53, 0xa9,
0x67, 0x56, 0xf2, 0xe8, 0xa3, 0x59, 0x35, 0xfc, 0xdf, 0x5f, 0x14, 0x8b, 0x8b, 0xfa, 0x61, 0x9f,
0x1e, 0x7d, 0x33, 0x92, 0xaa, 0x5f, 0xec, 0x51, 0x12, 0x53, 0x47, 0xdc, 0xa4, 0xf4, 0xbe, 0xda,
0x6d, 0xf6, 0xb4, 0x25, 0x8c, 0x7e, 0x7f, 0xaf, 0x83, 0x7a, 0xce, 0xb0, 0xca, 0xc3, 0x70, 0xaa,
0xdd, 0x57, 0x3b, 0x61, 0xd3, 0xeb, 0xbe, 0xab, 0xc3, 0x33, 0xea, 0xa0, 0xf6, 0xc0, 0xca, 0xd3,
0xe9, 0xbd, 0x8b, 0x67, 0xd0, 0x0f, 0xfa, 0x9c, 0x6e, 0x73, 0x53, 0xac, 0x9e, 0x23, 0x36, 0xfe,
0x69, 0xcd, 0x9d, 0x89, 0x51, 0xb9, 0x80, 0x05, 0xc5, 0xc5, 0xc3, 0xb7, 0x0d, 0x38, 0x3d, 0x22,
0x02, 0x7c, 0x90, 0x8b, 0xc5, 0xcf, 0x7b, 0xb2, 0xf9, 0xe4, 0x48, 0x1b, 0xb9, 0xe0, 0xa7, 0x5b,
0x99, 0xd0, 0xe1, 0x2d, 0x5c, 0xdb, 0xe2, 0x72, 0x15, 0x27, 0x8b, 0xb3, 0x88, 0xd4, 0x98, 0x14,
0xa0, 0x3a, 0x95, 0x79, 0xc2, 0x10, 0x1b, 0x46, 0xfc, 0x96, 0x36, 0xe4, 0x45, 0x21, 0xb2, 0xfc,
0xf7, 0x33, 0x63, 0xb9, 0xc1, 0xce, 0x26, 0xfb, 0x74, 0x6b, 0xfe, 0x89, 0x3f, 0x47, 0xb1, 0x3f,
0x8a, 0x07, 0x52, 0xd5, 0x4a, 0xd9, 0xca, 0x80, 0x01, 0x2b, 0x2b, 0x6c, 0x76, 0xdc, 0xf9, 0x5f,
0xe3, 0x62, 0x75, 0x26, 0x0f, 0xa9, 0x4b, 0x73, 0xf9, 0xe6, 0x9b, 0x33, 0xd0, 0x52, 0x1e, 0x08,
0x6f, 0xd8, 0x8f, 0xf8, 0xa5, 0xf8, 0x60, 0x2e, 0x04, 0x1d, 0xdf, 0x32, 0xe8, 0xb9, 0x6f, 0x76,
0x80, 0x01, 0xc7, 0x35, 0x14, 0x7d, 0x7e, 0xfd, 0x11, 0x20, 0x4f, 0xf1, 0x34, 0x26, 0x99, 0x52,
0x8d, 0xe3, 0x3a, 0x12, 0xc2, 0x51, 0xa9, 0xc7, 0x5f, 0xaa, 0xa3, 0xf6, 0x96, 0xfc, 0x7a, 0xa8,
0xf7, 0x01, 0x68, 0xe8, 0xdd, 0xce, 0x9e, 0xf4, 0xed, 0x5d, 0x18, 0x3d, 0x7b, 0x11, 0xaf, 0xf5,
0xb9, 0x3c, 0x3e, 0x04, 0x9f, 0x67, 0xf3, 0x59, 0xef, 0xd9, 0xf3, 0x13, 0x80, 0x9f, 0x3f, 0xe3,
0x1c, 0xb0, 0x09, 0x31, 0x17, 0xc5, 0xcb, 0xa2, 0xc8, 0xe2, 0xeb, 0xdb, 0x02, 0x32, 0xe7, 0xad,
0x71, 0x84, 0xca, 0x9e, 0x22, 0x50, 0x7f, 0x06, 0x70, 0xd0, 0x0e, 0x56, 0x88, 0x66, 0xf2, 0xd7,
0x05, 0x28, 0x50, 0xd4, 0xdd, 0xaa, 0x74, 0x04, 0x3f, 0xf2, 0xb2, 0x34, 0x7c, 0x45, 0x21, 0x43,
0x75, 0x7e, 0xd4, 0x53, 0x2c, 0xe2, 0x3b, 0xe8, 0x59, 0xde, 0x1a, 0x02, 0x3e, 0xd3, 0xec, 0x49,
0x6a, 0xf8, 0x38, 0xf3, 0x73, 0x70, 0x2d, 0x6f, 0xb3, 0x7a, 0x5e, 0x6c, 0x64, 0x2b, 0x6e, 0x62,
0xd6, 0x75, 0xf6, 0xb8, 0x67, 0x5a, 0x79, 0x68, 0x12, 0x1d, 0x48, 0x4d, 0x9f, 0x8a, 0xee, 0x35,
0x9d, 0x4f, 0x81, 0x51, 0x9b, 0xc6, 0xc7, 0xe0, 0x37, 0x47, 0xc1, 0xd3, 0x31, 0x3e, 0x0c, 0xb0,
0x69, 0x0f, 0x20, 0xcb, 0x5b, 0xd0, 0x36, 0xcc, 0x68, 0xfd, 0x69, 0x07, 0xf8, 0x5c, 0xaf, 0xcc,
0xe5, 0x50, 0xf1, 0xd1, 0xa1, 0x22, 0x8c, 0xa3, 0xb2, 0xa8, 0xb8, 0x8b, 0x7d, 0xf4, 0x11, 0x01,
0x98, 0xc3, 0xbc, 0x6b, 0x37, 0xd0, 0x5f, 0x10, 0x1c, 0x72, 0x39, 0x6e, 0x63, 0x2e, 0x8f, 0xdd,
0xf7, 0xa8, 0xa6, 0xce, 0x97, 0xf8, 0x84, 0x27, 0xe7, 0xd3, 0x77, 0x6f, 0x91, 0x33, 0x31, 0x7d,
0xe5, 0x27, 0x0f, 0x4d, 0xfa, 0xe0, 0xe6, 0x37, 0xcd, 0x88, 0x55, 0x33, 0x16, 0x21, 0xd5, 0x06,
0xec, 0x9f, 0x36, 0x7d, 0xc3, 0x2f, 0xce, 0x87, 0x86, 0x01, 0xf3, 0x19, 0x23, 0xc9, 0xbd, 0x7f,
0xfe, 0x13, 0xbe, 0x64, 0x57, 0x95, 0xb8, 0xbd, 0x49, 0xef, 0x27, 0x69, 0x10, 0x3d, 0xd3, 0xb6,
0x6d, 0xb1, 0x37, 0x6b, 0x36, 0xa8, 0xc0, 0x02, 0xff, 0x2c, 0x16, 0x4d, 0xaf, 0x73, 0xf6, 0x8b,
0x30, 0xa3, 0x0f, 0xe6, 0x86, 0xc2, 0x5c, 0xbc, 0x3c, 0x13, 0x8d, 0x01, 0x6b, 0x7e, 0xa6, 0x7f,
0xd4, 0xed, 0x44, 0x53, 0x91, 0x20, 0xb3, 0x44, 0xe7, 0x2f, 0xc4, 0xa1, 0xbf, 0x91, 0x46, 0xd5,
0x3f, 0x00, 0x5d, 0xa3, 0xa5, 0x9f, 0xcf, 0x1a, 0x86, 0x84, 0xc8, 0xd9, 0x67, 0x98, 0x87, 0x08,
0x65, 0xd1, 0xbd, 0x35, 0xa7, 0x7c, 0x4e, 0xb2, 0xec, 0xb8, 0xbe, 0xf0, 0x27, 0x10, 0x75, 0x9d,
0xa9, 0xe1, 0x6b, 0x83, 0x0b, 0xeb, 0xb3, 0xbe, 0x79, 0x97, 0xc6, 0x8b, 0x2a, 0x27, 0xa7, 0x33,
0x2c, 0x2d, 0x99, 0xed, 0x3b, 0xc7, 0xff, 0x47, 0x74, 0x17, 0xc9, 0xb3, 0x1a, 0x1a, 0x8d, 0xf4,
0x38, 0x1a, 0xaa, 0x9d, 0xc6, 0x23, 0xfd, 0x17, 0xf0, 0x48, 0x8f, 0xe0, 0x41, 0xbf, 0xf1, 0x03,
0x0c, 0xe8, 0x56, 0xc1, 0x3a, 0x2b, 0x4e, 0x3b, 0x9f, 0xb6, 0x7b, 0x63, 0xe3, 0xc9, 0xd2, 0xfb,
0xde, 0xf3, 0x8d, 0x0c, 0x17, 0x60, 0x9b, 0x2d, 0x0f, 0x9d, 0xf4, 0xe8, 0x83, 0x2e, 0x0a, 0xc8,
0x15, 0xca, 0x34, 0x56, 0xcb, 0xac, 0x0b, 0x25, 0x2a, 0x04, 0x0c, 0x78, 0x8a, 0xc8, 0x3c, 0x2e,
0x12, 0x3e, 0x0b, 0x08, 0x56, 0x80, 0x98, 0x13, 0x58, 0x72, 0xee, 0xd3, 0x8d, 0xa7, 0x60, 0x0c,
0xbb, 0xbc, 0x33, 0xcf, 0x44, 0x30, 0x5b, 0xb9, 0x4e, 0x53, 0x4c, 0x73, 0x36, 0x98, 0xac, 0x50,
0x45, 0xba, 0x34, 0x36, 0x1c, 0x4a, 0xbb, 0xba, 0xe8, 0xe3, 0xb7, 0x3d, 0x02, 0xda, 0xf2, 0x02,
0xfa, 0x28, 0xae, 0xf4, 0xb7, 0x0a, 0x23, 0x6a, 0xa6, 0x92, 0xdd, 0xcd, 0xa1, 0xe3, 0xa8, 0x1d,
0xf6, 0x27, 0x7c, 0xe4, 0x21, 0xc9, 0xfe, 0x94, 0xb8, 0x72, 0xdc, 0x3d, 0xcb, 0x70, 0x70, 0xe0,
0x9f, 0x1b, 0xe7, 0x7a, 0x15, 0x90, 0x13, 0x2a, 0xb6, 0x05, 0xc1, 0x98, 0x0f, 0x1e, 0x81, 0xa2,
0xb8, 0x6e, 0xa6, 0x36, 0x31, 0xe9, 0x52, 0xfd, 0x4c, 0xa4, 0x20, 0x97, 0xd6, 0x90, 0x62, 0xab,
0x20, 0x6a, 0x17, 0xa4, 0x6d, 0x7f, 0x4e, 0x99, 0xeb, 0x62, 0xf1, 0x03, 0xd1, 0x5d, 0x3a, 0xc5,
0xa2, 0xbf, 0xd7, 0x76, 0x5b, 0xa8, 0x59, 0xc0, 0xe6, 0x90, 0xbd, 0x75, 0xa6, 0xb6, 0x7d, 0x35,
0xa3, 0x6b, 0xc1, 0x3b, 0xb1, 0xb8, 0x4f, 0xb2, 0x99, 0xaa, 0x9b, 0x34, 0xe9, 0x28, 0x5d, 0x89,
0xff, 0x9b, 0x6f, 0x8e, 0x88, 0x5f, 0xc7, 0x73, 0x88, 0x98, 0x7d, 0x63, 0x5d, 0x65, 0x80, 0xfd,
0x46, 0x62, 0x9f, 0xf7, 0x4f, 0x68, 0xaa, 0x4a, 0xc6, 0x8f, 0xa9, 0xaa, 0x06, 0x51, 0xb9, 0x5a,
0xa1, 0x66, 0x12, 0xc7, 0xf3, 0x03, 0xe9, 0xb2, 0x39, 0x45, 0x68, 0x52, 0x96, 0x2b, 0x6e, 0x8a,
0x56, 0x7e, 0x9c, 0x73, 0xf2, 0x55, 0xf2, 0xda, 0x96, 0x38, 0x89, 0xc5, 0x11, 0x23, 0xa5, 0xd1,
0x17, 0xb3, 0x37, 0x51, 0xb1, 0xb2, 0xf9, 0x33, 0x5a, 0x4d, 0xe7, 0xbf, 0x9f, 0xb9, 0xe7, 0xe8,
0x5c, 0x88, 0x6d, 0xbf, 0x7f, 0x5e, 0x3d, 0x4f, 0x1f, 0x63, 0x5e, 0xbb, 0x9e, 0x7a, 0xf5, 0x4c,
0xd5, 0xfb, 0xa0, 0x76, 0x1d, 0x6f, 0xa8, 0x12, 0xb7, 0x8e, 0xba, 0xe8, 0x13, 0xd7, 0x45, 0x9f,
0x2a, 0x72, 0x7e, 0xe4, 0x61, 0xce, 0x30, 0xcb, 0x2c, 0xd2, 0xef, 0xe3, 0x4f, 0x62, 0x71, 0xe6,
0xf7, 0xf7, 0x1d, 0x3a, 0xc7, 0xa9, 0x43, 0xf6, 0x88, 0x95, 0x65, 0x07, 0xf6, 0x51, 0x7e, 0xdd,
0x03, 0x42, 0xb2, 0xb6, 0x6a, 0x67, 0x6d, 0xf3, 0x68, 0x32, 0x34, 0xeb, 0xef, 0xf7, 0x02, 0xf1,
0x74, 0xa1, 0xfc, 0xb1, 0xce, 0x3c, 0xfb, 0xa4, 0x70, 0xdd, 0x49, 0x72, 0x23, 0x71, 0x3c, 0xa0,
0x02, 0x39, 0x80, 0x66, 0xeb, 0x17, 0xe5, 0x4a, 0x8b, 0xf4, 0x6b, 0xb5, 0xf7, 0xd2, 0x69, 0xd5,
0xca, 0xd4, 0x3c, 0x90, 0x16, 0x75, 0xcb, 0xd2, 0x7f, 0xfe, 0x53, 0x74, 0x65, 0x2c, 0xab, 0x68,
0x73, 0x03, 0xf9, 0xb1, 0x22, 0xea, 0xec, 0xb9, 0x36, 0x9b, 0xff, 0x50, 0xaa, 0xcf, 0xac, 0x2c,
0x65, 0x49, 0x00, 0xf5, 0xc9, 0x49, 0x80, 0x67, 0xfd, 0x06, 0x44, 0x80, 0x02, 0x04, 0xe5, 0x2d,
0xff, 0xb5, 0xce, 0xbf, 0x62, 0x5c, 0x0e, 0x8e, 0x37, 0x87, 0x7a, 0xa8, 0x82, 0x73, 0x31, 0xdb,
0xed, 0xa7, 0x5a, 0xa5, 0x6a, 0xaa, 0x2f, 0x2a, 0xd5, 0x17, 0x35, 0xd5, 0x17, 0x95, 0xf2, 0xe2,
0x3e, 0xeb, 0x86, 0x8c, 0x5a, 0x68, 0xf1, 0x41, 0x25, 0x29, 0x38, 0xd7, 0x45, 0x9f, 0x0e, 0xeb,
0x22, 0x0a, 0x35, 0x4d, 0x32, 0x0b, 0xf6, 0x96, 0x46, 0xb3, 0x70, 0x4b, 0xbf, 0x02, 0xfc, 0x03,
0x14, 0x57, 0x21, 0xd8, 0x5a, 0xc8, 0x89, 0xee, 0x44, 0x63, 0x66, 0x5b, 0x4d, 0x5a, 0xff, 0x94,
0xa4, 0xd7, 0x67, 0xbf, 0xfc, 0x9f, 0x77, 0x3f, 0xfd, 0x48, 0xd3, 0x75, 0x24, 0xf8, 0xf1, 0xf2,
0x41, 0x4f, 0xc4, 0xcc, 0xcd, 0x6d, 0x92, 0x98, 0x5e, 0xff, 0x83, 0xb9, 0x23, 0xfd, 0x98, 0xf4,
0xa0, 0xcc, 0xc8, 0x5f, 0x79, 0x3e, 0x7b, 0x4e, 0x73, 0xd4, 0xde, 0x1e, 0x88, 0x33, 0x98, 0xef,
0x91, 0xbc, 0x7f, 0x87, 0x8c, 0x79, 0xaa, 0x3d, 0x8d, 0x4c, 0xa0, 0xe1, 0xd3, 0xcc, 0x5e, 0x7d,
0xc2, 0x0b, 0x6a, 0xe4, 0x84, 0xb7, 0xc7, 0xdf, 0xc9, 0xf6, 0xcc, 0x1d, 0x70, 0x5a, 0xa5, 0x8b,
0x49, 0xef, 0xed, 0x4f, 0xef, 0x7e, 0xee, 0x99, 0x94, 0xc7, 0x4c, 0x8a, 0x7d, 0x63, 0x36, 0x4c,
0xfa, 0xdc, 0x9a, 0x0d, 0x1f, 0xae, 0x63, 0xf2, 0xd1, 0xf5, 0x54, 0xe7, 0xb2, 0xbd, 0x77, 0xa2,
0x28, 0x40, 0x4c, 0xce, 0xa4, 0x2f, 0x8c, 0xfc, 0x76, 0x3e, 0x47, 0xcb, 0x25, 0xe8, 0x79, 0x30,
0xc0, 0x90, 0x25, 0x8c, 0x6d, 0x65, 0xac, 0x31, 0x93, 0xcf, 0x1e, 0xbe, 0xa0, 0x55, 0x4b, 0xb9,
0x72, 0x49, 0x6e, 0x51, 0xa3, 0x47, 0x1d, 0x7b, 0x8f, 0xe1, 0x81, 0x0e, 0xb6, 0x5c, 0xe4, 0xd2,
0xaf, 0x15, 0xd3, 0x17, 0xa9, 0xda, 0x88, 0xa7, 0xd9, 0x79, 0x9d, 0xe5, 0x25, 0xaf, 0x44, 0xc9,
0x2b, 0x5e, 0x02, 0x33, 0x5b, 0x6b, 0x61, 0x7d, 0xb3, 0x6a, 0xd0, 0x58, 0xcc, 0xac, 0xad, 0x6b,
0x1d, 0x36, 0x2c, 0x3f, 0x18, 0x92, 0x4d, 0xab, 0xd7, 0x72, 0xd9, 0x4d, 0xba, 0x3e, 0x68, 0x78,
0x07, 0xeb, 0x85, 0x99, 0x09, 0xf9, 0x03, 0x10, 0x13, 0x4c, 0xc8, 0x92, 0x04, 0x39, 0xde, 0x7e,
0xfa, 0x94, 0x75, 0x90, 0x92, 0x6f, 0xea, 0x73, 0x17, 0xa4, 0x80, 0x9a, 0x51, 0x1d, 0x6b, 0xda,
0xb4, 0x4a, 0x72, 0x99, 0x2e, 0x10, 0x9a, 0x28, 0x41, 0x2d, 0x6e, 0x73, 0x53, 0xb3, 0x77, 0xdf,
0xef, 0xea, 0xe6, 0x39, 0xce, 0x6c, 0x36, 0xd3, 0xbd, 0xbe, 0x3d, 0x14, 0xbf, 0x62, 0xb5, 0xa0,
0xc4, 0x94, 0x3e, 0x70, 0xff, 0xf9, 0x87, 0xff, 0x30, 0xee, 0xe3, 0x24, 0xd1, 0x8b, 0xd9, 0xc6,
0x26, 0xbd, 0xe7, 0x6f, 0x61, 0x8d, 0xff, 0xa4, 0x8f, 0xdd, 0x48, 0x0c, 0x3f, 0xbc, 0x35, 0xe2,
0xdc, 0xa0, 0x19, 0xdd, 0xe4, 0x10, 0xde, 0xab, 0x2c, 0x4b, 0xb3, 0x72, 0x51, 0x9c, 0x5e, 0x48,
0x6d, 0xe6, 0xa5, 0x40, 0x27, 0x00, 0x76, 0x81, 0xbe, 0xb4, 0x02, 0x75, 0x7d, 0x51, 0x69, 0xd0,
0xaf, 0x5d, 0x61, 0x2d, 0xe7, 0x81, 0x44, 0x25, 0x7c, 0xd2, 0x57, 0x94, 0x82, 0xf1, 0x37, 0xf2,
0x9d, 0xbc, 0xae, 0x7e, 0x35, 0x02, 0x43, 0x75, 0x2f, 0x53, 0xbe, 0x4c, 0x12, 0x9e, 0xf8, 0x36,
0x33, 0x08, 0xd1, 0x01, 0x4c, 0x7d, 0x2b, 0xcf, 0x5a, 0x5f, 0xba, 0xee, 0xf6, 0xd4, 0x56, 0xb5,
0x39, 0x35, 0x98, 0xad, 0xd7, 0x17, 0x4e, 0x8c, 0xd9, 0x5a, 0xf8, 0xa9, 0xad, 0x07, 0xdf, 0x74,
0xcf, 0xba, 0xfb, 0x27, 0x54, 0xad, 0xa7, 0x3f, 0xfe, 0x47, 0xec, 0xaa, 0xaf, 0x2b, 0x2b, 0xcf,
0xdd, 0x0a, 0xe9, 0xdf, 0xa9, 0xd7, 0xef, 0xb3, 0xe8, 0x86, 0x63, 0x7b, 0x7f, 0xda, 0x4c, 0x87,
0xc0, 0x73, 0xf5, 0x61, 0x53, 0xef, 0xa9, 0xa8, 0xb5, 0xc2, 0x7c, 0x1d, 0xc2, 0xf1, 0x75, 0x46,
0x76, 0xdb, 0x47, 0x9a, 0xd6, 0xf9, 0xd3, 0xd8, 0xd4, 0xa1, 0xe3, 0xb7, 0x72, 0x29, 0xb2, 0x4b,
0x2f, 0xb8, 0x5b, 0x5d, 0x29, 0xf6, 0xc4, 0x02, 0xfe, 0xfa, 0xe0, 0x32, 0x4a, 0x12, 0xfa, 0xe9,
0x93, 0x6a, 0x4b, 0xa9, 0xbf, 0xab, 0x6d, 0x18, 0x1d, 0xa8, 0x3c, 0x92, 0x44, 0x33, 0xe7, 0x81,
0x1a, 0xdf, 0x81, 0x34, 0x97, 0xf9, 0xcc, 0x5a, 0x35, 0xf9, 0x8b, 0xe6, 0x4a, 0x3c, 0xd7, 0xd6,
0xbf, 0xd7, 0x41, 0x35, 0x8d, 0x33, 0xfb, 0xc2, 0x69, 0xad, 0xe2, 0xc8, 0x19, 0xa3, 0xfc, 0x71,
0x37, 0xda, 0x10, 0xbb, 0xcd, 0xce, 0xfc, 0xed, 0xa7, 0x7e, 0x4f, 0xce, 0x6a, 0x1d, 0xa4, 0x24,
0xf9, 0xb7, 0x67, 0x4d, 0x32, 0x72, 0x02, 0xa1, 0x3f, 0xee, 0x38, 0xc1, 0xe6, 0xfe, 0xe4, 0x58,
0xbb, 0x4e, 0x1e, 0x1f, 0x7e, 0xa9, 0x21, 0x24, 0x13, 0x3a, 0xe9, 0x70, 0x4f, 0xd2, 0x51, 0x43,
0xbf, 0x81, 0xfb, 0x37, 0xdf, 0x88, 0x6f, 0xbe, 0x69, 0x94, 0xd4, 0x77, 0x22, 0x94, 0x87, 0x7a,
0xf5, 0xee, 0x6d, 0x23, 0x4a, 0x3c, 0x75, 0x35, 0x59, 0x75, 0x3f, 0xb2, 0x92, 0xdc, 0x11, 0xb3,
0x3a, 0x3e, 0x78, 0x32, 0xff, 0xbf, 0xec, 0x0b, 0x36, 0x3c, 0x9f, 0xfc, 0xb5, 0x13, 0x5a, 0xc5,
0xad, 0x6f, 0x55, 0xd6, 0x57, 0x54, 0xe9, 0x96, 0xff, 0xe2, 0x7c, 0xd0, 0x19, 0x06, 0x5e, 0xff,
0xcc, 0xbf, 0xf3, 0x00, 0xf3, 0x4d, 0x37, 0xd4, 0x7b, 0x16, 0xe5, 0x0f, 0x9b, 0x39, 0xa7, 0x73,
0x7a, 0xeb, 0xe6, 0x48, 0x2e, 0x12, 0xaf, 0x49, 0x8a, 0x98, 0x60, 0x4d, 0x69, 0x17, 0x2b, 0x62,
0xbc, 0x9f, 0x94, 0x87, 0x4c, 0xcb, 0xdd, 0x59, 0xdb, 0xb6, 0x75, 0x5a, 0x74, 0xb8, 0x76, 0x8c,
0x84, 0x93, 0xa5, 0x61, 0xb6, 0x33, 0x2d, 0xb5, 0x05, 0xa6, 0x36, 0x97, 0x52, 0x28, 0x8b, 0xa0,
0x60, 0x42, 0x9b, 0xb7, 0x7b, 0x93, 0x54, 0x37, 0x5a, 0xbc, 0xcc, 0x09, 0x59, 0x12, 0x37, 0x0a,
0xd5, 0xe2, 0x33, 0xfd, 0xa6, 0x46, 0xc3, 0xb6, 0xd4, 0x41, 0x7c, 0xbd, 0x38, 0x2d, 0x1e, 0x44,
0xbb, 0xfa, 0xd5, 0x83, 0xd0, 0xb5, 0xf2, 0xd3, 0xf3, 0x76, 0x03, 0x3e, 0xe8, 0xa1, 0x9b, 0xd0,
0x56, 0x62, 0xbb, 0x01, 0x1d, 0x75, 0xd5, 0xf5, 0x3a, 0x8a, 0xb7, 0x9a, 0xa8, 0x30, 0x5b, 0x42,
0x91, 0x39, 0x52, 0x13, 0x0a, 0xca, 0x74, 0xbd, 0xd2, 0x98, 0x76, 0x13, 0xa5, 0x5b, 0xd4, 0xaa,
0xf6, 0x21, 0xd5, 0xc1, 0x58, 0xa5, 0x9e, 0x1e, 0x5d, 0xe4, 0x57, 0xfb, 0x00, 0x4f, 0x5a, 0xb2,
0x3f, 0xfd, 0x3b, 0x3b, 0x6a, 0xeb, 0x57, 0xfe, 0x5e, 0x0a, 0x2d, 0xc3, 0x1e, 0x5d, 0xb9, 0x55,
0x3e, 0x99, 0xdb, 0x97, 0x5f, 0x41, 0x9f, 0xea, 0x51, 0xdb, 0x1a, 0xe6, 0x4e, 0xf5, 0x2f, 0x8b,
0x4f, 0xf5, 0xab, 0xe7, 0x8f, 0x72, 0xb4, 0xea, 0x8b, 0xd1, 0x93, 0x18, 0x36, 0x54, 0xb0, 0x5f,
0xee, 0x7e, 0x37, 0x7e, 0x01, 0xe2, 0x31, 0x12, 0xeb, 0x67, 0x09, 0x24, 0x08, 0xf1, 0x38, 0xc6,
0xad, 0x55, 0x6d, 0xfe, 0x89, 0x9b, 0x5f, 0xd1, 0xbe, 0xd2, 0x96, 0xa3, 0x3d, 0x2a, 0x5f, 0xd9,
0x37, 0x95, 0x4b, 0x3c, 0x6c, 0x4b, 0xe2, 0x65, 0xb6, 0xb7, 0xb8, 0xd0, 0x62, 0xfc, 0x22, 0xce,
0x69, 0x67, 0x70, 0xa1, 0xa2, 0xd3, 0x49, 0xce, 0xc8, 0x85, 0x27, 0x39, 0x07, 0xa6, 0x4c, 0xb4,
0x23, 0x09, 0xb7, 0x13, 0xde, 0xeb, 0xfc, 0xf6, 0xe4, 0x40, 0x93, 0x53, 0xb5, 0x2e, 0x1c, 0xe4,
0xf4, 0xc5, 0xb9, 0xfa, 0xa2, 0xaf, 0xf9, 0x7d, 0x5f, 0xf5, 0x35, 0x60, 0x99, 0xdd, 0x1c, 0x60,
0xf9, 0xec, 0xbb, 0x9f, 0xde, 0xa8, 0xc5, 0x1f, 0xfa, 0xae, 0x56, 0x2c, 0x9e, 0x99, 0xc6, 0x59,
0xdf, 0x98, 0x5d, 0x18, 0xbb, 0xe6, 0x07, 0x86, 0xd2, 0x59, 0xaa, 0x5f, 0x77, 0x52, 0x2b, 0x1e,
0xc6, 0xec, 0xe8, 0x41, 0x93, 0x67, 0xaa, 0xe5, 0xb3, 0xfe, 0xb4, 0x09, 0x47, 0x7a, 0xd0, 0x67,
0xe7, 0x65, 0xfd, 0xe1, 0xe7, 0x92, 0x32, 0xee, 0xa8, 0x0c, 0x45, 0x10, 0x2e, 0xfa, 0x59, 0x87,
0xa6, 0x63, 0x7d, 0xf4, 0x8f, 0x4f, 0x1d, 0xa2, 0xaf, 0xff, 0x6b, 0x12, 0x50, 0x5f, 0xfb, 0x02,
0x31, 0xaa, 0x72, 0x7a, 0xd8, 0x75, 0xdf, 0x35, 0xa4, 0x72, 0xd3, 0x9c, 0xe8, 0x1f, 0x1f, 0xb1,
0xe9, 0xc3, 0x9f, 0x7d, 0x2f, 0x56, 0x89, 0xc8, 0x8c, 0x6b, 0x11, 0xaf, 0x8d, 0x97, 0xd7, 0xd9,
0xed, 0x12, 0xb1, 0x8f, 0xbe, 0x72, 0x7e, 0x2f, 0xc7, 0x9e, 0x80, 0xff, 0xdc, 0xb2, 0xcd, 0x37,
0x89, 0x45, 0xad, 0xb0, 0x7c, 0xa9, 0x49, 0x1f, 0xf3, 0x0a, 0xf9, 0x5b, 0x3f, 0xfc, 0x23, 0x68,
0xf4, 0x3f, 0x00, 0xfa, 0x7f, 0xc0, 0xae, 0x3b, 0xd0, 0x18, 0x68, 0x00, 0x00
};