Implemented time triggers logic

Frontend needs quite a bit of work still
This commit is contained in:
Mark van Renswoude 2018-01-14 13:56:18 +01:00
parent 4c4b20c2e1
commit f6808c4833
11 changed files with 2510 additions and 2369 deletions

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,6 @@ const uint8_t VersionMetadata = 17;
const char VersionBranch[] = "release/2.0";
const char VersionSemVer[] = "2.0.0-beta.1";
const char VersionFullSemVer[] = "2.0.0-beta.1+17";
const char VersionCommitDate[] = "2018-01-12";
const char VersionCommitDate[] = "2018-01-14";
#endif

View File

@ -192,13 +192,11 @@ void loop()
updateLED();
updateNTPClient();
// if motionTriggerEnabled || timeTriggerEnabled
// {
// TODO check for active time trigger every 10 seconds or so
// updateTimeTrigger();
if (timeTriggerSettings->enabled() /*|| motionTriggerEnabled*/)
{
updateTimeTrigger();
checkTriggers();
// }
}
stairs->tick();
}
@ -397,12 +395,43 @@ void updateNTPClient()
}
uint32_t lastTimeTriggerChecked = 0;
TimeTrigger* lastTimeTrigger = nullptr;
TimeTrigger* activeTimeTrigger = nullptr;
void updateTimeTrigger()
{
// TODO check active time trigger
if (ntpClient == nullptr || !timeTriggerSettings->enabled())
return;
if (currentTime - lastTimeTriggerChecked < 10000)
return;
lastTimeTriggerChecked = currentTime;
_dln("Triggers:: updating time trigger");
uint32_t epochTime = ntpClient->getEpochTime();
if (epochTime == 0)
{
_dln("Triggers:: time not synchronised yet");
return;
}
// TODO compensate for UTC
tmElements_t time;
breakTime(epochTime, time);
activeTimeTrigger = timeTriggerSettings->getActiveTrigger(time);
#ifdef SerialDebug
_d("Triggers:: active time trigger: ");
if (activeTimeTrigger != nullptr)
_dln(activeTimeTrigger->time);
else
_dln("null");
#endif
}
@ -431,17 +460,37 @@ void checkTriggers()
{
if (inMotionTrigger)
{
_dln("Triggers :: start motion trigger");
// Start sweep
bool sweepDown = true;
uint8_t stepsCount = stepsSettings->count();
uint16_t offset = sweepDown ? 0 : motionTransitionTime;
uint16_t offsetIncrement = stepsCount > 0 ? motionTransitionTime / stepsCount : 0;
for (uint8_t step = 0; step < stepsCount; step++)
{
stairs->set(step, motionBrightness, motionTransitionTime, offset);
if (sweepDown)
offset += offsetIncrement;
else
offset -= offsetIncrement;
}
}
else
{
if (inTimeTrigger)
{
_dln("Triggers :: motion stopped, falling back to time trigger");
// Fall back to time trigger value
stairs->setAll(activeTimeTrigger->brightness, motionTransitionTime, 0);
}
else
{
_dln("Triggers :: motion stopped, turning off");
// No more motion, no active time trigger, turn off
stairs->setAll(0, motionTransitionTime, 0);
}
@ -449,6 +498,8 @@ void checkTriggers()
}
else if (timeTriggerChanged && !inMotionTrigger)
{
_dln("Triggers :: time trigger changed");
// Set to time trigger value
stairs->setAll(activeTimeTrigger->brightness, timeTriggerSettings->transitionTime(), 0);
}

View File

@ -65,20 +65,23 @@ void SystemSettings::write()
void SystemSettings::toJson(Print &print)
{
DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5));
DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(6) + JSON_OBJECT_SIZE(5));
JsonObject& root = jsonBuffer.createObject();
JsonObject& pins = root.createNestedObject("Pins");
pins["LEDAP"] = pinLEDAP();
pins["LEDSTA"] = pinLEDSTA();
pins["APButton"] = pinAPButton();
pins["PWMSDA"] = pinPWMDriverSDA();
pins["PWMSCL"] = pinPWMDriverSCL();
root["lat"] = latitude();
root["lng"] = longitude();
root["PWMAddress"] = pwmDriverAddress();
root["PWMFrequency"] = pwmDriverFrequency();
root["MapsAPIKey"] = mapsAPIKey();
JsonObject& pins = root.createNestedObject("pins");
pins["ledAP"] = pinLEDAP();
pins["ledSTA"] = pinLEDSTA();
pins["apButton"] = pinAPButton();
pins["pwmSDA"] = pinPWMDriverSDA();
pins["pwmSCL"] = pinPWMDriverSCL();
root["pwmAddress"] = pwmDriverAddress();
root["pwmFrequency"] = pwmDriverFrequency();
root["mapsAPIKey"] = mapsAPIKey();
root.printTo(print);
}
@ -94,22 +97,25 @@ bool SystemSettings::fromJson(char* data, bool* changed)
if (changed != nullptr)
*changed = false;
DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + 160);
DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(6) + JSON_OBJECT_SIZE(5) + 316);
JsonObject& root = jsonBuffer.parseObject(data);
if (!root.success())
return false;
JsonObject& pins = root["Pins"];
uint8_t jsonPinLEDAP = pins["LEDAP"];
uint8_t jsonPinLEDSTA = pins["LEDSTA"];
uint8_t jsonPinAPButton = pins["APButton"];
uint8_t jsonPinPWMDriverSDA = pins["PWMSDA"];
uint8_t jsonPinPWMDriverSCL = pins["PWMSCL"];
double jsonLat = root["lat"];
double jsonLng = root["lng"];
uint8_t jsonPWMDriverAddress = root["PWMAddress"];
uint16_t jsonPWMDriverFrequency = root["PWMFrequency"];
const char* jsonMapAPIKey = root["MapsAPIKey"];
JsonObject& pins = root["pins"];
uint8_t jsonPinLEDAP = pins["ledAP"];
uint8_t jsonPinLEDSTA = pins["ledSTA"];
uint8_t jsonPinAPButton = pins["apButton"];
uint8_t jsonPinPWMDriverSDA = pins["pwmSDA"];
uint8_t jsonPinPWMDriverSCL = pins["pwmSCL"];
uint8_t jsonPWMDriverAddress = root["pwmAddress"];
uint16_t jsonPWMDriverFrequency = root["pwmFrequency"];
const char* jsonMapAPIKey = root["mapsAPIKey"];
if (jsonPinLEDAP == 0) jsonPinLEDAP = pinLEDAP();
if (jsonPinLEDSTA == 0) jsonPinLEDSTA = pinLEDSTA();
@ -128,8 +134,12 @@ bool SystemSettings::fromJson(char* data, bool* changed)
(jsonPinPWMDriverSCL != pinPWMDriverSCL()) ||
(jsonPWMDriverAddress != pwmDriverAddress()) ||
(jsonPWMDriverFrequency != pwmDriverFrequency()) ||
(jsonMapAPIKey != mapsAPIKey()))
(jsonMapAPIKey != mapsAPIKey()) ||
(jsonLat != latitude()) ||
(jsonLng != longitude()))
{
latitude(jsonLat);
longitude(jsonLng);
pinLEDAP(jsonPinLEDAP);
pinLEDSTA(jsonPinLEDSTA);
pinAPButton(jsonPinAPButton);

View File

@ -16,6 +16,9 @@
class SystemSettings : CharProperties
{
private:
double mLatitude = 0;
double mLongitude = 0;
uint8_t mPinLEDAP = 4;
uint8_t mPinLEDSTA = 5;
uint8_t mPinAPButton = 2;
@ -41,27 +44,33 @@ class SystemSettings : CharProperties
bool fromJson(char* data, bool* changed);
double latitude() { return mLatitude; }
void latitude(double value) { mLatitude = value; }
double longitude() { return mLongitude; }
void longitude(double value) { mLongitude = value; }
uint8_t pinLEDAP() { return mPinLEDAP; }
uint8_t pinLEDAP(uint8_t value) { mPinLEDAP = value; }
void pinLEDAP(uint8_t value) { mPinLEDAP = value; }
uint8_t pinLEDSTA() { return mPinLEDSTA; }
uint8_t pinLEDSTA(uint8_t value) { mPinLEDSTA = value; }
void pinLEDSTA(uint8_t value) { mPinLEDSTA = value; }
uint8_t pinAPButton() { return mPinAPButton; }
uint8_t pinAPButton(uint8_t value) { mPinAPButton = value; }
void pinAPButton(uint8_t value) { mPinAPButton = value; }
uint8_t pinPWMDriverSDA() { return mPinPWMDriverSDA; }
uint8_t pinPWMDriverSDA(uint8_t value) { mPinPWMDriverSDA = value; }
void pinPWMDriverSDA(uint8_t value) { mPinPWMDriverSDA = value; }
uint8_t pinPWMDriverSCL() { return mPinPWMDriverSCL; }
uint8_t pinPWMDriverSCL(uint8_t value) { mPinPWMDriverSCL = value; }
void pinPWMDriverSCL(uint8_t value) { mPinPWMDriverSCL = value; }
uint8_t pwmDriverAddress() { return mPWMDriverAddress; }
uint8_t pwmDriverAddress(uint8_t value) { mPWMDriverAddress = value; }
void pwmDriverAddress(uint8_t value) { mPWMDriverAddress = value; }
uint16_t pwmDriverFrequency() { return mPWMDriverFrequency; }
uint16_t pwmDriverFrequency(uint16_t value) { mPWMDriverFrequency = value; }
void pwmDriverFrequency(uint16_t value) { mPWMDriverFrequency = value; }
char* mapsAPIKey() { return mMapsAPIKey; }

View File

@ -8,6 +8,8 @@
#include <string.h>
#include <FS.h>
#include "../../debug.h"
#include "../../global.h"
#include "../../praisethesun.h"
timeDayOfWeek_t toTimeDayOfWeek(DayOfWeek day)
@ -101,6 +103,81 @@ void TimeTriggerSettings::write()
}
TimeTrigger* TimeTriggerSettings::getActiveTrigger(tmElements_t &time)
{
if (mTriggerCount == 0)
return nullptr;
DayOfWeek dayOfWeek = toDayOfWeek((timeDayOfWeek_t)time.Wday);
DayOfWeek startDayOfWeek = dayOfWeek;
TimeTrigger* activeTrigger = nullptr;
int16_t activeTriggerTime = 0;
// TODO calculate sunrise and sunset
double sunrise = 0;
double sunset = 0;
sun_rise_set(tmYearToCalendar(time.Year), time.Month, time.Day,
systemSettings->latitude(), systemSettings->longitude(),
&sunrise, &sunset);
uint16_t sunriseMinutes = floor(sunrise * 60);
uint16_t sunsetMinutes = floor(sunset * 60);
uint16_t dayTime = (time.Hour * 60) + time.Minute;
_d("TimeTrigger :: sunrise: "); _dln(sunriseMinutes);
_d("TimeTrigger :: sunset: "); _dln(sunsetMinutes);
_d("TimeTrigger :: current time: "); _dln(dayTime);
do
{
for (uint16_t i = 0; i < mTriggerCount; i++)
{
TimeTrigger* trigger = &mTriggers[i];
if (trigger->enabled && (trigger->daysOfWeek & dayOfWeek))
{
int16_t triggerTime = trigger->time;
switch (trigger->triggerType)
{
RelativeToSunrise:
triggerTime += sunriseMinutes;
break;
RelativeToSunset:
triggerTime += sunsetMinutes;
break;
}
// Check if the current time is after the time set in the trigger, and
// if this trigger is later than any previously found trigger, so that
// we'll always get the most recent match
if (triggerTime < dayTime && (activeTrigger == nullptr || triggerTime > activeTriggerTime))
{
activeTrigger = trigger;
activeTriggerTime = triggerTime;
}
}
}
if (activeTrigger != nullptr)
return activeTrigger;
// If there are no active triggers on this day, go back
// one weekday and try again until we've come around completely
if (dayOfWeek == Monday)
dayOfWeek = Sunday;
else
dayOfWeek = (DayOfWeek)((uint8_t)dayOfWeek / 2);
} while (dayOfWeek != startDayOfWeek);
return nullptr;
}
void TimeTriggerSettings::beginSetTriggers(uint8_t count)
{
if (mTriggers != nullptr)
@ -119,6 +196,7 @@ void TimeTriggerSettings::setTrigger(uint8_t index, TimeTrigger* value)
void TimeTriggerSettings::endSetTriggers()
{
/* No need to sort, sunrise / sunset triggers already mess things up anyways
// Sort triggers by time of day
// Based on the Comb sort implementation by Rob Tillaart
// http://forum.arduino.cc/index.php?topic=280486.0
@ -148,4 +226,5 @@ void TimeTriggerSettings::endSetTriggers()
}
}
}
*/
}

View File

@ -57,6 +57,9 @@ class TimeTriggerSettings
void write();
TimeTrigger* getActiveTrigger(tmElements_t &time);
bool enabled() { return mEnabled; }
void enabled(bool value) { mEnabled = value; }

2
web/dist/bundle.js vendored

File diff suppressed because one or more lines are too long

View File

@ -92,9 +92,9 @@
<div v-for="(trigger, index) in triggers.time.triggers" class="trigger">
<!-- enabled -->
<input type="radio" value="0" :name="'triggerType' + index" :id="'triggerType0' + index"><label class="label-inline" :for="'triggerType0' + index">{{ $t('triggers.timeFixedTime') }}</label>
<input type="radio" value="1" :name="'triggerType' + index" :id="'triggerType1' + index"><label class="label-inline" :for="'triggerType1' + index">{{ $t('triggers.timeSunrise') }}</label>
<input type="radio" value="2" :name="'triggerType' + index" :id="'triggerType2' + index"><label class="label-inline" :for="'triggerType2' + index">{{ $t('triggers.timeSunset') }}</label>
<input type="radio" v-model="trigger.triggerType" value="0" :name="'triggerType' + index" :id="'triggerType0' + index"><label class="label-inline" :for="'triggerType0' + index">{{ $t('triggers.timeFixedTime') }}</label>
<input type="radio" v-model="trigger.triggerType" value="1" :name="'triggerType' + index" :id="'triggerType1' + index"><label class="label-inline" :for="'triggerType1' + index">{{ $t('triggers.timeSunrise') }}</label>
<input type="radio" v-model="trigger.triggerType" value="2" :name="'triggerType' + index" :id="'triggerType2' + index"><label class="label-inline" :for="'triggerType2' + index">{{ $t('triggers.timeSunset') }}</label>
<label :for="'time' + index">{{ $t('triggers.timeTime') }}</label>
<input type="number" :id="'time' + index" v-model.number="trigger.time">

View File

@ -142,6 +142,7 @@ var messages = {
timeFixedTime: 'Vaste tijd',
timeSunrise: 'Zonsopkomst',
timeSunset: 'Zonsondergang',
timeTime: 'Tijd in minuten',
motionTitle: 'Beweging'
},