summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--megaloggerHD/config.h61
-rw-r--r--megaloggerHD/datalogger.h280
-rw-r--r--megaloggerHD/images.h86
-rw-r--r--megaloggerHD/megaloggerHD.ino815
4 files changed, 1242 insertions, 0 deletions
diff --git a/megaloggerHD/config.h b/megaloggerHD/config.h
new file mode 100644
index 0000000..1b86f2f
--- /dev/null
+++ b/megaloggerHD/config.h
@@ -0,0 +1,61 @@
+#ifndef CONFIG_H_INCLUDED
+#define CONFIG_H_INCLUDED
+
+/**************************************
+* OBD-II Adapter options
+**************************************/
+#define OBD_ADAPTER_I2C
+//#define OBD_ADAPTER_UART
+#define OBD_PROTOCOL PROTO_AUTO
+
+/**************************************
+* Data logging options
+**************************************/
+// enable(1)/disable(0) data logging (if SD card is present)
+#define ENABLE_DATA_LOG 1
+#define SD_CS_PIN SS
+
+/**************************************
+* Data streaming options
+**************************************/
+// enable(1)/disable(0) data streaming
+#define ENABLE_DATA_OUT 1
+
+// uses software(1)/hardware(0) serial for data streaming
+#define RF_SERIAL Serial
+#define STREAM_BAUDRATE 115200 /* bps */
+
+// this defines the format of data streaming
+// FORMAT_BIN is required by Freematics OBD iOS App
+// FORMAT_TEXT for text-based, text names for PID
+#define STREAM_FORMAT FORMAT_TEXT
+
+/**************************************
+* GPS configuration
+**************************************/
+#define USE_GPS 1
+#define GPSUART Serial2
+#define MAX_GPS_PROCESS_TIME 50 /* ms */
+#define GPS_DATA_TIMEOUT 2000 /* ms */
+
+// GPS baudrate could be 38400bps or 115200bps
+#define GPS_BAUDRATE 115200 /* bps */
+
+/**************************************
+* Accelerometer & Gyro
+**************************************/
+#define ACC_DATA_RATIO 172
+#define GYRO_DATA_RATIO 256
+
+/**************************************
+* Timeout/interval options
+**************************************/
+#define ACC_DATA_INTERVAL 200 /* ms */
+
+/**************************************
+* LCD module (uncomment only one)
+**************************************/
+LCD_R61581 lcd; /* 3.5" CTE35IPS/R61581 based LCD */
+//LCD_Null lcd;
+
+#endif
diff --git a/megaloggerHD/datalogger.h b/megaloggerHD/datalogger.h
new file mode 100644
index 0000000..e1a6925
--- /dev/null
+++ b/megaloggerHD/datalogger.h
@@ -0,0 +1,280 @@
+/*************************************************************************
+* Freematics Data Logger Class
+* Distributed under GPL v2.0
+* Written by Stanley Huang <stanleyhuangyc@gmail.com>
+* Visit http://freematics.com for more information
+*************************************************************************/
+
+#define FORMAT_BIN 0
+#define FORMAT_TEXT 1
+
+typedef struct {
+ uint32_t time;
+ uint16_t pid;
+ uint8_t flags;
+ uint8_t checksum;
+ float value[3];
+} LOG_DATA_COMM;
+
+#define PID_GPS_LATITUDE 0xA
+#define PID_GPS_LONGITUDE 0xB
+#define PID_GPS_ALTITUDE 0xC
+#define PID_GPS_SPEED 0xD
+#define PID_GPS_HEADING 0xE
+#define PID_GPS_SAT_COUNT 0xF
+#define PID_GPS_TIME 0x10
+#define PID_GPS_DATE 0x11
+
+#define PID_ACC 0x20
+#define PID_GYRO 0x21
+#define PID_COMPASS 0x22
+#define PID_MEMS_TEMP 0x23
+#define PID_BATTERY_VOLTAGE 0x24
+
+#define PID_DATA_SIZE 0x80
+
+#define FILE_NAME_FORMAT "/DAT%05d.CSV"
+
+#if ENABLE_DATA_OUT
+
+#if USE_SOFTSERIAL
+SoftwareSerial SerialRF(A2, A3);
+#elif defined(RF_SERIAL)
+#define SerialRF RF_SERIAL
+#else
+#define SerialRF Serial
+#endif
+
+#endif
+
+#if ENABLE_DATA_LOG
+static File sdfile;
+#endif
+
+typedef struct {
+ uint8_t pid;
+ char name[3];
+} PID_NAME;
+
+const PID_NAME pidNames[] PROGMEM = {
+{PID_ACC, {'A','C','C'}},
+{PID_GYRO, {'G','Y','R'}},
+{PID_COMPASS, {'M','A','G'}},
+{PID_GPS_LATITUDE, {'L','A','T'}},
+{PID_GPS_LONGITUDE, {'L','N','G'}},
+{PID_GPS_ALTITUDE, {'A','L','T'}},
+{PID_GPS_SPEED, {'S','P','D'}},
+{PID_GPS_HEADING, {'C','R','S'}},
+{PID_GPS_SAT_COUNT, {'S','A','T'}},
+{PID_GPS_TIME, {'U','T','C'}},
+{PID_GPS_DATE, {'D','T','E'}},
+{PID_BATTERY_VOLTAGE, {'B','A','T'}},
+{PID_DATA_SIZE, {'D','A','T'}},
+};
+
+class CDataLogger {
+public:
+ CDataLogger()
+ {
+ m_lastDataTime = 0;
+#if ENABLE_DATA_CACHE
+ cacheBytes = 0;
+#endif
+ }
+ void initSender()
+ {
+#if ENABLE_DATA_OUT
+ SerialRF.begin(STREAM_BAUDRATE);
+#endif
+ }
+ byte genTimestamp(char* buf, bool absolute)
+ {
+ byte n;
+ if (absolute || dataTime >= m_lastDataTime + 60000) {
+ // absolute timestamp
+ n = sprintf(buf, "#%lu,", dataTime);
+ } else {
+ // incremental timestamp
+ n = sprintf(buf, "%u,", (unsigned int)(dataTime - m_lastDataTime));
+ }
+ return n;
+ }
+ void record(const char* buf, byte len)
+ {
+#if ENABLE_DATA_LOG
+#if STREAM_FORMAT == FORMAT_BIN
+ dataSize += sdfile.write(buf, len);
+#else
+ char tmp[12];
+ byte n = genTimestamp(tmp, dataSize == 0);
+ dataSize += sdfile.write(tmp, n);
+ dataSize += sdfile.write(buf, len);
+ sdfile.println();
+ dataSize += 3;
+#endif
+#endif
+ m_lastDataTime = dataTime;
+ }
+ void dispatch(const char* buf, byte len)
+ {
+#if ENABLE_DATA_CACHE
+ if (cacheBytes + len < MAX_CACHE_SIZE - 10) {
+ cacheBytes += genTimestamp(cache + cacheBytes, cacheBytes == 0);
+ memcpy(cache + cacheBytes, buf, len);
+ cacheBytes += len;
+ cache[cacheBytes++] = '\n';
+ cache[cacheBytes] = 0;
+ }
+#endif
+#if ENABLE_DATA_OUT
+ SerialRF.write(buf, len);
+ SerialRF.println();
+#endif
+ }
+ void logData(const char* buf, byte len)
+ {
+#if ENABLE_DATA_OUT
+#if STREAM_FORMAT != FORMAT_BIN
+ dispatch(buf, len);
+#endif
+#endif
+ record(buf, len);
+ }
+ void logData(uint16_t pid)
+ {
+ char buf[8];
+ byte len = translatePIDName(pid, buf);
+#if ENABLE_DATA_OUT
+#if STREAM_FORMAT != FORMAT_BIN
+ dispatch(buf, len);
+#endif
+#endif
+ record(buf, len);
+ }
+ void logData(uint16_t pid, int value)
+ {
+ char buf[16];
+ byte n = translatePIDName(pid, buf);
+ byte len = sprintf(buf + n, "%d", value) + n;
+#if STREAM_FORMAT == FORMAT_BIN
+ LOG_DATA_COMM ld = {dataTime, pid, 1, 0, value};
+ ld.checksum = getChecksum((char*)&ld, 12);
+ dispatch((const char*)&ld, 12);
+#else
+ dispatch(buf, len);
+#endif
+ record(buf, len);
+ }
+ void logData(uint16_t pid, int32_t value)
+ {
+ char buf[20];
+ byte n = translatePIDName(pid, buf);
+ byte len = sprintf(buf + n, "%ld", value) + n;
+#if ENABLE_DATA_OUT
+#if STREAM_FORMAT == FORMAT_BIN
+ LOG_DATA_COMM ld = {dataTime, pid, 1, 0, value};
+ ld.checksum = getChecksum((char*)&ld, 12);
+ dispatch((const char*)&ld, 12);
+#else
+ dispatch(buf, len);
+#endif
+#endif
+ record(buf, len);
+ }
+ void logData(uint16_t pid, uint32_t value)
+ {
+ char buf[20];
+ byte n = translatePIDName(pid, buf);
+ byte len = sprintf(buf + n, "%lu", value) + n;
+#if STREAM_FORMAT == FORMAT_BIN
+ LOG_DATA_COMM ld = {dataTime, pid, 1, 0, value};
+ ld.checksum = getChecksum((char*)&ld, 12);
+ dispatch((const char*)&ld, 12);
+#else
+ dispatch(buf, len);
+#endif
+ record(buf, len);
+ }
+ void logData(uint16_t pid, int value1, int value2, int value3)
+ {
+ char buf[24];
+ byte n = translatePIDName(pid, buf);
+ byte len = sprintf(buf + n, "%d,%d,%d", value1, value2, value3) + n;
+#if STREAM_FORMAT == FORMAT_BIN
+ LOG_DATA_COMM ld = {dataTime, pid, 3, 0, {value1, value2, value3}};
+ ld.checksum = getChecksum((char*)&ld, 20);
+ dispatch((const char*)&ld, 20);
+#else
+ dispatch(buf, len);
+#endif
+ record(buf, len);
+ }
+#if ENABLE_DATA_LOG
+ uint16_t openFile(uint16_t logFlags = 0, uint32_t dateTime = 0)
+ {
+ uint16_t fileIndex;
+ char filename[24] = "/FRMATICS";
+
+ dataSize = 0;
+ if (SD.exists(filename)) {
+ for (fileIndex = 1; fileIndex; fileIndex++) {
+ sprintf(filename + 9, FILE_NAME_FORMAT, fileIndex);
+ if (!SD.exists(filename)) {
+ break;
+ }
+ }
+ if (fileIndex == 0)
+ return 0;
+ } else {
+ SD.mkdir(filename);
+ fileIndex = 1;
+ sprintf(filename + 9, FILE_NAME_FORMAT, 1);
+ }
+
+ sdfile = SD.open(filename, FILE_WRITE);
+ if (!sdfile) {
+ return 0;
+ }
+ m_lastDataTime = dateTime;
+ return fileIndex;
+ }
+ void closeFile()
+ {
+ sdfile.close();
+ }
+ void flushFile()
+ {
+ sdfile.flush();
+ }
+#endif
+ uint32_t dataTime;
+ uint32_t dataSize;
+#if ENABLE_DATA_CACHE
+ char cache[MAX_CACHE_SIZE];
+ int cacheBytes;
+#endif
+private:
+ byte getChecksum(char* buffer, byte len)
+ {
+ uint8_t checksum = 0;
+ for (byte i = 0; i < len; i++) {
+ checksum ^= buffer[i];
+ }
+ return checksum;
+ }
+ byte translatePIDName(uint16_t pid, char* text)
+ {
+#if STREAM_FORMAT == FORMAT_TEXT && USE_FRIENDLY_PID_NAME
+ for (uint16_t n = 0; n < sizeof(pidNames) / sizeof(pidNames[0]); n++) {
+ uint16_t id = pgm_read_byte(&pidNames[n].pid);
+ if (pid == id) {
+ memcpy_P(text, pidNames[n].name, 3);
+ text[3] = ',';
+ return 4;
+ }
+ }
+#endif
+ return sprintf(text, "%X,", pid);
+ }
+ uint32_t m_lastDataTime;
+};
diff --git a/megaloggerHD/images.h b/megaloggerHD/images.h
new file mode 100644
index 0000000..8037fe2
--- /dev/null
+++ b/megaloggerHD/images.h
@@ -0,0 +1,86 @@
+const unsigned char PROGMEM frame0[78][78 * 2] = {
+{0xe3,0x20,0xec,0x5a,0xcb,0x5a,0x6a,0x4a,0x28,0x42,0xc7,0x39,0x86,0x31,0x25,0x29,0x04,0x21,0xa3,0x18,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x18,0xe3,0x20,0x04,0x21,0x65,0x29,0x86,0x31,0xc7,0x39,0x08,0x42,0x49,0x4a,0x8a,0x52,0xaa,0x5a,0xc4,0x18},
+{0xec,0x5a,0x8d,0x73,0xab,0x52,0x49,0x4a,0x29,0x42,0x07,0x42,0xa7,0x31,0x86,0x31,0x66,0x29,0x45,0x29,0x45,0x21,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x29,0x44,0x29,0x45,0x21,0x45,0x29,0x66,0x29,0xa6,0x39,0xc7,0x39,0x07,0x42,0x29,0x42,0x89,0x52,0x6d,0x6b,0xcb,0x5a},
+{0x2c,0x6b,0xcb,0x5a,0xe7,0x39,0x86,0x31,0x65,0x29,0x25,0x21,0x04,0x21,0xc3,0x18,0xa2,0x10,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0xa2,0x10,0xc3,0x18,0x04,0x21,0x25,0x29,0x86,0x31,0xa7,0x39,0xaa,0x5a,0xec,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xca,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x85,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x66,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0d,0x63,0xca,0x5a,0xc7,0x39,0x86,0x31,0x66,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0xaa,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0xaa,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0xaa,0x5a,0xcb,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x66,0x31,0x65,0x29,0x04,0x21,0xe3,0x18,0xa3,0x10,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x2d,0x63,0xcb,0x5a,0xc7,0x39,0xa6,0x39,0x66,0x29,0x24,0x29,0x04,0x19,0xc3,0x18,0x83,0x10,0x61,0x10,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x61,0x10,0xa3,0x10,0xc3,0x18,0x04,0x19,0x44,0x29,0x66,0x29,0xc7,0x39,0xcb,0x52,0xcb,0x5a},
+{0x0c,0x63,0x6e,0x73,0xaa,0x52,0x49,0x4a,0x28,0x4a,0xe8,0x41,0xc7,0x39,0x86,0x31,0x65,0x31,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x65,0x31,0x86,0x31,0xe7,0x39,0xe8,0x41,0x49,0x4a,0x8a,0x52,0x6d,0x73,0xcc,0x5a},
+{0xe4,0x18,0xeb,0x62,0xcb,0x5a,0x69,0x52,0x09,0x42,0xc7,0x39,0x86,0x29,0x44,0x29,0x04,0x19,0xc2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x45,0x29,0x86,0x31,0xc7,0x39,0x08,0x42,0x49,0x4a,0xaa,0x5a,0xcb,0x52,0xc3,0x18},
+};
+
+static const PROGMEM uint8_t tick[16 * 16 / 8] =
+{0x00,0x80,0xC0,0xE0,0xC0,0x80,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x78,0x30,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x1F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00};
+
+static const PROGMEM uint8_t cross[16 * 16 / 8] =
+{0x00,0x0C,0x1C,0x3C,0x78,0xF0,0xE0,0xC0,0xE0,0xF0,0x78,0x3C,0x1C,0x0C,0x00,0x00,0x00,0x30,0x38,0x3C,0x1E,0x0F,0x07,0x03,0x07,0x0F,0x1E,0x3C,0x38,0x30,0x00,0x00};
diff --git a/megaloggerHD/megaloggerHD.ino b/megaloggerHD/megaloggerHD.ino
new file mode 100644
index 0000000..83987ad
--- /dev/null
+++ b/megaloggerHD/megaloggerHD.ino
@@ -0,0 +1,815 @@
+/*************************************************************************
+* Reference code for Freematics OBD-II UART Adapter
+* Works with Freematics OBD-II Telematics Advanced Kit
+* Visit http://freematics.com for more information
+* Distributed under BSD license
+* Written by Stanley Huang <support@freematics.com.au>
+*************************************************************************/
+
+#include <Arduino.h>
+#include <SPI.h>
+#include <Wire.h>
+#include <OBD.h>
+#include <MultiLCD.h>
+#include <TinyGPS.h>
+#include "config.h"
+#ifdef OBD_ADAPTER_I2C
+#include <I2Cdev.h>
+#include <MPU9150.h>
+#endif
+#if ENABLE_DATA_LOG
+#include <SD.h>
+#endif
+#include "Narcoleptic.h"
+#include "images.h"
+#include "datalogger.h"
+
+// logger states
+#define STATE_SD_READY 0x1
+#define STATE_OBD_READY 0x2
+#define STATE_GPS_CONNECTED 0x4
+#define STATE_GPS_READY 0x8
+#define STATE_MEMS_READY 0x10
+#define STATE_GUI_ON 0x20
+
+#if USE_GPS
+// GPS logging can only be enabled when there is additional hardware serial UART
+#define GPSUART Serial2
+TinyGPS gps;
+#endif
+
+
+static uint8_t lastFileSize = 0;
+static uint32_t lastRefreshTime = 0;
+static uint32_t distance = 0;
+static uint32_t startTime = 0;
+static uint16_t lastSpeed = 0;
+static uint32_t lastSpeedTime = 0;
+static uint32_t gpsDate = 0;
+static uint32_t lastMemsDataTime = 0;
+#if USE_GPS
+static uint32_t lastGPSDataTime = 0;
+static int gpsSpeed = -1;
+#endif
+
+#ifdef OBD_ADAPTER_I2C
+MPU6050 accelgyro;
+#endif
+
+byte state = 0;
+
+void processMEMS();
+void processGPS();
+
+CDataLogger logger;
+
+#ifdef OBD_ADAPTER_I2C
+class CMyOBD : public COBDI2C
+#else
+class CMyOBD : public COBD
+#endif
+{
+public:
+ void dataIdleLoop()
+ {
+ if (!(state & STATE_GUI_ON)) {
+ delay(10);
+ return;
+ }
+
+#if USE_GPS
+ uint32_t t = millis();
+ while (GPSUART.available() && millis() - t < MAX_GPS_PROCESS_TIME) {
+ processGPS();
+ }
+#endif
+ }
+};
+
+CMyOBD obd;
+
+void setColorByValue(int value, int threshold1, int threshold2, int threshold3)
+{
+ if (value < 0) value = -value;
+ if (value < threshold1) {
+ lcd.setColor(RGB16_WHITE);
+ } else if (value < threshold2) {
+ byte n = (uint32_t)(threshold2 - value) * 255 / (threshold2 - threshold1);
+ lcd.setColor(255, 255, n);
+ } else if (value < threshold3) {
+ byte n = (uint32_t)(threshold3 - value) * 255 / (threshold3 - threshold2);
+ lcd.setColor(255, n, 0);
+ } else {
+ lcd.setColor(255, 0, 0);
+ }
+}
+
+void showPIDData(byte pid, int value)
+{
+ char buf[8];
+ switch (pid) {
+ case PID_RPM:
+ lcd.setFontSize(FONT_SIZE_XLARGE);
+ lcd.setCursor(14, 8);
+ if (value >= 10000) break;
+ setColorByValue(value, 2500, 3500, 5000);
+ lcd.printInt(value, 6);
+ break;
+ case PID_SPEED:
+ if (value < 1000) {
+ lcd.setFontSize(FONT_SIZE_XLARGE);
+ lcd.setCursor(50,3);
+ setColorByValue(value, 60, 100, 160);
+ lcd.printInt(value, 3);
+
+#if USE_GPS
+ if (gpsSpeed != -1) {
+ lcd.setFontSize(FONT_SIZE_SMALL);
+ lcd.setCursor(110, 3);
+ lcd.setColor(RGB16_YELLOW);
+ int diff = gpsSpeed - value;
+ if (diff >= 0) {
+ lcd.write('+');
+ lcd.printInt(diff);
+ } else {
+ lcd.write('-');
+ lcd.printInt(-diff);
+ }
+ lcd.write(' ');
+ }
+#endif
+ }
+ break;
+ case PID_ENGINE_LOAD:
+ lcd.setFontSize(FONT_SIZE_XLARGE);
+ lcd.setCursor(50, 13);
+ if (value >= 100) value = 99;
+ setColorByValue(value, 75, 80, 100);
+ lcd.printInt(value, 3);
+ break;
+ case PID_THROTTLE:
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(102, 27);
+ if (value >= 100) value = 99;
+ setColorByValue(value, 50, 75, 100);
+ lcd.printInt(value, 2);
+ break;
+ case PID_ENGINE_FUEL_RATE:
+ if (value < 100) {
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(102, 30);
+ lcd.printInt(value, 2);
+ }
+ break;
+ case PID_INTAKE_TEMP:
+ if (value >= 0 && value < 100) {
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(102, 34);
+ lcd.printInt(value, 2);
+ }
+ break;
+ }
+ lcd.setColor(RGB16_WHITE);
+}
+
+void fadeOutScreen()
+{
+ // fade out backlight
+ for (int n = 254; n >= 0; n--) {
+ lcd.setBackLight(n);
+ delay(3);
+ }
+}
+
+void fadeInScreen()
+{
+ for (int n = 1; n <= 255; n++) {
+ lcd.setBackLight(n);
+ delay(6);
+ }
+}
+
+void initScreen()
+{
+ lcd.clear();
+ lcd.draw2x(frame0[0], 78, 78);
+ lcd.setXY(162, 0);
+ lcd.draw2x(frame0[0], 78, 78);
+ lcd.setXY(324, 0);
+ lcd.draw2x(frame0[0], 78, 78);
+ lcd.setXY(0, 164);
+ lcd.draw2x(frame0[0], 78, 78);
+ lcd.setXY(162, 164);
+ lcd.draw2x(frame0[0], 78, 78);
+ lcd.setXY(324, 164);
+ lcd.draw2x(frame0[0], 78, 78);
+
+ lcd.setColor(RGB16_CYAN);
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(110,4);
+ lcd.print("kph");
+ lcd.setCursor(110, 9);
+ lcd.print("RPM");
+ lcd.setFontSize(FONT_SIZE_SMALL);
+ lcd.setCursor(110, 14);
+ lcd.print("ENGINE");
+ lcd.setCursor(110, 15);
+ lcd.print("LOAD %");
+
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(208, 3);
+ lcd.print("Elapsed");
+ lcd.setCursor(204, 8);
+ lcd.print("Distance");
+ lcd.setCursor(180, 13);
+ lcd.print("Average Speed");
+
+ lcd.setCursor(16, 24);
+ lcd.print("Battery V");
+ lcd.setCursor(16, 27);
+ lcd.print("Throttle %");
+ lcd.setCursor(16, 30);
+ lcd.print("Fuel L/h");
+ lcd.setCursor(16, 33);
+ lcd.print("Intake: C");
+
+ lcd.setCursor(180, 24);
+ lcd.print("UTC:");
+ lcd.setCursor(180, 27);
+ lcd.print("LAT:");
+ lcd.setCursor(180, 30);
+ lcd.print("LNG:");
+ lcd.setCursor(180, 33);
+ lcd.print("ALT:");
+ lcd.setCursor(180, 36);
+ lcd.print("SAT:");
+
+ lcd.setCursor(340, 3);
+ lcd.print("Accelerometer");
+ lcd.setCursor(356, 8);
+ lcd.print("Gyroscope");
+
+ lcd.setCursor(348, 24);
+ lcd.print("OBD Interval");
+
+ lcd.setCursor(348, 29);
+ lcd.print("GPS Interval");
+
+ lcd.setCursor(352, 34);
+ lcd.print("Data Size");
+
+ //lcd.setColor(0xFFFF);
+ /*
+ lcd.setCursor(32, 4);
+ lcd.print("%");
+ lcd.setCursor(68, 5);
+ lcd.print("Intake Air");
+ lcd.setCursor(112, 4);
+ lcd.print("C");
+ */
+
+ state |= STATE_GUI_ON;
+
+ fadeInScreen();
+}
+
+#if ENABLE_DATA_LOG
+bool checkSD()
+{
+ Sd2Card card;
+ SdVolume volume;
+ state &= ~STATE_SD_READY;
+ pinMode(SS, OUTPUT);
+
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ if (card.init(SPI_HALF_SPEED, SD_CS_PIN)) {
+ const char* type;
+ switch(card.type()) {
+ case SD_CARD_TYPE_SD1:
+ type = "SD1";
+ break;
+ case SD_CARD_TYPE_SD2:
+ type = "SD2";
+ break;
+ case SD_CARD_TYPE_SDHC:
+ type = "SDHC";
+ break;
+ default:
+ type = "SDx";
+ }
+
+ lcd.print(type);
+ lcd.write(' ');
+ if (!volume.init(card)) {
+ lcd.print("No FAT!");
+ return false;
+ }
+
+ uint32_t volumesize = volume.blocksPerCluster();
+ volumesize >>= 1; // 512 bytes per block
+ volumesize *= volume.clusterCount();
+ volumesize >>= 10;
+
+ lcd.print((int)volumesize);
+ lcd.print("MB");
+ } else {
+ lcd.println("No SD Card");
+ return false;
+ }
+
+ if (!SD.begin(SD_CS_PIN)) {
+ lcd.println("Bad SD");
+ return false;
+ }
+
+ state |= STATE_SD_READY;
+ return true;
+}
+#endif
+
+#if USE_GPS
+void processGPS()
+{
+ // process GPS data
+ char c = GPSUART.read();
+ if (!gps.encode(c))
+ return;
+
+ // parsed GPS data is ready
+ uint32_t time;
+ uint32_t date;
+
+ logger.dataTime = millis();
+
+ gps.get_datetime(&date, &time, 0);
+ if (date != gpsDate) {
+ // log date only if it's changed and valid
+ int year = date % 100;
+ if (date < 1000000 && date >= 10000 && year >= 15 && (gpsDate == 0 || year - (gpsDate % 100) <= 1)) {
+ logger.logData(PID_GPS_DATE, (int32_t)date);
+ gpsDate = date;
+ }
+ }
+ logger.logData(PID_GPS_TIME, (int32_t)time);
+
+ int32_t lat, lng;
+ gps.get_position(&lat, &lng, 0);
+
+ byte sat = gps.satellites();
+
+ // show GPS data interval
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ if (lastGPSDataTime) {
+ lcd.setCursor(380, 31);
+ lcd.printInt((uint16_t)logger.dataTime - lastGPSDataTime);
+ lcd.print("ms");
+ lcd.printSpace(2);
+ }
+
+ // keep current data time as last GPS time
+ lastGPSDataTime = logger.dataTime;
+
+ // display UTC date/time
+ lcd.setFontSize(FONT_SIZE_SMALL);
+ lcd.setCursor(216, 24);
+ lcd.setFlags(FLAG_PAD_ZERO);
+ lcd.printLong(date, 6);
+ lcd.setCursor(216, 25);
+ lcd.printLong(time, 8);
+
+ // display latitude
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(216, 27);
+ lcd.print((float)lat / 100000, 5);
+ // display longitude
+ lcd.setCursor(216, 30);
+ lcd.print((float)lng / 100000, 5);
+ // log latitude/longitude
+ logger.logData(PID_GPS_LATITUDE, lat);
+ logger.logData(PID_GPS_LONGITUDE, lng);
+
+ // display altitude
+ int32_t alt = gps.altitude();
+ lcd.setFlags(0);
+ if (alt > -1000000 && alt < 1000000) {
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(216, 33);
+ lcd.print(alt / 100);
+ lcd.print("m ");
+ }
+ // log altitude
+ logger.logData(PID_GPS_ALTITUDE, (int)(alt / 100));
+
+ // display number of satellites
+ if (sat < 100) {
+ lcd.setCursor(216, 36);
+ lcd.printInt(sat);
+ lcd.write(' ');
+ }
+
+ // only log these data when satellite status is good
+ if (sat >= 3) {
+ gpsSpeed = gps.speed() * 1852 / 100000;
+ logger.logData(PID_GPS_SPEED, gpsSpeed);
+ }
+}
+#endif
+
+void processMEMS()
+{
+ int ax = 0, ay = 0, az = 0;
+ int gx = 0, gy = 0, gz = 0;
+
+ if (logger.dataTime - lastMemsDataTime < ACC_DATA_INTERVAL) {
+ return;
+ }
+
+#ifdef OBD_ADAPTER_I2C
+ accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
+#else
+ obd.readAccel(ax, ay, az);
+ obd.readGyro(gx, gy, gz);
+#endif
+
+ logger.dataTime = millis();
+
+ ax /= ACC_DATA_RATIO;
+ ay /= ACC_DATA_RATIO;
+ az /= ACC_DATA_RATIO;
+ gx /= GYRO_DATA_RATIO;
+ gy /= GYRO_DATA_RATIO;
+ gz /= GYRO_DATA_RATIO;
+
+ // display MEMS data
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(362, 5);
+ setColorByValue(ax, 50, 100, 200);
+ lcd.print(ax);
+ setColorByValue(ay, 50, 100, 200);
+ lcd.write('/');
+ lcd.print(ay);
+ setColorByValue(az, 50, 100, 200);
+ lcd.write('/');
+ lcd.print(az);
+ Serial.println(az);
+ lcd.printSpace(8);
+
+ // display gyro data
+ lcd.setCursor(374, 10);
+ lcd.setColor(RGB16_WHITE);
+ lcd.print(gx);
+ lcd.write('/');
+ lcd.print(gy);
+ lcd.write('/');
+ lcd.print(gz);
+ lcd.printSpace(8);
+
+ // log x/y/z of accelerometer
+ logger.logData(PID_ACC, ax, ay, az);
+ // log x/y/z of gyro meter
+ logger.logData(PID_GYRO, gx, gy, gz);
+
+ lastMemsDataTime = logger.dataTime;
+}
+
+void logOBDData(byte pid, int value)
+{
+ char buffer[64];
+ // send query for OBD-II PID
+ logger.dataTime = millis();
+ // display data
+ showPIDData(pid, value);
+
+ // log data to SD card
+ logger.logData(0x100 | pid, value);
+
+ if (pid == PID_SPEED) {
+ // estimate distance travelled since last speed update
+ distance += (uint32_t)(value + lastSpeed) * (logger.dataTime - lastSpeedTime) / 6000;
+ // display speed
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(220, 10);
+ lcd.printInt(distance / 1000);
+ lcd.write('.');
+ lcd.printInt(((uint16_t)distance % 1000) / 100);
+ lcd.print(" km");
+ // calculate and display average speed
+ int avgSpeed = (unsigned long)distance * 3600 / (millis() - startTime);
+ lcd.setCursor(220, 15);
+ lcd.printInt(avgSpeed);
+ lcd.print(" km/h");
+
+ lastSpeed = value;
+ lastSpeedTime = logger.dataTime;
+ }
+#if ENABLE_DATA_LOG
+ // flush SD data every 1KB
+ byte dataSizeKB = logger.dataSize >> 10;
+ if (dataSizeKB != lastFileSize) {
+ logger.flushFile();
+ lastFileSize = dataSizeKB;
+ // display logged data size
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(380, 36);
+ lcd.print((unsigned int)(logger.dataSize >> 10));
+ lcd.print("KB");
+ }
+#endif
+}
+
+void showECUCap()
+{
+ static const byte PROGMEM pidlist[] = {PID_ENGINE_LOAD, PID_COOLANT_TEMP, PID_FUEL_PRESSURE, PID_INTAKE_MAP, PID_RPM, PID_SPEED, PID_TIMING_ADVANCE, PID_INTAKE_TEMP, PID_MAF_FLOW, PID_THROTTLE, PID_AUX_INPUT,
+ PID_EGR_ERROR, PID_COMMANDED_EVAPORATIVE_PURGE, PID_FUEL_LEVEL, PID_CONTROL_MODULE_VOLTAGE, PID_ABSOLUTE_ENGINE_LOAD, PID_AMBIENT_TEMP, PID_COMMANDED_THROTTLE_ACTUATOR, PID_ETHANOL_FUEL,
+ PID_FUEL_RAIL_PRESSURE};
+
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setColor(RGB16_WHITE);
+ for (byte i = 0, n = 0; i < sizeof(pidlist) / sizeof(pidlist[0]); i++) {
+ byte pid = pgm_read_byte(pidlist + i);
+ if (obd.isValidPID(pid)) {
+ lcd.setCursor(348, n);
+ n += 2;
+ lcd.write('0');
+ lcd.print((int)pid | 0x100, HEX);
+ }
+ }
+ int values[sizeof(pidlist)];
+ bool scanned = false;
+ bool touched = false;
+ for (uint32_t t = millis(); millis() - t < 5000; ) {
+ for (byte i = 0, n = 0; i < sizeof(pidlist) / sizeof(pidlist[0]); i++) {
+ byte pid = pgm_read_byte(pidlist + i);
+ if (obd.isValidPID(pid)) {
+ int value;
+ lcd.setCursor(400 , n);
+ n += 2;
+ if (obd.readPID(pid, value)) {
+ if (!scanned || value == values[i])
+ lcd.setColor(RGB16_CYAN);
+ else if (value > values[i])
+ lcd.setColor(RGB16_GREEN);
+ else
+ lcd.setColor(RGB16_RED);
+ byte n = lcd.print(value);
+ for (; n < 4; n++) lcd.print(' ');
+ values[i] = value;
+ } else {
+ lcd.setColor(RGB16_YELLOW);
+ lcd.print("N/A");
+ }
+ }
+ }
+ scanned = true;
+ }
+}
+
+void reconnect()
+{
+ fadeOutScreen();
+#if ENABLE_DATA_LOG
+ logger.closeFile();
+#endif
+ lcd.clear();
+ state &= ~(STATE_OBD_READY | STATE_GUI_ON);
+ //digitalWrite(SD_CS_PIN, LOW);
+ for (;;) {
+ if (!obd.init())
+ continue;
+
+ int value;
+ if (obd.readPID(PID_RPM, value))
+ break;
+
+ obd.sleep();
+ Narcoleptic.delay(4000);
+ }
+ // re-initialize
+ state |= STATE_OBD_READY;
+ startTime = millis();
+ lastSpeedTime = startTime;
+ lastSpeed = 0;
+ distance = 0;
+#if ENABLE_DATA_LOG
+ logger.openFile();
+#endif
+ initScreen();
+}
+
+// screen layout related stuff
+void showStates()
+{
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setColor(RGB16_WHITE);
+ lcd.setCursor(0, 8);
+ lcd.print("MEMS ");
+ lcd.setColor((state & STATE_MEMS_READY) ? RGB16_GREEN : RGB16_RED);
+ lcd.draw((state & STATE_MEMS_READY) ? tick : cross, 16, 16);
+
+#if USE_GPS
+ lcd.setColor(RGB16_WHITE);
+ lcd.setCursor(60, 8);
+ lcd.print(" GPS ");
+ if (state & STATE_GPS_CONNECTED) {
+ lcd.setColor(RGB16_GREEN);
+ lcd.draw(tick, 16, 16);
+ } else {
+ lcd.setColor(RGB16_RED);
+ lcd.draw(cross, 16, 16);
+ }
+#endif
+ lcd.setColor(RGB16_WHITE);
+}
+
+void testOut()
+{
+ static const char PROGMEM cmds[][6] = {"ATZ\r", "ATL1\r", "ATRV\r", "0100\r", "010C\r", "0902\r"};
+ char buf[128];
+ lcd.setFontSize(FONT_SIZE_SMALL);
+ lcd.setCursor(0, 11);
+
+ for (byte i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) {
+ char cmd[6];
+ memcpy_P(cmd, cmds[i], sizeof(cmd));
+ lcd.setColor(RGB16_WHITE);
+ lcd.print("Sending ");
+ lcd.println(cmd);
+ Serial.println(cmd);
+ lcd.setColor(RGB16_CYAN);
+ if (obd.sendCommand(cmd, buf, sizeof(buf))) {
+ char *p = strstr(buf, cmd);
+ if (p)
+ p += strlen(cmd);
+ else
+ p = buf;
+ Serial.println(p);
+ while (*p == '\r') p++;
+ while (*p) {
+ lcd.write(*p);
+ if (*p == '\r' && *(p + 1) != '\r') {
+ lcd.write('\n');
+ }
+ p++;
+ }
+ } else {
+ lcd.println("Timeout");
+ Serial.println("Timeout");
+ }
+ delay(500);
+ }
+ lcd.println();
+}
+
+void setup()
+{
+ Serial.begin(115200);
+#if USE_GPS
+ GPSUART.begin(GPS_BAUDRATE);
+ lastGPSDataTime = 0;
+#endif
+ logger.initSender();
+
+ lcd.begin();
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setColor(0xFFE0);
+ lcd.println("MEGA LOGGER HD - OBD-II/GPS/MEMS");
+ lcd.println();
+ lcd.setColor(RGB16_WHITE);
+
+#if ENABLE_DATA_LOG
+ if (checkSD()) {
+ uint16_t index = logger.openFile();
+ lcd.println();
+ if (index > 0) {
+ lcd.print("File ID:");
+ lcd.println(index);
+ } else {
+ lcd.println("No File");
+ }
+ }
+#endif
+
+ obd.begin();
+ lcd.print("Adapter Ver. ");
+ lcd.print(obd.version / 10);
+ lcd.print('.');
+ lcd.println(obd.version % 10);
+
+#ifdef OBD_ADAPTER_I2C
+ Wire.begin();
+ accelgyro.initialize();
+ if (accelgyro.testConnection()) state |= STATE_MEMS_READY;
+#else
+ if (obd.version > 10)
+ state |= STATE_MEMS_READY;
+#endif
+
+ showStates();
+
+#if USE_GPS
+ unsigned long t = millis();
+ do {
+ if (GPSUART.available() && GPSUART.read() == '\r') {
+ state |= STATE_GPS_CONNECTED;
+ break;
+ }
+ } while (millis() - t <= 2000);
+ showStates();
+#endif
+
+ // this will send a bunch of commands and display response
+ testOut();
+
+ // initialize the OBD until success
+ while (!obd.init(OBD_PROTOCOL));
+ state |= STATE_OBD_READY;
+
+ char buf[64];
+ if (obd.getVIN(buf, sizeof(buf))) {
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setColor(RGB16_WHITE);
+ lcd.print("VIN:");
+ lcd.setColor(RGB16_YELLOW);
+ lcd.println(buf);
+ }
+
+ showECUCap();
+ lcd.setCursor(0, 28);
+ lcd.setColor(RGB16_YELLOW);
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+
+ fadeOutScreen();
+ initScreen();
+
+ startTime = millis();
+ lastSpeedTime = startTime;
+ lastRefreshTime = millis();
+}
+
+
+void loop()
+{
+ static byte index2 = 0;
+ const byte pids[]= {PID_RPM, PID_SPEED, PID_THROTTLE, PID_ENGINE_LOAD};
+ const byte pids2[] = {PID_COOLANT_TEMP, PID_INTAKE_TEMP, PID_ENGINE_FUEL_RATE};
+ int values[sizeof(pids)] = {0};
+ uint32_t pidTime = millis();
+ // read multiple OBD-II PIDs
+ byte results = obd.readPID(pids, sizeof(pids), values);
+ pidTime = millis() - pidTime;
+ if (results == sizeof(pids)) {
+ for (byte n = 0; n < sizeof(pids); n++) {
+ logOBDData(pids[n], values[n]);
+ }
+ }
+ byte pid = pids2[index2 = (index2 + 1) % sizeof(pids2)];
+ // check validation and read a single OBD-II PID
+ if (obd.isValidPID(pid)) {
+ int value;
+ if (obd.readPID(pid, value)) {
+ logOBDData(pid, value);
+ }
+ }
+
+ if (state & STATE_MEMS_READY) {
+ processMEMS();
+ }
+
+ if (logger.dataTime - lastRefreshTime >= 1000) {
+ float v = obd.getVoltage();
+ if (v > 0) {
+ lcd.setCursor(84, 24);
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.print(v, 1);
+ }
+
+ char buf[12];
+ // display elapsed time
+ unsigned int sec = (logger.dataTime - startTime) / 1000;
+ sprintf(buf, "%02u:%02u", sec / 60, sec % 60);
+ lcd.setFontSize(FONT_SIZE_MEDIUM);
+ lcd.setCursor(220, 5);
+ lcd.print(buf);
+ // display OBD time
+ if (results) {
+ lcd.setCursor(380, 26);
+ lcd.print((uint16_t)(pidTime / results));
+ lcd.print("ms ");
+ }
+ lastRefreshTime = logger.dataTime;
+ }
+
+ if (obd.errors >= 3) {
+ reconnect();
+ }
+
+#if USE_GPS
+ if (millis() - lastGPSDataTime > GPS_DATA_TIMEOUT || gps.satellites() < 3) {
+ // GPS not ready
+ state &= ~STATE_GPS_READY;
+ } else {
+ // GPS ready
+ state |= STATE_GPS_READY;
+ }
+#endif
+}